diff options
author | Pedro Alves <palves@redhat.com> | 2008-12-12 14:20:48 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2008-12-12 14:20:48 +0000 |
commit | 48844aa658ab5607fc3442c8a654f220e888f7a1 (patch) | |
tree | 8de4931122a74339f2347bac87aed9cf402d041a /gdb/infrun.c | |
parent | 48aa3c2705215dc118792c7172b76d15f0f78fb5 (diff) | |
download | gdb-48844aa658ab5607fc3442c8a654f220e888f7a1.zip gdb-48844aa658ab5607fc3442c8a654f220e888f7a1.tar.gz gdb-48844aa658ab5607fc3442c8a654f220e888f7a1.tar.bz2 |
* infrun.c (handle_inferior_event): Correctly tag non-executing
threads in multi-process.
(normal_stop): Correctly tag stopped threads in multi-process.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index e65704a..eb2528c 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2141,13 +2141,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) @@ -4372,17 +4376,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); } |