* gdbthread.h: Add comments.
authorPedro Alves <palves@redhat.com>
Sat, 16 Aug 2008 23:51:14 +0000 (23:51 +0000)
committerPedro Alves <palves@redhat.com>
Sat, 16 Aug 2008 23:51:14 +0000 (23:51 +0000)
* 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/ChangeLog
gdb/event-top.c
gdb/gdbthread.h
gdb/stack.c
gdb/top.c

index 3d590003893d607a90b09489c0d690e64880385d..8dd19606082524933a9b64e694a7608ae4e236e8 100644 (file)
@@ -1,3 +1,10 @@
+2008-08-17  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.
+
 2008-08-16  Pedro Alves  <pedro@codesourcery.com>
 
        * mi/mi-main.c (mi_cmd_exec_next, mi_cmd_exec_next_instruction)
index 722c28e1792ce0b2a609deaa7c91aa7a85252057..61c431dabf271e6d67187fd842cb271daf474fda 100644 (file)
@@ -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);
index f283865ccc58ef62a8e2334e00decd19ddf421d1..780ec251c76310477e869bc5b74397061f8c99a7 100644 (file)
@@ -210,21 +210,40 @@ extern void switch_to_thread (ptid_t ptid);
    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 18c4298ed7f73d3c7fe8e0aa0dcdf02f0fa44ea6..ca39d48a289102348c6dba202f733f73d4a67dab 100644 (file)
@@ -1644,6 +1644,9 @@ get_selected_block (CORE_ADDR *addr_in_block)
   if (!target_has_stack)
     return 0;
 
+  if (is_exited (inferior_ptid))
+    return 0;
+
   if (is_executing (inferior_ptid))
     return 0;
 
index 0ae7ea020ff968ed2e7607cc2d3640e168c1fc62..52d1a0ef52325e22c45de177a28159eef63857c4 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -477,7 +477,7 @@ Cannot execute this command without a live selected thread.  See `help thread'."
   /* 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