gdbserver: introduce scoped_restore_current_thread and switch_to_thread
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Mon, 13 Dec 2021 11:22:48 +0000 (12:22 +0100)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Mon, 13 Dec 2021 11:22:48 +0000 (12:22 +0100)
Introduce a class for restoring the current thread and a function to
switch to the given thread.  This is a preparation for a refactoring
that aims to remove direct assignments to 'current_thread'.

gdbserver/gdbthread.h
gdbserver/inferiors.cc

index 7c293b1f89d23ddde934339f5e24156fdb5d01c5..315a4da516761ec48b798f711a410d7c21212967 100644 (file)
@@ -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 */
index a636266c798fd4a1d5a16c883544c77fa1a73dcc..d44e40a10db5bd50935baf95fee659a0618144c7 100644 (file)
@@ -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);
+}