blob: 70b7063276291bcbf2fe3363e2412a3646516127 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016, 2018 fortiss GmbH, TU Vienna/ACIN
* 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 - initial API and implementation and/or initial documentation
* Martin Melik-Merkumians - adds timed wait and try and no wait
* and documentation
*******************************************************************************/
#include "rcXUtilities.h"
#include "forte_sem.h"
#include "../devlog.h"
#include <fortenew.h>
namespace forte {
namespace arch {
CrcXSemaphore::CrcXSemaphore(unsigned int paInitialValue){
mSemaphore = forte_malloc(RX_SEMAPHORE_SIZE);
if(0 == mSemaphore){
DEVLOG_ERROR("Not enough memory to allocate %i bytes for creating a new semaphore\n", RX_SEMAPHORE_SIZE);
}else{
char semaphoreName[8];
getRandomString(&semaphoreName[0], 7);
if(RX_OK != rX_SemCreateSemaphore(&semaphoreName[0], mSemaphore, (paInitialValue > 0 ? 1 : 0))){
DEVLOG_ERROR("Could not initialize semaphore\n");
}
}
}
CrcXSemaphore::~CrcXSemaphore(){
if(0 != mSemaphore){
rX_SemDeleteSemaphore(mSemaphore);
forte_free(mSemaphore);
}
}
void CrcXSemaphore::inc(){
rX_SemClearSemaphoreCount(mSemaphore); //Resets count to zero
rX_SemPutSemaphore(mSemaphore);
//FIXME what to dow if retval is not RX_OK?
//for the current use in 4diac an overflow of the sem counter can
//be ignored if afterwards the value is not zero
}
void CrcXSemaphore::waitIndefinitely(){
rX_SemWaitForSemaphore(mSemaphore, RX_INFINITE);
//FIXME what to dow if retval is not RX_OK?
}
bool CrcXSemaphore::timedWait(const TForteUInt64 paRelativeTimeout){
//TODO: Conversion from nanoseconds into timer ticks
return (0 == srX_SemWaitForSemaphore(mSemaphore, paRelativeTimeout));
}
bool CrcXSemaphore::tryNoWait(){
return (0 == srX_SemWaitForSemaphore(mSemaphore, RX_FINITE));
}
} /* namespace arch */
} /* namespace forte */