blob: 8fa30125b83215dfcc15bcbb83d768c17fa1cb01 [file] [log] [blame]
//===-- MICmnThreadMgr.cpp --------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//++
// File: MICmnThreadMgr.cpp
//
// Overview: CMICmnThreadMgr implementation.
//
// Environment: Compilers: Visual C++ 12.
// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
// Libraries: See MIReadmetxt.
//
// Copyright: None.
//--
// 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(void)
{
}
//++ ------------------------------------------------------------------------------------
// Details: CMICmnThreadMgr destructor.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
CMICmnThreadMgrStd::~CMICmnThreadMgrStd(void)
{
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(void)
{
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(void)
{
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(void)
{
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;
}