From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5622 invoked by alias); 29 Jul 2008 13:59:37 -0000 Received: (qmail 5603 invoked by uid 22791); 29 Jul 2008 13:59:34 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 29 Jul 2008 13:59:17 +0000 Received: (qmail 5196 invoked from network); 29 Jul 2008 13:59:14 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 29 Jul 2008 13:59:14 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Use is_stopped, instead of !is_running Date: Tue, 29 Jul 2008 13:59:00 -0000 User-Agent: KMail/1.9.9 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_wIyjIt/p5hM9jbP" Message-Id: <200807291459.12056.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-07/txt/msg00540.txt.bz2 --Boundary-00=_wIyjIt/p5hM9jbP Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 601 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 --Boundary-00=_wIyjIt/p5hM9jbP Content-Type: text/x-diff; charset="utf-8"; name="is_stopped_is_running.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="is_stopped_is_running.diff" Content-length: 3989 2008-07-29 Pedro Alves * 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); --Boundary-00=_wIyjIt/p5hM9jbP--