aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-02-06 15:14:40 +0100
committerTom Tromey <tromey@adacore.com>2019-02-15 13:53:43 -0700
commit485b851b68ea035e3c49234dafcddb97c4f54a30 (patch)
treeee41d3c5c194af0b04790991e58689d436c04ff1 /gdb
parent0b790b1eeb3741217d4b7b419aca1ed77a114b6c (diff)
downloadgdb-485b851b68ea035e3c49234dafcddb97c4f54a30.zip
gdb-485b851b68ea035e3c49234dafcddb97c4f54a30.tar.gz
gdb-485b851b68ea035e3c49234dafcddb97c4f54a30.tar.bz2
Special-case wildcard requests in ravenscar-thread.c
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ravenscar-thread.c12
2 files changed, 15 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 28762cc..3ef09fd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
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.
(struct ravenscar_thread_target) <close>: New method.
<m_base_ptid>: New member.
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 186345d..05a8320 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -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;
}