diff options
Diffstat (limited to 'tools/lldb-mi/MICmnThreadMgrStd.h')
-rw-r--r-- | tools/lldb-mi/MICmnThreadMgrStd.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/tools/lldb-mi/MICmnThreadMgrStd.h b/tools/lldb-mi/MICmnThreadMgrStd.h new file mode 100644 index 000000000000..f0c157a468af --- /dev/null +++ b/tools/lldb-mi/MICmnThreadMgrStd.h @@ -0,0 +1,134 @@ +//===-- MICmnThreadMgrStd.h -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +//++ +// File: MICmnThreadMgrStd.h +// +// Overview: CMICmnThreadMgr interface. +// +// Environment: Compilers: Visual C++ 12. +// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 +// Libraries: See MIReadmetxt. +// +// Copyright: None. +//-- + +#pragma once + +// Third party headers: +#include <vector> + +// In-house headers: +#include "MICmnBase.h" +#include "MIUtilThreadBaseStd.h" +#include "MICmnResources.h" +#include "MIUtilSingletonBase.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. +// This manager will stop and delete all threads on *this manager's +// shutdown. +// Singleton class. +// Gotchas: None. +// Authors: Aidan Dodds 12/03/2014. +// Changes: None. +//-- +class CMICmnThreadMgrStd +: public CMICmnBase +, public MI::ISingleton< CMICmnThreadMgrStd > +{ + friend MI::ISingleton< CMICmnThreadMgrStd >; + +// Methods: +public: + bool Initialize( void ); + bool Shutdown( void ); + bool ThreadAllTerminate( void ); // 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( void ); + /* 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 */ virtual ~CMICmnThreadMgrStd( void ); + +// 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. +// Type: Template method. +// 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; + } + + return MIstatus::success; +} |