aboutsummaryrefslogtreecommitdiff
path: root/gdb/infrun.c
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2015-09-07 10:00:46 +0200
committerMarkus Metzger <markus.t.metzger@intel.com>2015-09-18 14:26:28 +0200
commitd1988021e345c990f4272843577529a123f8943d (patch)
treed225ad7c1289a2739c3d74d695327d437a60f60e /gdb/infrun.c
parenta6b5be76f94664406def040d79ac8bc4d4aa8bd0 (diff)
downloadgdb-d1988021e345c990f4272843577529a123f8943d.zip
gdb-d1988021e345c990f4272843577529a123f8943d.tar.gz
gdb-d1988021e345c990f4272843577529a123f8943d.tar.bz2
infrun: switch to NO_HISTORY thread
A thread that runs out of its execution history is stopped. We already set stop_pc and call stop_waiting. But we do not switch to the stopped thread. In normal_stop, we call finish_thread_state_cleanup to set a thread's running state. In all-stop mode, we call it with minus_one_ptid; in non-stop mode, we only call it for inferior_ptid. If in non-stop mode normal_stop is called on behalf of a thread that is not inferior_ptid, that other thread will still be reported as running. If it is actually stopped it can't be resumed again. Record targets traditionally don't support non-stop and only resume inferior_ptid. So this has not been a problem, so far. Switch to the eventing thread for NO_HISTORY events as preparation to support non-stop for the record btrace target. gdb/ * infrun.c (handle_inferior_event_1): Switch to the eventing thread in the TARKET_WAITKIND_NO_HISTORY case.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r--gdb/infrun.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 8175fb1..75ac80a 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -5126,8 +5126,14 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_NO_HISTORY\n");
/* Reverse execution: target ran out of history info. */
+ /* Switch to the stopped thread. */
+ if (!ptid_equal (ecs->ptid, inferior_ptid))
+ context_switch (ecs->ptid);
+ if (debug_infrun)
+ fprintf_unfiltered (gdb_stdlog, "infrun: stopped\n");
+
delete_just_stopped_threads_single_step_breakpoints ();
- stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid));
+ stop_pc = regcache_read_pc (get_thread_regcache (inferior_ptid));
observer_notify_no_history ();
stop_waiting (ecs);
return;