forked from OSchip/llvm-project
168 lines
4.4 KiB
C++
168 lines
4.4 KiB
C++
//===-- 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;
|
|
}
|