This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] infrun: switch to NO_HISTORY thread


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d1988021e345c990f4272843577529a123f8943d

commit d1988021e345c990f4272843577529a123f8943d
Author: Markus Metzger <markus.t.metzger@intel.com>
Date:   Mon Sep 7 10:00:46 2015 +0200

    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.

Diff:
---
 gdb/ChangeLog | 5 +++++
 gdb/infrun.c  | 8 +++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index be86243..82aade9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 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.
 	(record_btrace_wait): Call record_btrace_maybe_mark_async_event.
 
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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]