blob: e9ffbd4a9f47160743b89d265a74ab22b8f894e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 - 2017 ACIN, fortiss GmbH, Red Hat Inc
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl, Rene Smodic, Martin Melik Merkiumians - initial API and implementation and/or initial documentation
* Alois Zoitl - extracted common functions to new base class CThreadBase
* Jens Reimann - fix waiting for thread initialization
*******************************************************************************/
#include <fortealloc.h>
#include "forte_thread.h"
#include "../devlog.h"
#include <errno.h>
#include <cstring>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <criticalregion.h>
forte::arch::CThreadBase<pthread_t>::TThreadHandleType CPosixThread::createThread(long paStackSize){
TThreadHandleType retVal = 0;
if(paStackSize){
pthread_attr_t stAttr;
if(pthread_attr_init(&stAttr)){
DEVLOG_ERROR("Error could not get the default thread attributes! %s\n", strerror(errno));
return 0;
}
#ifdef __CYGWIN__
if (pthread_attr_setstacksize (&stAttr, paStackSize)){
DEVLOG_ERROR("Error could not set the stacksize for the thread! %s\n", strerror(errno));
return 0;
}
#else //__CYGWIN__
if(pthread_attr_setstack(&stAttr, mStack, paStackSize)){
DEVLOG_ERROR("Error could not set the stacksize for the thread! %s\n", strerror(errno));
return 0;
}
#endif //__CYGWIN__
if(pthread_create(&retVal, &stAttr, threadFunction, this)){
DEVLOG_ERROR("Error could not create the thread! %s\n", strerror(errno));
return 0;
}
if(pthread_attr_destroy(&stAttr)){
DEVLOG_ERROR("Error could not free the thread attributes! %s\n", strerror(errno));
return 0;
}
}
else{
if(pthread_create(&retVal, NULL, threadFunction, this)){
DEVLOG_ERROR("Error could not create the thread! %s\n", strerror(errno));
return 0;
}
}
// Detach because we don't care about the thread anymore/don't need to join. To cleanup either call pthread_detach or pthread_join
pthread_detach(retVal);
return retVal;
}
void * CPosixThread::threadFunction(void *paArguments){
// Get pointer to CThread object out of void pointer
CThreadBase::runThread(static_cast<CPosixThread *>(paArguments));
return 0;
}
CPosixThread::CPosixThread(long paStackSize) : CThreadBase(paStackSize){
if(0 != paStackSize){
mStack = new char[paStackSize];
}
}
CPosixThread::~CPosixThread(){
}
void CPosixThread::setDeadline(const CIEC_TIME &paVal){
mDeadline = paVal;
//under the posix pthread implemention currently it makes no sense to set any priority.
//It will not be considered.
}
void CPosixThread::sleepThread(unsigned int paMilliSeconds){
struct timespec stReq = { static_cast<time_t>(paMilliSeconds / 1000), static_cast<long>(1000000 * (paMilliSeconds % 1000)) };
nanosleep(&stReq, NULL);
}