summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdbserver/gdbthread.h22
-rw-r--r--gdbserver/inferiors.cc21
2 files changed, 43 insertions, 0 deletions
diff --git a/gdbserver/gdbthread.h b/gdbserver/gdbthread.h
index 7c293b1f89d..315a4da5167 100644
--- a/gdbserver/gdbthread.h
+++ b/gdbserver/gdbthread.h
@@ -233,4 +233,26 @@ lwpid_of (const thread_info *thread)
return thread->id.lwp ();
}
+/* Switch the current thread. */
+
+void switch_to_thread (thread_info *thread);
+
+/* Save/restore current thread. */
+
+class scoped_restore_current_thread
+{
+public:
+ scoped_restore_current_thread ();
+ ~scoped_restore_current_thread ();
+
+ DISABLE_COPY_AND_ASSIGN (scoped_restore_current_thread);
+
+ /* Cancel restoring on scope exit. */
+ void dont_restore () { m_dont_restore = true; }
+
+private:
+ bool m_dont_restore = false;
+ thread_info *m_thread;
+};
+
#endif /* GDBSERVER_GDBTHREAD_H */
diff --git a/gdbserver/inferiors.cc b/gdbserver/inferiors.cc
index a636266c798..d44e40a10db 100644
--- a/gdbserver/inferiors.cc
+++ b/gdbserver/inferiors.cc
@@ -218,6 +218,14 @@ switch_to_thread (process_stratum_target *ops, ptid_t ptid)
current_thread = find_thread_ptid (ptid);
}
+/* See gdbthread.h. */
+
+void
+switch_to_thread (thread_info *thread)
+{
+ current_thread = thread;
+}
+
/* See inferiors.h. */
void
@@ -243,3 +251,16 @@ set_inferior_cwd (std::string cwd)
{
current_inferior_cwd = std::move (cwd);
}
+
+scoped_restore_current_thread::scoped_restore_current_thread ()
+{
+ m_thread = current_thread;
+}
+
+scoped_restore_current_thread::~scoped_restore_current_thread ()
+{
+ if (m_dont_restore)
+ return;
+
+ switch_to_thread (m_thread);
+}