summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <pedro@codesourcery.com>2008-12-16 22:54:36 +0000
committerPedro Alves <pedro@codesourcery.com>2008-12-16 22:54:36 +0000
commitdb17168c47fba35912b07adb4e0b48546b665503 (patch)
tree0cbdfce0d28206a8888f51f9f51641cc52292126
parentafd707cb598439ab45421a828aa61bec6617d84a (diff)
downloadgdb-db17168c47fba35912b07adb4e0b48546b665503.tar.gz
Merge from head:
2008-12-12 Pedro Alves <pedro@codesourcery.com> * infrun.c (handle_inferior_event): Correctly tag non-executing threads in multi-process. (normal_stop): Correctly tag stopped threads in multi-process.
-rw-r--r--gdb/ChangeLog.mp9
-rw-r--r--gdb/infrun.c44
2 files changed, 37 insertions, 16 deletions
diff --git a/gdb/ChangeLog.mp b/gdb/ChangeLog.mp
index c1fc365df93..75c58d33938 100644
--- a/gdb/ChangeLog.mp
+++ b/gdb/ChangeLog.mp
@@ -3,6 +3,15 @@
Merge from head:
2008-12-12 Pedro Alves <pedro@codesourcery.com>
+ * infrun.c (handle_inferior_event): Correctly tag non-executing
+ threads in multi-process.
+ (normal_stop): Correctly tag stopped threads in multi-process.
+
+2008-12-16 Pedro Alves <pedro@codesourcery.com>
+
+ Merge from head:
+ 2008-12-12 Pedro Alves <pedro@codesourcery.com>
+
* remote.c (extended_remote_mourn_1): Always call
generic_mourn_inferior.
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 1019f1baeb9..85f58ecb711 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -2135,13 +2135,17 @@ handle_inferior_event (struct execution_control_state *ecs)
{
breakpoint_retire_moribund ();
- /* Mark the non-executing threads accordingly. */
- if (!non_stop
- || ecs->ws.kind == TARGET_WAITKIND_EXITED
- || ecs->ws.kind == TARGET_WAITKIND_SIGNALLED)
- set_executing (pid_to_ptid (-1), 0);
- else
- set_executing (ecs->ptid, 0);
+ /* Mark the non-executing threads accordingly. In all-stop, all
+ threads of all processes are stopped when we get any event
+ reported. In non-stop mode, only the event thread stops. If
+ we're handling a process exit in non-stop mode, there's
+ nothing to do, as threads of the dead process are gone, and
+ threads of any other process were left running. */
+ if (!non_stop)
+ set_executing (minus_one_ptid, 0);
+ else if (ecs->ws.kind != TARGET_WAITKIND_SIGNALLED
+ && ecs->ws.kind != TARGET_WAITKIND_EXITED)
+ set_executing (inferior_ptid, 0);
}
switch (infwait_state)
@@ -4371,17 +4375,25 @@ done:
else
observer_notify_normal_stop (NULL);
}
- if (target_has_execution
- && last.kind != TARGET_WAITKIND_SIGNALLED
- && last.kind != TARGET_WAITKIND_EXITED)
- {
- /* Delete the breakpoint we stopped at, if it wants to be deleted.
- Delete any breakpoint that is to be deleted at the next stop. */
- breakpoint_auto_delete (inferior_thread ()->stop_bpstat);
+ if (target_has_execution)
+ {
+ if (last.kind != TARGET_WAITKIND_SIGNALLED
+ && last.kind != TARGET_WAITKIND_EXITED)
+ /* Delete the breakpoint we stopped at, if it wants to be deleted.
+ Delete any breakpoint that is to be deleted at the next stop. */
+ breakpoint_auto_delete (inferior_thread ()->stop_bpstat);
+
+ /* Mark the stopped threads accordingly. In all-stop, all
+ threads of all processes are stopped when we get any event
+ reported. In non-stop mode, only the event thread stops. If
+ we're handling a process exit in non-stop mode, there's
+ nothing to do, as threads of the dead process are gone, and
+ threads of any other process were left running. */
if (!non_stop)
- set_running (pid_to_ptid (-1), 0);
- else
+ set_running (minus_one_ptid, 0);
+ else if (last.kind != TARGET_WAITKIND_SIGNALLED
+ && last.kind != TARGET_WAITKIND_EXITED)
set_running (inferior_ptid, 0);
}