linux_nat.c: Mark new thread running even if momentarily pausing
authorPedro Alves <palves@redhat.com>
Tue, 24 Mar 2015 14:24:53 +0000 (14:24 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 1 Apr 2015 13:23:10 +0000 (14:23 +0100)
My all-stop-on-top-of-non-stop series manages to trip on a bug in the
linux-nat.c backend while running the testsuite.  If a thread is
discovered while threads are being momentarily paused (without the
core's intervention), the thread ends up stuck in THREAD_STOPPED
state, even though from the user's perspective, the thread is running
even while it is paused.

From inspection, in the current sources, this can happen if we call
stop_and_resume_callback, though there's no way to test that with
current Linux kernels.

(While trying to come up with test to exercise this, I stumbled on:
  https://sourceware.org/ml/gdb-patches/2015-03/msg00850.html

... which does include a non-trivial test, so I think I can still
claim I come out net positive. :-) )

Tested on x86_64 Fedora 20.

gdb/ChangeLog:
2015-04-01  Pedro Alves  <palves@redhat.com>

* linux-nat.c (linux_handle_extended_wait): Always call set_running.

gdb/ChangeLog
gdb/linux-nat.c

index 621f4f58082b3334161fadeca66d9de5452c1fcf..838c685a82889dd8e6436adcb719da35d9584bfd 100644 (file)
@@ -1,3 +1,7 @@
+2015-04-01  Pedro Alves  <palves@redhat.com>
+
+       * linux-nat.c (linux_handle_extended_wait): Always call set_running.
+
 2015-04-01  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * MAINTAINERS (Write After Approval): Add "Pierre-Marie de Rodat".
index 0376299fb19a3fd7de9e4e8509f0ddc8c2d509c6..04707dc68a350c35615248d3845a102b23b31f03 100644 (file)
@@ -2109,9 +2109,12 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
              add_thread (new_lp->ptid);
            }
 
+         /* Even if we're stopping the thread for some reason
+            internal to this module, from the user/frontend's
+            perspective, this new thread is running.  */
+         set_running (new_lp->ptid, 1);
          if (!stopping)
            {
-             set_running (new_lp->ptid, 1);
              set_executing (new_lp->ptid, 1);
              /* thread_db_attach_lwp -> lin_lwp_attach_lwp forced
                 resume_stop.  */