blob: efa24d60250aaa893b89224887c503ab617cdaa5 [file] [log] [blame]
//===-- MICmnThreadMgrStd.cpp -----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// In-house headers:
#include "MICmnThreadMgrStd.h"
#include "MICmnLog.h"
#include "MICmnResources.h"
#include "MIUtilSingletonHelper.h"
//++
//------------------------------------------------------------------------------------
// Details: CMICmnThreadMgr constructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmnThreadMgrStd::CMICmnThreadMgrStd() {}
//++
//------------------------------------------------------------------------------------
// Details: CMICmnThreadMgr destructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmnThreadMgrStd::~CMICmnThreadMgrStd() { Shutdown(); }
//++
//------------------------------------------------------------------------------------
// Details: Initialise resources for *this thread manager.
// Type: Method.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmnThreadMgrStd::Initialize() {
m_clientUsageRefCnt++;
if (m_bInitialized)
return MIstatus::success;
bool bOk = MIstatus::success;
ClrErrorDescription();
CMIUtilString errMsg;
// Note initialisation order is important here as some resources depend on
// previous
MI::ModuleInit<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
MI::ModuleInit<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);
m_bInitialized = bOk;
if (!bOk) {
CMIUtilString strInitError(CMIUtilString::Format(
MIRSRC(IDS_MI_INIT_ERR_THREADMGR), errMsg.c_str()));
SetErrorDescription(strInitError);
return MIstatus::failure;
}
return bOk;
}
//++
//------------------------------------------------------------------------------------
// Details: Release resources for *this thread manager.
// Type: Method.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmnThreadMgrStd::Shutdown() {
if (--m_clientUsageRefCnt > 0)
return MIstatus::success;
if (!m_bInitialized)
return MIstatus::success;
m_bInitialized = false;
ClrErrorDescription();
bool bOk = MIstatus::success;
CMIUtilString errMsg;
// Tidy up
ThreadAllTerminate();
// Note shutdown order is important here
MI::ModuleShutdown<CMICmnResources>(IDE_MI_SHTDWN_ERR_RESOURCES, bOk, errMsg);
MI::ModuleShutdown<CMICmnLog>(IDS_MI_SHTDWN_ERR_LOG, bOk, errMsg);
if (!bOk) {
SetErrorDescriptionn(MIRSRC(IDS_MI_SHUTDOWN_ERR), errMsg.c_str());
}
return bOk;
}
//++
//------------------------------------------------------------------------------------
// Details: Ask the thread manager to kill all threads and wait until they have
// died
// Type: Method.
// Args: None.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmnThreadMgrStd::ThreadAllTerminate() {
ThreadList_t::const_iterator it = m_threadList.begin();
for (; it != m_threadList.end(); ++it) {
// If the thread is still running
CMIUtilThreadActiveObjBase *pThread = *it;
if (pThread->ThreadIsActive()) {
// Ask this thread to kill itself
pThread->ThreadKill();
// Wait for this thread to die
pThread->ThreadJoin();
}
}
return MIstatus::success;
}
//++
//------------------------------------------------------------------------------------
// Details: Add a thread object to *this manager's list of thread objects. The
// list to
// used to manage thread objects centrally.
// Type: Method.
// Args: vrObj - (R) A thread object.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
bool CMICmnThreadMgrStd::AddThread(const CMIUtilThreadActiveObjBase &vrObj) {
m_threadList.push_back(const_cast<CMIUtilThreadActiveObjBase *>(&vrObj));
return MIstatus::success;
}