From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: [gdbserver] move a bit of code from the linux backend to common code
Date: Mon, 09 Aug 2010 15:04:00 -0000 [thread overview]
Message-ID: <201008091604.36329.pedro@codesourcery.com> (raw)
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 that's what I was considering, though
I ended up giving up on that for now).
Tested on x86_64-linux and checked in.
--
Pedro Alves
2010-08-09 Pedro Alves <pedro@codesourcery.com>
gdbserver/
* linux-low.c (gdb_wants_lwp_stopped): Delete.
(gdb_wants_all_stopped): Delete.
(linux_wait_1): Don't call them.
* server.c (handle_v_cont): Tag all threads as want-stopped.
(gdb_wants_thread_stopped): Fix comments. Tag the thread that
stopped as "client-wants-stopped".
---
gdb/gdbserver/linux-low.c | 48 +---------------------------------------------
gdb/gdbserver/server.c | 20 +++++++++++++++++--
2 files changed, 20 insertions(+), 48 deletions(-)
Index: src/gdb/gdbserver/linux-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-low.c 2010-08-06 13:18:46.000000000 +0100
+++ src/gdb/gdbserver/linux-low.c 2010-08-06 18:41:48.000000000 +0100
@@ -1809,24 +1809,6 @@ select_event_lwp (struct lwp_info **orig
}
}
-/* Set this inferior LWP's state as "want-stopped". We won't resume
- this LWP until the client gives us another action for it. */
-
-static void
-gdb_wants_lwp_stopped (struct inferior_list_entry *entry)
-{
- struct lwp_info *lwp = (struct lwp_info *) entry;
- struct thread_info *thread = get_lwp_thread (lwp);
-
- /* Most threads are stopped implicitly (all-stop); tag that with
- signal 0. The thread being explicitly reported stopped to the
- client, gets it's status fixed up afterwards. */
- thread->last_status.kind = TARGET_WAITKIND_STOPPED;
- thread->last_status.value.sig = TARGET_SIGNAL_0;
-
- thread->last_resume_kind = resume_stop;
-}
-
/* Decrement the suspend count of an LWP. */
static int
@@ -1853,14 +1835,6 @@ unsuspend_all_lwps (struct lwp_info *exc
find_inferior (&all_lwps, unsuspend_one_lwp, except);
}
-/* Set all LWP's states as "want-stopped". */
-
-static void
-gdb_wants_all_stopped (void)
-{
- for_each_inferior (&all_lwps, gdb_wants_lwp_stopped);
-}
-
static void move_out_of_jump_pad_callback (struct inferior_list_entry *entry);
static int stuck_in_jump_pad_callback (struct inferior_list_entry *entry,
void *data);
@@ -2389,8 +2363,6 @@ Check if we're already there.\n",
ourstatus->kind = TARGET_WAITKIND_STOPPED;
- /* Do this before the gdb_wants_all_stopped calls below, since they
- always set last_resume_kind to resume_stop. */
if (current_inferior->last_resume_kind == resume_stop
&& WSTOPSIG (w) == SIGSTOP)
{
@@ -2413,30 +2385,14 @@ Check if we're already there.\n",
gdb_assert (ptid_equal (step_over_bkpt, null_ptid));
- if (stabilizing_threads)
- return ptid_of (event_child);
-
- if (!non_stop)
- {
- /* From GDB's perspective, all-stop mode always stops all
- threads implicitly. Tag all threads as "want-stopped". */
- gdb_wants_all_stopped ();
- }
- else
- {
- /* We're reporting this LWP as stopped. Update it's
- "want-stopped" state to what the client wants, until it gets
- a new resume action. */
- gdb_wants_lwp_stopped (&event_child->head);
- }
-
if (debug_threads)
fprintf (stderr, "linux_wait ret = %s, %d, %d\n",
target_pid_to_str (ptid_of (event_child)),
ourstatus->kind,
ourstatus->value.sig);
- current_inferior->last_status = *ourstatus;
+ 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-07-27 15:06:05.000000000 +0100
+++ src/gdb/gdbserver/server.c 2010-08-06 18:38:14.000000000 +0100
@@ -1674,6 +1674,8 @@ handle_query (char *own_buf, int packet_
own_buf[0] = 0;
}
+static void gdb_wants_all_threads_stopped (void);
+
/* Parse vCont packets. */
void
handle_v_cont (char *own_buf)
@@ -1777,6 +1779,12 @@ handle_v_cont (char *own_buf)
else
{
last_ptid = mywait (minus_one_ptid, &last_status, 0, 1);
+
+ /* 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
+ resume them implicitly without the client telling us to. */
+ gdb_wants_all_threads_stopped ();
prepare_resume_reply (own_buf, last_ptid, &last_status);
disable_async_io ();
@@ -2129,8 +2137,9 @@ queue_stop_reply_callback (struct inferi
return 0;
}
-/* Set this inferior LWP's state as "want-stopped". We won't resume
- this LWP until the client gives us another action for it. */
+/* Set this inferior threads's state as "want-stopped". We won't
+ resume this thread until the client gives us another action for
+ it. */
static void
gdb_wants_thread_stopped (struct inferior_list_entry *entry)
@@ -2141,6 +2150,8 @@ gdb_wants_thread_stopped (struct inferio
if (thread->last_status.kind == TARGET_WAITKIND_IGNORE)
{
+ /* Most threads are stopped implicitly (all-stop); tag that with
+ signal 0. */
thread->last_status.kind = TARGET_WAITKIND_STOPPED;
thread->last_status.value.sig = TARGET_SIGNAL_0;
}
@@ -3123,6 +3134,11 @@ handle_target_event (int err, gdb_client
mark_breakpoints_out (process);
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 (¤t_inferior->entry);
if (forward_event)
{
next reply other threads:[~2010-08-09 15:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-09 15:04 Pedro Alves [this message]
2010-08-25 16:26 ` [gdbserver 2/N] " Pedro Alves
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=201008091604.36329.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).