blob: a65aa4830bd70045bb3e3a1179005e103f065029 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 fortiss GmbH
* 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:
* Jose Cabral - initial API and implementation and/or initial documentation
*******************************************************************************/
#include "forte_thread.h"
#include <fortenew.h>
#include "../devlog.h"
#define FORTE_TASK_NAME "FORTE_TASK"
#define FORTE_TASK_TOKEN TSK_TOK_1
#define FORTE_TASK_PRIORITY TSK_PRIO_15
UINT CrcXThread::smTaskInstance = 0;
RX_TASK_TOKEN CrcXThread::smTaskToken = FORTE_TASK_TOKEN;
forte::arch::CThreadBase<RX_HANDLE>::TThreadHandleType CrcXThread::createThread(long paStackSize){
TThreadHandleType retVal = 0;
if (0 != mStack){
RX_RESULT retVal;
retVal = rX_SysCreateTask(FORTE_TASK_NAME, threadFunction, (void*)this, mStack, paStackSize / 4, RX_TASK_AUTO_START,
0, FORTE_TASK_PRIORITY, CrcXThread::smTaskToken, CrcXThread::smTaskInstance, (void (*) (void*))NULL);
if (RX_OK == retVal){
CrcXThread::smTaskInstance++;
CrcXThread::smTaskToken++;
if(RX_OK != rX_SysIdentifyTask(FORTE_TASK_NAME, CrcXThread::smTaskInstance - 1, &retVal, 0, 0)){
DEVLOG_ERROR("Task was created but couldn't be identified. Memory leaks might happen\n");
}
}else{
DEVLOG_ERROR("Couldn't create a task\n");
}
}
return retVal;
}
void CrcXThread::threadFunction(void *arguments){
CThreadBase::runThread(static_cast<CrcXThread *>(arguments));
}
CrcXThread::CrcXThread(long paStackSize) : CThreadBase(paStackSize), mStack(0){
if(paStackSize < (300 * 4)){ // If m_nStackSize == 0, the minimum is also set.
paStackSize = 300 * 4;
}
mStack = new char[paStackSize];
if (0 == mStack){
DEVLOG_ERROR("Not enough memory to allocate %l bytes for creating a new thread\n", mStackSize);
}
}
CrcXThread::~CrcXThread(){
}
void CrcXThread::setDeadline(const CIEC_TIME &){
//mDeadline = paVal;
}
void CrcXThread::sleepThread(unsigned int paMilliSeconds){
rX_SysSleepTask(paMilliSeconds * 1000 / rX_SysGetSystemCycletime());
}
void CrcXThread::deleteThread(RX_HANDLE paThreadHandle){
rX_SysDeleteTask(paThreadHandle, 0);
}