diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/ThreadLibrary/CAThread.linux.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/ThreadLibrary/CAThread.linux.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* System Includes +* +*/ + + + +#include +#include +#include +#include +#include +#include + +/******************************************************************************* + * + * Local Includes + * + ******************************************************************************/ +#include "CAThread.h" + +/******************************************************************************* + * + * Implementation + * + ******************************************************************************/ +CAThread::CAThread() +{ + iThreadHandle = 0; + iThreadState = TS_INIT; + iProc = NULL; +} + + +CAThread::CAThread( string aThreadName ) +{ + iThreadHandle = 0; + iThreadState = TS_INIT; + iProc = NULL; + iThreadName = aThreadName; +} + + +CAThread::~CAThread() +{ + assert( iThreadHandle == 0 ); + assert( iThreadState != TS_ACTIVE ); +} + + +/******************************************************************************* + * + * PUBLIC METHOD: StartThread + * + ******************************************************************************/ +TThreadError CAThread::StartThread( void *aStartProc, void *aArg, int *aSystemSpecificError ) +{ + int err; + + // check params + assert( aSystemSpecificError != NULL ); + *aSystemSpecificError = 0; + + // check state + if( iThreadState != TS_INIT ) { + return TE_INVALIDSTATE; + } + + // NOTE: we use the handle as a replacement for pthread_t. This is OK since they are both + // 4-bytes integers -- however -- this obviously breaks the abstraction of the pthread_t + // type so I validate this assumption here. + assert( sizeof(pthread_t) == sizeof(HANDLE) ); + + // create the thread + err = pthread_create( (pthread_t*)&iThreadHandle, NULL, (void*(*)(void*))aStartProc, aArg ); + iProc = aStartProc; + + // handle errors + if( err != 0 ) { + *aSystemSpecificError = errno; + return TE_ERROR; + } + + // done + iThreadState = TS_ACTIVE; + return TE_NONE; +} + + +/******************************************************************************* + * + * PUBLIC METHOD: WaitForThread - To implement this method using pthreads we + * use two functions. pthread_getschedparam is a non-blocking call that returns + * whether the thread is still active - pthread_join waits infinitely for the + * thread to complete. At the moment this implementation doesn't support wait + * periods other than zero and infinite. + * + ******************************************************************************/ +TThreadError CAThread::WaitForThread( int aTimeout ) +{ + int err, thread_return_value; + int policy; + struct sched_param param; + + // check the state + if( iThreadState != TS_ACTIVE ) { + return TE_INVALIDSTATE; + } + + // check the param + assert( (aTimeout == 0) || (aTimeout == -1) ); + + // in the non-blocking case we check whether the thread is active, if it is then we just return, otherwise, we then join with it. + if( aTimeout == 0 ) { + err = pthread_getschedparam( iThreadHandle, &policy, ¶m ); + if( err == 0 ) { + return TE_TIMEOUT; + } else if( err != ESRCH ) { + return TE_ERROR; + } + } + + // we are either waiting indefinitely, or, we are waiting non-blocking but have just worked out that the thread is not running anymore + err = pthread_join( iThreadHandle, (void**)&thread_return_value ); + assert( err == 0 ); + + // cleanup our state + iThreadHandle = 0; + iThreadState = TS_DONE; + return TE_NONE; +} + + +/******************************************************************************* + * + * PUBLIC METHOD: GetThreadState + * + ******************************************************************************/ +TThreadState CAThread::GetThreadState() +{ + return iThreadState; +}