* fork-child.c (startup_inferior): Use target_wait and target_resume
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 11 Sep 2008 16:09:33 +0000 (16:09 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Thu, 11 Sep 2008 16:09:33 +0000 (16:09 +0000)
directly instead of calling wait_for_inferior / resume.

* infcmd.c (kill_if_already_running): Do not call no_shared_libraries
or init_wait_for_inferior.
(run_command_1): Call init_wait_for_inferior.

gdb/ChangeLog
gdb/fork-child.c
gdb/infcmd.c

index 4dec4ac438a6f49a9893e9d63548d6142db0db17..2b44bfb81c579324c6e18bca1b1da396b9c5061c 100644 (file)
@@ -1,3 +1,12 @@
+2008-09-11  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * fork-child.c (startup_inferior): Use target_wait and target_resume
+       directly instead of calling wait_for_inferior / resume.
+
+       * infcmd.c (kill_if_already_running): Do not call no_shared_libraries
+       or init_wait_for_inferior.
+       (run_command_1): Call init_wait_for_inferior.
+
 2008-09-11  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gdbtypes.h (builtin_type_void_data_ptr, builtin_type_void_func_ptr,
index 269dd4319efcfb82f443ded20849f31f070fb38a..d850792cb6836009f9f3759b6dcd94a3dfe3c668 100644 (file)
@@ -428,24 +428,67 @@ startup_inferior (int ntraps)
   if (exec_wrapper)
     pending_execs++;
 
-  clear_proceed_status ();
-
-  init_wait_for_inferior ();
-
   while (1)
     {
-      struct thread_info *tp;
+      int resume_signal = TARGET_SIGNAL_0;
+      ptid_t resume_ptid;
+
+      struct target_waitstatus ws;
+      memset (&ws, 0, sizeof (ws));
+      resume_ptid = target_wait (pid_to_ptid (-1), &ws);
+
+      /* Mark all threads non-executing.  */
+      set_executing (pid_to_ptid (-1), 0);
+
+      /* In all-stop mode, resume all threads.  */
+      if (!non_stop)
+       resume_ptid = pid_to_ptid (-1);
+
+      switch (ws.kind)
+       {
+         case TARGET_WAITKIND_IGNORE:
+         case TARGET_WAITKIND_SPURIOUS:
+         case TARGET_WAITKIND_LOADED:
+         case TARGET_WAITKIND_FORKED:
+         case TARGET_WAITKIND_VFORKED:
+         case TARGET_WAITKIND_SYSCALL_ENTRY:
+         case TARGET_WAITKIND_SYSCALL_RETURN:
+           /* Ignore gracefully during startup of the inferior.  */
+           break;
+
+         case TARGET_WAITKIND_SIGNALLED:
+           target_terminal_ours ();
+           target_mourn_inferior ();
+           error (_("During startup program terminated with signal %s, %s."),
+                  target_signal_to_name (ws.value.sig),
+                  target_signal_to_string (ws.value.sig));
+           return;
+
+         case TARGET_WAITKIND_EXITED:
+           target_terminal_ours ();
+           target_mourn_inferior ();
+           if (ws.value.integer)
+             error (_("During startup program exited with code %d."),
+                    ws.value.integer);
+           else
+             error (_("During startup program exited normally."));
+           return;
+
+         case TARGET_WAITKIND_EXECD:
+           /* Handle EXEC signals as if they were SIGTRAP signals.  */
+           xfree (ws.value.execd_pathname);
+           resume_signal = TARGET_SIGNAL_TRAP;
+           break;
+
+         case TARGET_WAITKIND_STOPPED:
+           resume_signal = ws.value.sig;
+           break;
+       }
 
-      /* Make wait_for_inferior be quiet. */
-      stop_soon = STOP_QUIETLY;
-      wait_for_inferior (1);
-      tp = inferior_thread ();
-      if (tp->stop_signal != TARGET_SIGNAL_TRAP)
+      if (resume_signal != TARGET_SIGNAL_TRAP)
        {
-         /* Let shell child handle its own signals in its own way.
-            FIXME: what if child has exited?  Must exit loop
-            somehow.  */
-         resume (0, tp->stop_signal);
+         /* Let shell child handle its own signals in its own way.  */
+         target_resume (resume_ptid, 0, resume_signal);
        }
       else
        {
@@ -470,10 +513,10 @@ startup_inferior (int ntraps)
          if (--pending_execs == 0)
            break;
 
-         resume (0, TARGET_SIGNAL_0);  /* Just make it go on.  */
+         /* Just make it go on.  */
+         target_resume (resume_ptid, 0, TARGET_SIGNAL_0);
        }
     }
-  stop_soon = NO_STOP_QUIETLY;
 }
 
 /* Implement the "unset exec-wrapper" command.  */
index ca11aa5fb45eca0c60a23252f1aa98b0a9cb88ac..6ffc97f307e38025e3656193c8ffdee23cd25c35 100644 (file)
@@ -431,8 +431,6 @@ kill_if_already_running (int from_tty)
 Start it from the beginning? "))
        error (_("Program not restarted."));
       target_kill ();
-      no_shared_libraries (NULL, from_tty);
-      init_wait_for_inferior ();
     }
 }
 
@@ -448,6 +446,8 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main)
   dont_repeat ();
 
   kill_if_already_running (from_tty);
+
+  init_wait_for_inferior ();
   clear_breakpoint_hit_counts ();
 
   /* Clean up any leftovers from other runs.  Some other things from