diff options
Diffstat (limited to 'lldb/tools/lldb-mi/MICmnThreadMgrStd.h')
-rw-r--r-- | lldb/tools/lldb-mi/MICmnThreadMgrStd.h | 178 |
1 files changed, 90 insertions, 88 deletions
diff --git a/lldb/tools/lldb-mi/MICmnThreadMgrStd.h b/lldb/tools/lldb-mi/MICmnThreadMgrStd.h index fc0013f9949..86f5bc7373c 100644 --- a/lldb/tools/lldb-mi/MICmnThreadMgrStd.h +++ b/lldb/tools/lldb-mi/MICmnThreadMgrStd.h @@ -14,11 +14,12 @@ // In-house headers: #include "MICmnBase.h" -#include "MIUtilThreadBaseStd.h" #include "MICmnResources.h" #include "MIUtilSingletonBase.h" +#include "MIUtilThreadBaseStd.h" -//++ ============================================================================ +//++ +//============================================================================ // Details: MI's worker thread (active thread) manager. // The manager creates threads and behalf of clients. Client are // responsible for their threads and can delete them when necessary. @@ -26,98 +27,99 @@ // shutdown. // Singleton class. //-- -class CMICmnThreadMgrStd : public CMICmnBase, public MI::ISingleton<CMICmnThreadMgrStd> -{ - friend MI::ISingleton<CMICmnThreadMgrStd>; - - // Methods: - public: - bool Initialize() override; - bool Shutdown() override; - bool - ThreadAllTerminate(); // Ask all threads to stop (caution) - template <typename T> // Ask the thread manager to start and stop threads on our behalf - bool ThreadStart(T &vrwObject); - - // Typedef: - private: - typedef std::vector<CMIUtilThreadActiveObjBase *> ThreadList_t; - - // Methods: - private: - /* ctor */ CMICmnThreadMgrStd(); - /* ctor */ CMICmnThreadMgrStd(const CMICmnThreadMgrStd &); - void operator=(const CMICmnThreadMgrStd &); - // - bool - AddThread(const CMIUtilThreadActiveObjBase &vrObj); // Add a thread for monitoring by the threadmanager - - // Overridden: - private: - // From CMICmnBase - /* dtor */ ~CMICmnThreadMgrStd() override; - - // Attributes: - private: - CMIUtilThreadMutex m_mutex; - ThreadList_t m_threadList; +class CMICmnThreadMgrStd : public CMICmnBase, + public MI::ISingleton<CMICmnThreadMgrStd> { + friend MI::ISingleton<CMICmnThreadMgrStd>; + + // Methods: +public: + bool Initialize() override; + bool Shutdown() override; + bool ThreadAllTerminate(); // Ask all threads to stop (caution) + template <typename T> // Ask the thread manager to start and stop threads on + // our behalf + bool ThreadStart(T &vrwObject); + + // Typedef: +private: + typedef std::vector<CMIUtilThreadActiveObjBase *> ThreadList_t; + + // Methods: +private: + /* ctor */ CMICmnThreadMgrStd(); + /* ctor */ CMICmnThreadMgrStd(const CMICmnThreadMgrStd &); + void operator=(const CMICmnThreadMgrStd &); + // + bool AddThread(const CMIUtilThreadActiveObjBase & + vrObj); // Add a thread for monitoring by the threadmanager + + // Overridden: +private: + // From CMICmnBase + /* dtor */ ~CMICmnThreadMgrStd() override; + + // Attributes: +private: + CMIUtilThreadMutex m_mutex; + ThreadList_t m_threadList; }; -//++ ------------------------------------------------------------------------------------ -// Details: Given a thread object start its (worker) thread to do work. The object is -// added to the *this manager for housekeeping and deletion of all thread objects. +//++ +//------------------------------------------------------------------------------------ +// Details: Given a thread object start its (worker) thread to do work. The +// object is +// added to the *this manager for housekeeping and deletion of all +// thread objects. // Type: Template method. -// Args: vrwThreadObj - (RW) A CMIUtilThreadActiveObjBase derived object. +// Args: vrwThreadObj - (RW) A CMIUtilThreadActiveObjBase derived +// object. // Return: MIstatus::success - Functional succeeded. // MIstatus::failure - Functional failed. // Throws: None. //-- -template <typename T> -bool -CMICmnThreadMgrStd::ThreadStart(T &vrwThreadObj) -{ - bool bOk = MIstatus::success; - - // Grab a reference to the base object type - CMIUtilThreadActiveObjBase &rObj = static_cast<CMIUtilThreadActiveObjBase &>(vrwThreadObj); - - // Add to the thread managers internal database - bOk &= AddThread(rObj); - if (!bOk) - { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - // Grab a reference on behalf of the caller - bOk &= vrwThreadObj.Acquire(); - if (!bOk) - { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - // Thread is already started - // This call must come after the reference count increment - if (vrwThreadObj.ThreadIsActive()) - { - // Early exit on thread already running condition - return MIstatus::success; - } - - // Start the thread running - bOk &= vrwThreadObj.ThreadExecute(); - if (!bOk) - { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - +template <typename T> bool CMICmnThreadMgrStd::ThreadStart(T &vrwThreadObj) { + bool bOk = MIstatus::success; + + // Grab a reference to the base object type + CMIUtilThreadActiveObjBase &rObj = + static_cast<CMIUtilThreadActiveObjBase &>(vrwThreadObj); + + // Add to the thread managers internal database + bOk &= AddThread(rObj); + if (!bOk) { + const CMIUtilString errMsg( + CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), + vrwThreadObj.ThreadGetName().c_str())); + SetErrorDescription(errMsg); + return MIstatus::failure; + } + + // Grab a reference on behalf of the caller + bOk &= vrwThreadObj.Acquire(); + if (!bOk) { + const CMIUtilString errMsg( + CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), + vrwThreadObj.ThreadGetName().c_str())); + SetErrorDescription(errMsg); + return MIstatus::failure; + } + + // Thread is already started + // This call must come after the reference count increment + if (vrwThreadObj.ThreadIsActive()) { + // Early exit on thread already running condition return MIstatus::success; + } + + // Start the thread running + bOk &= vrwThreadObj.ThreadExecute(); + if (!bOk) { + const CMIUtilString errMsg( + CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), + vrwThreadObj.ThreadGetName().c_str())); + SetErrorDescription(errMsg); + return MIstatus::failure; + } + + return MIstatus::success; } |