blob: 757012a697e01f447a2d73d124b6b6e7d4d02ba6 [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;
}