diff options
Diffstat (limited to 'include/lldb/Target/ThreadList.h')
-rw-r--r-- | include/lldb/Target/ThreadList.h | 282 |
1 files changed, 124 insertions, 158 deletions
diff --git a/include/lldb/Target/ThreadList.h b/include/lldb/Target/ThreadList.h index 140fdaa444d0..9e3c940c3c2d 100644 --- a/include/lldb/Target/ThreadList.h +++ b/include/lldb/Target/ThreadList.h @@ -13,183 +13,149 @@ #include <mutex> #include <vector> -#include "lldb/lldb-private.h" #include "lldb/Core/UserID.h" -#include "lldb/Utility/Iterable.h" -#include "lldb/Target/ThreadCollection.h" #include "lldb/Target/Thread.h" +#include "lldb/Target/ThreadCollection.h" +#include "lldb/Utility/Iterable.h" +#include "lldb/lldb-private.h" namespace lldb_private { // This is a thread list with lots of functionality for use only by the process // for which this is the thread list. A generic container class with iterator // functionality is ThreadCollection. -class ThreadList : public ThreadCollection -{ -friend class Process; +class ThreadList : public ThreadCollection { + friend class Process; public: + ThreadList(Process *process); + + ThreadList(const ThreadList &rhs); + + ~ThreadList() override; + + const ThreadList &operator=(const ThreadList &rhs); + + uint32_t GetSize(bool can_update = true); + + // Return the selected thread if there is one. Otherwise, return the thread + // selected at index 0. + lldb::ThreadSP GetSelectedThread(); + + // Manage the thread to use for running expressions. This is usually the + // Selected thread, + // but sometimes (e.g. when evaluating breakpoint conditions & stop hooks) it + // isn't. + class ExpressionExecutionThreadPusher { + public: + ExpressionExecutionThreadPusher(ThreadList &thread_list, lldb::tid_t tid) + : m_thread_list(&thread_list), m_tid(tid) { + m_thread_list->PushExpressionExecutionThread(m_tid); + } + + ExpressionExecutionThreadPusher(lldb::ThreadSP thread_sp); + + ~ExpressionExecutionThreadPusher() { + if (m_thread_list && m_tid != LLDB_INVALID_THREAD_ID) + m_thread_list->PopExpressionExecutionThread(m_tid); + } + + private: + ThreadList *m_thread_list; + lldb::tid_t m_tid; + }; + + lldb::ThreadSP GetExpressionExecutionThread(); - ThreadList (Process *process); - - ThreadList (const ThreadList &rhs); - - ~ThreadList() override; - - const ThreadList& - operator = (const ThreadList& rhs); - - uint32_t - GetSize(bool can_update = true); - - // Return the selected thread if there is one. Otherwise, return the thread - // selected at index 0. - lldb::ThreadSP - GetSelectedThread (); - - // Manage the thread to use for running expressions. This is usually the Selected thread, - // but sometimes (e.g. when evaluating breakpoint conditions & stop hooks) it isn't. - class ExpressionExecutionThreadPusher - { - public: - ExpressionExecutionThreadPusher(ThreadList &thread_list, lldb::tid_t tid) : - m_thread_list(&thread_list), - m_tid(tid) - { - m_thread_list->PushExpressionExecutionThread(m_tid); - } - - ExpressionExecutionThreadPusher(lldb::ThreadSP thread_sp); - - ~ExpressionExecutionThreadPusher() - { - if (m_thread_list && m_tid != LLDB_INVALID_THREAD_ID) - m_thread_list->PopExpressionExecutionThread(m_tid); - } - - private: - ThreadList *m_thread_list; - lldb::tid_t m_tid; - }; - - lldb::ThreadSP - GetExpressionExecutionThread(); - protected: - void - PushExpressionExecutionThread(lldb::tid_t tid); - - void - PopExpressionExecutionThread(lldb::tid_t tid); + void PushExpressionExecutionThread(lldb::tid_t tid); + + void PopExpressionExecutionThread(lldb::tid_t tid); public: - bool - SetSelectedThreadByID (lldb::tid_t tid, bool notify = false); - - bool - SetSelectedThreadByIndexID (uint32_t index_id, bool notify = false); - - void - Clear(); - - void - Flush(); - - void - Destroy(); - - // Note that "idx" is not the same as the "thread_index". It is a zero - // based index to accessing the current threads, whereas "thread_index" - // is a unique index assigned - lldb::ThreadSP - GetThreadAtIndex (uint32_t idx, bool can_update = true); - - lldb::ThreadSP - FindThreadByID (lldb::tid_t tid, bool can_update = true); - - lldb::ThreadSP - FindThreadByProtocolID (lldb::tid_t tid, bool can_update = true); - - lldb::ThreadSP - RemoveThreadByID (lldb::tid_t tid, bool can_update = true); - - lldb::ThreadSP - RemoveThreadByProtocolID (lldb::tid_t tid, bool can_update = true); - - lldb::ThreadSP - FindThreadByIndexID (uint32_t index_id, bool can_update = true); - - lldb::ThreadSP - GetThreadSPForThreadPtr (Thread *thread_ptr); - - bool - ShouldStop (Event *event_ptr); - - Vote - ShouldReportStop (Event *event_ptr); - - Vote - ShouldReportRun (Event *event_ptr); - - void - RefreshStateAfterStop (); - - //------------------------------------------------------------------ - /// The thread list asks tells all the threads it is about to resume. - /// If a thread can "resume" without having to resume the target, it - /// will return false for WillResume, and then the process will not be - /// restarted. - /// - /// @return - /// \b true instructs the process to resume normally, - /// \b false means start & stopped events will be generated, but - /// the process will not actually run. The thread must then return - /// the correct StopInfo when asked. - /// - //------------------------------------------------------------------ - bool - WillResume (); - - void - DidResume (); - - void - DidStop (); - - void - DiscardThreadPlans(); - - uint32_t - GetStopID () const; - - void - SetStopID (uint32_t stop_id); - - std::recursive_mutex & - GetMutex() override; - - void - Update (ThreadList &rhs); - -protected: + bool SetSelectedThreadByID(lldb::tid_t tid, bool notify = false); - void - SetShouldReportStop (Vote vote); + bool SetSelectedThreadByIndexID(uint32_t index_id, bool notify = false); - void - NotifySelectedThreadChanged (lldb::tid_t tid); + void Clear(); - //------------------------------------------------------------------ - // Classes that inherit from Process can see and modify these - //------------------------------------------------------------------ - Process *m_process; ///< The process that manages this thread list. - uint32_t m_stop_id; ///< The process stop ID that this thread list is valid for. - lldb::tid_t m_selected_tid; ///< For targets that need the notion of a current thread. - std::vector<lldb::tid_t> m_expression_tid_stack; + void Flush(); -private: + void Destroy(); + + // Note that "idx" is not the same as the "thread_index". It is a zero + // based index to accessing the current threads, whereas "thread_index" + // is a unique index assigned + lldb::ThreadSP GetThreadAtIndex(uint32_t idx, bool can_update = true); + + lldb::ThreadSP FindThreadByID(lldb::tid_t tid, bool can_update = true); + + lldb::ThreadSP FindThreadByProtocolID(lldb::tid_t tid, + bool can_update = true); - ThreadList (); + lldb::ThreadSP RemoveThreadByID(lldb::tid_t tid, bool can_update = true); + + lldb::ThreadSP RemoveThreadByProtocolID(lldb::tid_t tid, + bool can_update = true); + + lldb::ThreadSP FindThreadByIndexID(uint32_t index_id, bool can_update = true); + + lldb::ThreadSP GetThreadSPForThreadPtr(Thread *thread_ptr); + + bool ShouldStop(Event *event_ptr); + + Vote ShouldReportStop(Event *event_ptr); + + Vote ShouldReportRun(Event *event_ptr); + + void RefreshStateAfterStop(); + + //------------------------------------------------------------------ + /// The thread list asks tells all the threads it is about to resume. + /// If a thread can "resume" without having to resume the target, it + /// will return false for WillResume, and then the process will not be + /// restarted. + /// + /// @return + /// \b true instructs the process to resume normally, + /// \b false means start & stopped events will be generated, but + /// the process will not actually run. The thread must then return + /// the correct StopInfo when asked. + /// + //------------------------------------------------------------------ + bool WillResume(); + + void DidResume(); + + void DidStop(); + + void DiscardThreadPlans(); + + uint32_t GetStopID() const; + + void SetStopID(uint32_t stop_id); + + std::recursive_mutex &GetMutex() const override; + + void Update(ThreadList &rhs); + +protected: + void SetShouldReportStop(Vote vote); + + void NotifySelectedThreadChanged(lldb::tid_t tid); + + //------------------------------------------------------------------ + // Classes that inherit from Process can see and modify these + //------------------------------------------------------------------ + Process *m_process; ///< The process that manages this thread list. + uint32_t + m_stop_id; ///< The process stop ID that this thread list is valid for. + lldb::tid_t + m_selected_tid; ///< For targets that need the notion of a current thread. + std::vector<lldb::tid_t> m_expression_tid_stack; + +private: + ThreadList(); }; } // namespace lldb_private |