aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MICmnThreadMgrStd.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MICmnThreadMgrStd.h')
-rw-r--r--tools/lldb-mi/MICmnThreadMgrStd.h134
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;
+}