* linux-fork.c: Include "gdb_assert.h".
authorDaniel Jacobowitz <drow@false.org>
Fri, 24 Mar 2006 22:44:05 +0000 (22:44 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 24 Mar 2006 22:44:05 +0000 (22:44 +0000)
(fork_load_infrun_state): Set inferior_ptid and stop_pc here.
Update the register cache and selected frame also.
(linux_fork_mourn_inferior): Use fork_load_infrun_state.  Return
to single fork mode if necessary.
(linux_fork_context): Remove bits handled by fork_load_infrun_state.
* Makefile.in (linux_fork_h): New.
(linux-fork.o, linux-nat.o): Update.

gdb/ChangeLog
gdb/Makefile.in
gdb/linux-fork.c

index 43b76df500f4dbf0ae48b8a8474df9420a3725f5..bf4c68d0adcc00832275966c7b9ffc008fd6a4d2 100644 (file)
@@ -1,3 +1,14 @@
+2006-03-24  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * linux-fork.c: Include "gdb_assert.h".
+       (fork_load_infrun_state): Set inferior_ptid and stop_pc here.
+       Update the register cache and selected frame also.
+       (linux_fork_mourn_inferior): Use fork_load_infrun_state.  Return
+       to single fork mode if necessary.
+       (linux_fork_context): Remove bits handled by fork_load_infrun_state.
+       * Makefile.in (linux_fork_h): New.
+       (linux-fork.o, linux-nat.o): Update.
+
 2006-03-23  Andreas Schwab  <schwab@suse.de>
 
        * config/s390/s390.mh (NATDEPFILES): Add linux-fork.o.
index f0661243c78083ff79d8e2a5d540d5ae9326142f..29aa218a37a123f5bdf96c1c655b0a515e15596c 100644 (file)
@@ -726,6 +726,7 @@ kod_h = kod.h
 language_h = language.h
 libunwind_frame_h = libunwind-frame.h $(libunwind_h)
 linespec_h = linespec.h
+linux_fork_h = linux-fork.h
 linux_nat_h = linux-nat.h $(target_h)
 m2_lang_h = m2-lang.h
 m32r_tdep_h = m32r-tdep.h
@@ -2188,12 +2189,13 @@ linespec.o: linespec.c $(defs_h) $(symtab_h) $(frame_h) $(command_h) \
        $(symfile_h) $(objfiles_h) $(source_h) $(demangle_h) $(value_h) \
        $(completer_h) $(cp_abi_h) $(parser_defs_h) $(block_h) \
        $(objc_lang_h) $(linespec_h) $(exceptions_h)
-linux-fork.o: linux-fork.c linux-fork.h $(defs_h) $(inferior_h) \
-       $(regcache_h) $(gdbcmd_h) $(infcall_h)
+linux-fork.o: linux-fork.c $(defs_h) $(inferior_h) $(regcache_h) $(gdbcmd_h) \
+       $(infcall_h) $(gdb_assert_h) $(gdb_string_h) $(linux_fork_h)
 linux-nat.o: linux-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdb_string_h) \
        $(gdb_wait_h) $(gdb_assert_h) $(linux_nat_h) $(gdbthread_h) \
        $(gdbcmd_h) $(regcache_h) $(inf_ptrace.h) $(auxv.h) $(elf_bfd_h) \
-       $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) linux-fork.h
+       $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) \
+       $(linux_fork_h)
 linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \
        $(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \
        $(gdbthread_h) $(inferior_h) $(symfile_h) $(objfiles_h) $(target_h) \
index f024490d1f96dd701f266d1c1020cb7f07407d34..88bea6169ba94de41a7b9d1fd83b6cf0d348958c 100644 (file)
@@ -24,6 +24,7 @@
 #include "regcache.h"
 #include "gdbcmd.h"
 #include "infcall.h"
+#include "gdb_assert.h"
 #include "gdb_string.h"
 #include "linux-fork.h"
 
@@ -238,9 +239,19 @@ fork_load_infrun_state (struct fork_info *fp)
   extern void nullify_last_target_wait_ptid ();
   int i;
 
+  inferior_ptid = fp->ptid;
+
   if (fp->savedregs && fp->clobber_regs)
     regcache_cpy (current_regcache, fp->savedregs);
 
+  registers_changed ();
+  reinit_frame_cache ();
+
+  /* We must select a new frame before making any inferior calls to
+     avoid warnings.  */
+  select_frame (get_current_frame ());
+
+  stop_pc = read_pc ();
   nullify_last_target_wait_ptid ();
 
   /* Now restore the file positions of open file descriptors.  */
@@ -358,12 +369,19 @@ linux_fork_mourn_inferior (void)
      We need to delete that one from the fork_list, and switch
      to the next available fork.  */
   delete_fork (inferior_ptid);
-  if (fork_list)       /* Paranoia, shouldn't happen.  */
-    {
-      inferior_ptid = fork_list[0].ptid;
-      printf_filtered (_("[Switching to %s]\n"), 
-                      target_pid_to_str (inferior_ptid));
-    }
+
+  /* There should still be a fork - if there's only one left,
+     delete_fork won't remove it, because we haven't updated
+     inferior_ptid yet.  */
+  gdb_assert (fork_list);
+
+  fork_load_infrun_state (fork_list);
+  printf_filtered (_("[Switching to %s]\n"),
+                  target_pid_to_str (inferior_ptid));
+
+  /* If there's only one fork, switch back to non-fork mode.  */
+  if (fork_list->next == NULL)
+    delete_fork (inferior_ptid);
 }
 
 /* Fork list <-> user interface.  */
@@ -559,17 +577,10 @@ linux_fork_context (struct fork_info *newfp, int from_tty)
     error (_("No such fork/process"));
 
   if (!oldfp)
-    {
-      oldfp = add_fork (ptid_get_pid (inferior_ptid));
-    }
+    oldfp = add_fork (ptid_get_pid (inferior_ptid));
 
   fork_save_infrun_state (oldfp, 1);
-  inferior_ptid = newfp->ptid;
   fork_load_infrun_state (newfp);
-  registers_changed ();
-  reinit_frame_cache ();
-  stop_pc = read_pc ();
-  select_frame (get_current_frame ());
 
   printf_filtered (_("Switching to %s\n"), 
                   target_pid_to_str (inferior_ptid));