From: Pedro Alves Date: Fri, 12 Dec 2008 14:20:48 +0000 (+0000) Subject: * infrun.c (handle_inferior_event): Correctly tag non-executing X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=48844aa658ab5607fc3442c8a654f220e888f7a1;p=binutils-gdb.git * infrun.c (handle_inferior_event): Correctly tag non-executing threads in multi-process. (normal_stop): Correctly tag stopped threads in multi-process. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 88f234118bb..9e8f9a5a7b7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gdb/infrun.c b/gdb/infrun.c index e65704a06b2..eb2528ce7b9 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); }