attach + target always in non-stop mode: stop all threads
authorPedro Alves <palves@redhat.com>
Mon, 30 Nov 2015 16:05:14 +0000 (16:05 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 30 Nov 2015 18:36:41 +0000 (18:36 +0000)
When running with "maint set target-non-stop on", and in all-stop
mode, nothing is stopping all threads after attaching.  vAttach in
non-stop can leave all threads running and GDB has to explicitly pause
them.

This is not visible with the native target, as in that case, attach
always stops all threads (the core re-resumes them in case of
"attach&").

In addition, it's not defined which thread manages to report the
initial attach stop, so always pick the lowest one (otherwise
multi-attach.exp regresses).

gdb/ChangeLog:
2015-11-30  Pedro Alves  <palves@redhat.com>

* infcmd.c (attach_post_wait): If the target is always in non-stop
mode, and the UI is in all-stop mode, stop all threads and pick
the one with lowest number as current.

gdb/ChangeLog
gdb/infcmd.c

index 6833076ec32efa62d9aaa7b9745c67b89450b139..3e10e2b9b919cdb9c49d441699380a22424c8111 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-30  Pedro Alves  <palves@redhat.com>
+
+       * infcmd.c (attach_post_wait): If the target is always in non-stop
+       mode, and the UI is in all-stop mode, stop all threads and pick
+       the one with lowest number as current.
+
 2015-11-30  Pedro Alves  <palves@redhat.com>
 
        * gdbthread.h (switch_to_thread_no_regs): Declare.
index 9aae86081e0cbafcfe15c1c836f399ca7513be59..ea689f5241776ceaa7c184623bb606de656c7c77 100644 (file)
@@ -2697,8 +2697,31 @@ attach_post_wait (char *args, int from_tty, enum attach_post_wait_mode mode)
         selected thread is stopped, others may still be executing.
         Be sure to explicitly stop all threads of the process.  This
         should have no effect on already stopped threads.  */
-      if (target_is_non_stop_p ())
+      if (non_stop)
        target_stop (pid_to_ptid (inferior->pid));
+      else if (target_is_non_stop_p ())
+       {
+         struct thread_info *thread;
+         struct thread_info *lowest = inferior_thread ();
+         int pid = current_inferior ()->pid;
+
+         stop_all_threads ();
+
+         /* It's not defined which thread will report the attach
+            stop.  For consistency, always select the thread with
+            lowest GDB number, which should be the main thread, if it
+            still exists.  */
+         ALL_NON_EXITED_THREADS (thread)
+           {
+             if (ptid_get_pid (thread->ptid) == pid)
+               {
+                 if (thread->num < lowest->num)
+                   lowest = thread;
+               }
+           }
+
+         switch_to_thread (lowest->ptid);
+       }
 
       /* Tell the user/frontend where we're stopped.  */
       normal_stop ();