diff options
-rw-r--r-- | gdbserver/gdbthread.h | 22 | ||||
-rw-r--r-- | gdbserver/inferiors.cc | 21 |
2 files changed, 43 insertions, 0 deletions
diff --git a/gdbserver/gdbthread.h b/gdbserver/gdbthread.h index 7c293b1..315a4da 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 a636266..d44e40a 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); +} |