From a54106b87ce4e3a3bb3d33927e753d0c05cd9276 Mon Sep 17 00:00:00 2001 From: palves Date: Fri, 12 Dec 2008 14:20:48 +0000 Subject: [PATCH] * infrun.c (handle_inferior_event): Correctly tag non-executing threads in multi-process. (normal_stop): Correctly tag stopped threads in multi-process. --- gdb/ChangeLog | 6 ++++++ gdb/infrun.c | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 88f234118b..9e8f9a5a7b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2008-12-12 Pedro Alves + * infrun.c (handle_inferior_event): Correctly tag non-executing + threads in multi-process. + (normal_stop): Correctly tag stopped threads in multi-process. + +2008-12-12 Pedro Alves + * remote.c (extended_remote_mourn_1): Always call generic_mourn_inferior. diff --git a/gdb/infrun.c b/gdb/infrun.c index e65704a06b..eb2528ce7b 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); } -- 2.11.0