From: Pedro Alves Date: Wed, 14 Jan 2009 15:00:19 +0000 (+0000) Subject: * remote.c (extended_remote_mourn_1): Invalidate our notion of X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dc1981d76992dfb9e56a6425baff2caf7eefc86e;p=binutils-gdb.git * remote.c (extended_remote_mourn_1): Invalidate our notion of current general thread. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index caff8a8ee54..c9c46166928 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-01-14 Pedro Alves + + * remote.c (extended_remote_mourn_1): Invalidate our notion of + current general thread. + 2009-01-14 Pedro Alves * mi/mi-main.c (mi_cmd_execute): Also allow -list-thread-groups diff --git a/gdb/remote.c b/gdb/remote.c index 92d00c29034..4864dde3845 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -6548,6 +6548,31 @@ extended_remote_mourn_1 (struct target_ops *target) /* We're no longer interested in these events. */ discard_pending_stop_replies (ptid_get_pid (inferior_ptid)); + /* If the current general thread belonged to the process we just + detached from or has exited, the remote side current general + thread becomes undefined. Considering a case like this: + + - We just got here due to a detach. + - The process that we're detaching from happens to immediately + report a global breakpoint being hit in non-stop mode, in the + same thread we had selected before. + - GDB attaches to this process again. + - This event happens to be the next event we handle. + + GDB would consider that the current general thread didn't need to + be set on the stub side (with Hg), since for all it knew, + GENERAL_THREAD hadn't changed. + + Notice that although in all-stop mode, the remote server always + sets the current thread to the thread reporting the stop event, + that doesn't happen in non-stop mode; in non-stop, the stub *must + not* change the current thread when reporting a breakpoint hit, + due to the decoupling of event reporting and event handling. + + To keep things simple, we always invalidate our notion of the + current thread. */ + record_currthread (minus_one_ptid); + /* Unlike "target remote", we do not want to unpush the target; then the next time the user says "run", we won't be connected. */