gdbserver: introduce scoped_restore_current_thread and switch_to_thread

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'.
This commit is contained in:
Tankut Baris Aktemur 2021-12-13 12:22:48 +01:00
parent 200fd2874d
commit f24791b72e
2 changed files with 43 additions and 0 deletions

View 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 */

View 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);
}