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);