infrun: switch to NO_HISTORY thread
authorMarkus Metzger <markus.t.metzger@intel.com>
Mon, 7 Sep 2015 08:00:46 +0000 (10:00 +0200)
committerMarkus Metzger <markus.t.metzger@intel.com>
Fri, 18 Sep 2015 12:26:28 +0000 (14:26 +0200)
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.

gdb/ChangeLog
gdb/infrun.c

index be86243bb691ff4e73b511b0cb3608d698fe279e..82aade94937044792e3d86598dfbca568d9c737f 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-18  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * infrun.c (handle_inferior_event_1): Switch to the eventing thread
+       in the TARKET_WAITKIND_NO_HISTORY case.
+
 2015-09-18  Markus Metzger  <markus.t.metzger@intel.com>
 
        * record-btrace.c (record_btrace_maybe_mark_async_event): New.
index 8175fb1b23354b5ea448aa2318cd5b651aff2bed..75ac80abd9f47035476aa8a7cf1d346729d50b1e 100644 (file)
@@ -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;