Special-case wildcard requests in ravenscar-thread.c
authorTom Tromey <tromey@adacore.com>
Wed, 6 Feb 2019 14:14:40 +0000 (15:14 +0100)
committerTom Tromey <tromey@adacore.com>
Fri, 15 Feb 2019 20:53:43 +0000 (13:53 -0700)
ravenscar-thread.c intercepts resume and wait target requests and
replaces the requested ptid with the ptid of the underlying CPU.
However, this is incorrect when a request is made with a wildcard
ptid.

This patch adds a special case to ravenscar-thread.c for
minus_one_ptid.  I don't believe a special case for process wildcards
is necessary, so I have not added that.

Joel's description explains the bug well:

At the user level, we noticed the issue because we had a test were
we insert a breakpoint one some code which is only run from, say,
CPU #2, whereas we unfortunately resumed the execution after having
stopped somewhere in CPU #1. As a result, we sent an order to resume
CPU #1, which starves CPU #2 forever, because the code in CPU #1
waits for some of the Ada tasks allocated to CPU #2 (and we never
reach our breakpoint either).

gdb/ChangeLog
2019-02-15  Tom Tromey  <tromey@adacore.com>

* ravenscar-thread.c (ravenscar_thread_target::resume)
(ravenscar_thread_target::wait): Special case wildcard requests.

gdb/ChangeLog
gdb/ravenscar-thread.c

index 28762cc593f45a65c87b06ba993ec43249399c11..3ef09fd733ba0ad90441ee0e106ff3dbb9cd78d2 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-15  Tom Tromey  <tromey@adacore.com>
+
+       * ravenscar-thread.c (ravenscar_thread_target::resume)
+       (ravenscar_thread_target::wait): Special case wildcard requests.
+
 2019-02-15  Tom Tromey  <tromey@adacore.com>
 
        * ravenscar-thread.c (base_ptid): Remove.
index 186345d0fba10cea5391a2d6ba8ba608dd2189a3..05a83200a1e967b7e1862e2747197bce26a49e56 100644 (file)
@@ -323,8 +323,12 @@ void
 ravenscar_thread_target::resume (ptid_t ptid, int step,
                                 enum gdb_signal siggnal)
 {
+  /* If we see a wildcard resume, we simply pass that on.  Otherwise,
+     arrange to resume the base ptid.  */
   inferior_ptid = m_base_ptid;
-  beneath ()->resume (m_base_ptid, step, siggnal);
+  if (ptid != minus_one_ptid)
+    ptid = m_base_ptid;
+  beneath ()->resume (ptid, step, siggnal);
 }
 
 ptid_t
@@ -335,7 +339,9 @@ ravenscar_thread_target::wait (ptid_t ptid,
   ptid_t event_ptid;
 
   inferior_ptid = m_base_ptid;
-  event_ptid = beneath ()->wait (m_base_ptid, status, 0);
+  if (ptid != minus_one_ptid)
+    ptid = m_base_ptid;
+  event_ptid = beneath ()->wait (ptid, status, 0);
   /* Find any new threads that might have been created, and update
      inferior_ptid to the active thread.
 
@@ -350,6 +356,8 @@ ravenscar_thread_target::wait (ptid_t ptid,
       this->update_thread_list ();
       this->update_inferior_ptid ();
     }
+  else
+    inferior_ptid = m_base_ptid;
   return inferior_ptid;
 }