public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: [gdbserver 2/N] move a bit of code from the linux backend to common code
Date: Wed, 25 Aug 2010 16:26:00 -0000	[thread overview]
Message-ID: <201008251726.26559.pedro@codesourcery.com> (raw)
In-Reply-To: <201008091604.36329.pedro@codesourcery.com>

On Monday 09 August 2010 16:04:36, Pedro Alves wrote:
> This moves a bit of code from the linux backend to gdbserver's common code,
> since #1, this is state that all backends would need for non-stop support;
> #2, it should be possible to move the transparent step-over-breakpoints
> support to common code 

And here's a follow up, continuing the trend.

The main bit here is having linux_wait not need to know about the
stabilizing_threads global.

Tested on x86_64-linux, and applied.

-- 
Pedro Alves

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.

---
 gdb/gdbserver/linux-low.c |    3 ---
 gdb/gdbserver/server.c    |   42 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 7 deletions(-)

Index: src/gdb/gdbserver/linux-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-low.c	2010-08-25 15:20:55.000000000 +0100
+++ src/gdb/gdbserver/linux-low.c	2010-08-25 17:04:42.000000000 +0100
@@ -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: src/gdb/gdbserver/server.c
===================================================================
--- src.orig/gdb/gdbserver/server.c	2010-08-24 20:51:14.000000000 +0100
+++ src/gdb/gdbserver/server.c	2010-08-25 17:04:42.000000000 +0100
@@ -158,6 +158,8 @@ queue_stop_reply (ptid_t ptid, struct ta
 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 s
   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 inferi
 		     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
 	  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)
 	{

      reply	other threads:[~2010-08-25 16:26 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-09 15:04 [gdbserver] " Pedro Alves
2010-08-25 16:26 ` Pedro Alves [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201008251726.26559.pedro@codesourcery.com \
    --to=pedro@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).