* linux-low.c (linux_wait_1): Don't set last_status here.
authorPedro Alves <palves@redhat.com>
Wed, 25 Aug 2010 16:27:05 +0000 (16:27 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 25 Aug 2010 16:27:05 +0000 (16:27 +0000)
* server.c (push_event, queue_stop_reply_callback): Assert we're
not pushing a TARGET_WAITKIND_IGNORE event.
(start_inferior, start_inferior, attach_inferior, handle_v_cont)
(myresume, handle_target_event): Set the thread's last_resume_kind
and last_status from the target returned status.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/server.c

index 6e6127e92b0e9f38e0ac5eaed1c618084c804787..f138ec6a36c973dabcea0f420dc1fbf09f57c0ed 100644 (file)
@@ -1,3 +1,12 @@
+2010-08-25  Pedro Alves  <pedro@codesourcery.com>
+
+       * linux-low.c (linux_wait_1): Don't set last_status here.
+       * server.c (push_event, queue_stop_reply_callback): Assert we're
+       not pushing a TARGET_WAITKIND_IGNORE event.
+       (start_inferior, start_inferior, attach_inferior, handle_v_cont)
+       (myresume, handle_target_event): Set the thread's last_resume_kind
+       and last_status from the target returned status.
+
 2010-08-25  Pedro Alves  <pedro@codesourcery.com>
 
        PR threads/10729
index 22d8eb12cf196d784780b0d5dc7ee1a689971499..b92e987d691c6baaa5bdf4210364aa8a6f3146f2 100644 (file)
@@ -2391,9 +2391,6 @@ Check if we're already there.\n",
             ourstatus->kind,
             ourstatus->value.sig);
 
-  if (!stabilizing_threads)
-    current_inferior->last_status = *ourstatus;
-
   return ptid_of (event_child);
 }
 
index 529203465cca989b1a08fab47dd15614cf69bb3f..9e87b20ae4eaa4438b841de7b906b9ed1e578b2b 100644 (file)
@@ -158,6 +158,8 @@ queue_stop_reply (ptid_t ptid, struct target_waitstatus *status)
 void
 push_event (ptid_t ptid, struct target_waitstatus *status)
 {
+  gdb_assert (status->kind != TARGET_WAITKIND_IGNORE);
+
   queue_stop_reply (ptid, status);
 
   /* If this is the first stop reply in the queue, then inform GDB
@@ -292,9 +294,14 @@ start_inferior (char **argv)
          mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
          if (last_status.kind != TARGET_WAITKIND_STOPPED)
            return signal_pid;
+
+         current_inferior->last_resume_kind = resume_stop;
+         current_inferior->last_status = last_status;
        }
       while (last_status.value.sig != TARGET_SIGNAL_TRAP);
 
+      current_inferior->last_resume_kind = resume_stop;
+      current_inferior->last_status = last_status;
       return signal_pid;
     }
 
@@ -302,6 +309,13 @@ start_inferior (char **argv)
      (assuming success).  */
   last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
 
+  if (last_status.kind != TARGET_WAITKIND_EXITED
+      && last_status.kind != TARGET_WAITKIND_SIGNALLED)
+    {
+      current_inferior->last_resume_kind = resume_stop;
+      current_inferior->last_status = last_status;
+    }
+
   return signal_pid;
 }
 
@@ -332,6 +346,9 @@ attach_inferior (int pid)
       if (last_status.kind == TARGET_WAITKIND_STOPPED
          && last_status.value.sig == TARGET_SIGNAL_STOP)
        last_status.value.sig = TARGET_SIGNAL_TRAP;
+
+      current_inferior->last_resume_kind = resume_stop;
+      current_inferior->last_status = last_status;
     }
 
   return 0;
@@ -1780,6 +1797,10 @@ handle_v_cont (char *own_buf)
     {
       last_ptid = mywait (minus_one_ptid, &last_status, 0, 1);
 
+      if (last_status.kind != TARGET_WAITKIND_EXITED
+          && last_status.kind != TARGET_WAITKIND_SIGNALLED)
+       current_inferior->last_status = last_status;
+
       /* From the client's perspective, all-stop mode always stops all
         threads implicitly (and the target backend has already done
         so by now).  Tag all threads as "want-stopped", so we don't
@@ -2089,6 +2110,14 @@ myresume (char *own_buf, int step, int sig)
   else
     {
       last_ptid = mywait (minus_one_ptid, &last_status, 0, 1);
+
+      if (last_status.kind != TARGET_WAITKIND_EXITED
+          && last_status.kind != TARGET_WAITKIND_SIGNALLED)
+       {
+         current_inferior->last_resume_kind = resume_stop;
+         current_inferior->last_status = last_status;
+       }
+
       prepare_resume_reply (own_buf, last_ptid, &last_status);
       disable_async_io ();
 
@@ -2128,6 +2157,8 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
                     target_pid_to_str (entry->id),
                     target_waitstatus_to_string (&thread->last_status));
 
+         gdb_assert (thread->last_status.kind != TARGET_WAITKIND_IGNORE);
+
          /* Pass the last stop reply back to GDB, but don't notify
             yet.  */
          queue_stop_reply (entry->id, &thread->last_status);
@@ -3135,10 +3166,13 @@ handle_target_event (int err, gdb_client_data client_data)
          mourn_inferior (process);
        }
       else
-       /* We're reporting this thread as stopped.  Update it's
-          "want-stopped" state to what the client wants, until it gets
-          a new resume action.  */
-       gdb_wants_thread_stopped (&current_inferior->entry);
+       {
+         /* We're reporting this thread as stopped.  Update its
+            "want-stopped" state to what the client wants, until it
+            gets a new resume action.  */
+         current_inferior->last_resume_kind = resume_stop;
+         current_inferior->last_status = last_status;
+       }
 
       if (forward_event)
        {