From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: Use is_stopped, instead of !is_running
Date: Tue, 29 Jul 2008 13:59:00 -0000 [thread overview]
Message-ID: <200807291459.12056.pedro@codesourcery.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 601 bytes --]
This patches fixes a couple of left over instances of !is_running to use
is_stopped instead, and adds a missing check for is_exited in
get_selected_block, which I tripped on while development the yet
unsubmitted non-stop remote target.
I'm adding more comments to gdbthread.h to describe why. Basically,
the thread state is not a boolean anymore.
I'll soon post a description of these states in the internal manual
under the currently empty section 3.5 - Thread Handling. Let me
know if it should be placed somewhere else.
Tested on x86_64-unknown-linux-gnu sync and async.
OK?
--
Pedro Alves
[-- Attachment #2: is_stopped_is_running.diff --]
[-- Type: text/x-diff, Size: 3989 bytes --]
2008-07-29 Pedro Alves <pedro@codesourcery.com>
* gdbthread.h: Add comments.
* stack.c (get_selected_block): Return 0 on an exited thread.
* top.c (execute_command): Check for is_stopped, not !is_running.
* event-top.c (command_handler): Likewise.
---
gdb/event-top.c | 2 +-
gdb/gdbthread.h | 33 ++++++++++++++++++++++++++-------
gdb/stack.c | 3 +++
gdb/top.c | 2 +-
4 files changed, 31 insertions(+), 9 deletions(-)
Index: src/gdb/gdbthread.h
===================================================================
--- src.orig/gdb/gdbthread.h 2008-07-29 13:25:21.000000000 +0100
+++ src/gdb/gdbthread.h 2008-07-29 13:25:42.000000000 +0100
@@ -210,21 +210,40 @@ extern void switch_to_thread (ptid_t pti
If PIDGET (PTID) is -1, marks all threads. */
extern void set_running (ptid_t ptid, int running);
-/* Reports if thread PTID is known to be running right now. */
-extern int is_running (ptid_t ptid);
+/* NOTE: Since the thread state is not a boolean, most times, you do
+ not want to check it with negation. If you really want to check if
+ the thread is stopped,
-/* Reports if any thread is known to be running right now. */
-extern int any_running (void);
+ use (good):
+
+ if (is_stopped (ptid))
+
+ instead of (bad):
+
+ if (!is_running (ptid))
+
+ The latter also returns true on exited threads, most likelly not
+ what you want. */
+
+/* Reports if in the frontend's perpective, thread PTID is running. */
+extern int is_running (ptid_t ptid);
/* Is this thread listed, but known to have exited? We keep it listed
(but not visible) until it's safe to delete. */
extern int is_exited (ptid_t ptid);
-/* Is this thread stopped? */
+/* In the frontend's perpective, is this thread stopped? */
extern int is_stopped (ptid_t ptid);
-/* Marks thread PTID as executing, or as stopped.
- If PIDGET (PTID) is -1, marks all threads. */
+/* In the frontend's perpective is there any thread running? */
+extern int any_running (void);
+
+/* Marks thread PTID as executing, or not. If PIDGET (PTID) is -1,
+ marks all threads.
+
+ Note that this is different from the running state. See the
+ description of state_ and executing_ fields of struct
+ thread_info. */
extern void set_executing (ptid_t ptid, int executing);
/* Reports if thread PTID is executing. */
Index: src/gdb/stack.c
===================================================================
--- src.orig/gdb/stack.c 2008-07-29 13:25:21.000000000 +0100
+++ src/gdb/stack.c 2008-07-29 13:25:42.000000000 +0100
@@ -1644,6 +1644,9 @@ get_selected_block (CORE_ADDR *addr_in_b
if (!target_has_stack)
return 0;
+ if (is_exited (inferior_ptid))
+ return 0;
+
if (is_executing (inferior_ptid))
return 0;
Index: src/gdb/top.c
===================================================================
--- src.orig/gdb/top.c 2008-07-29 13:25:21.000000000 +0100
+++ src/gdb/top.c 2008-07-29 13:25:42.000000000 +0100
@@ -484,7 +484,7 @@ Cannot execute this command without a li
/* FIXME: This should be cacheing the frame and only running when
the frame changes. */
- if (target_has_stack && !is_running (inferior_ptid))
+ if (target_has_stack && is_stopped (inferior_ptid))
{
flang = get_frame_language ();
if (!warned
Index: src/gdb/event-top.c
===================================================================
--- src.orig/gdb/event-top.c 2008-07-29 13:25:21.000000000 +0100
+++ src/gdb/event-top.c 2008-07-29 13:25:42.000000000 +0100
@@ -518,7 +518,7 @@ command_handler (char *command)
/* Do any commands attached to breakpoint we stopped at. Only if we
are always running synchronously. Or if we have just executed a
command that doesn't start the target. */
- if (!target_can_async_p () || !is_running (inferior_ptid))
+ if (!target_can_async_p () || is_stopped (inferior_ptid))
{
bpstat_do_actions (&stop_bpstat);
do_cleanups (old_chain);
next reply other threads:[~2008-07-29 13:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-29 13:59 Pedro Alves [this message]
2008-07-29 15:59 ` Thiago Jung Bauermann
2008-07-29 16:32 ` Pedro Alves
2008-08-09 14:31 ` Joel Brobecker
2008-08-16 23:54 ` 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=200807291459.12056.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