action
container
contrib
controller
coordinates
datalinklayer
datapool
devicehandlers
events
fdir
globalfunctions
health
internalError
ipc
memory
modes
monitoring
objectmanager
osal
FreeRTOS
host
linux
rtems
Clock.cpp
CpuUsage.cpp
CpuUsage.h
InitTask.cpp
InitTask.h
InternalErrorCodes.cpp
Interrupt.cpp
Interrupt.h
MessageQueue.cpp
MessageQueue.h
MultiObjectTask.cpp
MultiObjectTask.h
Mutex.cpp
Mutex.h
MutexFactory.cpp
PollingTask.cpp
PollingTask.h
QueueFactory.cpp
RtemsBasic.cpp
RtemsBasic.h
TaskBase.cpp
TaskBase.h
TaskFactory.cpp
Endiness.h
InternalErrorCodes.h
parameters
power
pus
returnvalues
rmap
serialize
serviceinterface
storagemanager
subsystem
tasks
tcdistribution
thermal
timemanager
tmstorage
tmtcpacket
tmtcservices
.gitignore
LICENSE
NOTICE
fsfw.mk
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
#include "Mutex.h"
|
|
#include "../../serviceinterface/ServiceInterfaceStream.h"
|
|
|
|
uint8_t Mutex::count = 0;
|
|
|
|
Mutex::Mutex() :
|
|
mutexId(0) {
|
|
rtems_name mutexName = ('M' << 24) + ('T' << 16) + ('X' << 8) + count++;
|
|
rtems_status_code status = rtems_semaphore_create(mutexName, 1,
|
|
RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, 0,
|
|
&mutexId);
|
|
if (status != RTEMS_SUCCESSFUL) {
|
|
error << "Mutex: creation with name, id " << mutexName << ", " << mutexId
|
|
<< " failed with " << status << std::endl;
|
|
}
|
|
}
|
|
|
|
Mutex::~Mutex() {
|
|
rtems_status_code status = rtems_semaphore_delete(mutexId);
|
|
if (status != RTEMS_SUCCESSFUL) {
|
|
error << "Mutex: deletion for id " << mutexId
|
|
<< " failed with " << status << std::endl;
|
|
}
|
|
}
|
|
|
|
ReturnValue_t Mutex::lockMutex(TimeoutType timeoutType =
|
|
TimeoutType::BLOCKING, uint32_t timeoutMs) {
|
|
if(timeoutMs == MutexIF::TimeoutType::BLOCKING) {
|
|
rtems_status_code status = rtems_semaphore_obtain(mutexId,
|
|
RTEMS_WAIT, RTEMS_NO_TIMEOUT);
|
|
}
|
|
else if(timeoutMs == MutexIF::TimeoutType::POLLING) {
|
|
timeoutMs = RTEMS_NO_TIMEOUT;
|
|
rtems_status_code status = rtems_semaphore_obtain(mutexId,
|
|
RTEMS_NO_WAIT, 0);
|
|
}
|
|
else {
|
|
rtems_status_code status = rtems_semaphore_obtain(mutexId,
|
|
RTEMS_WAIT, timeoutMs);
|
|
}
|
|
|
|
switch(status){
|
|
case RTEMS_SUCCESSFUL:
|
|
//semaphore obtained successfully
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
case RTEMS_UNSATISFIED:
|
|
//semaphore not available
|
|
return MUTEX_NOT_FOUND;
|
|
case RTEMS_TIMEOUT:
|
|
//timed out waiting for semaphore
|
|
return MUTEX_TIMEOUT;
|
|
case RTEMS_OBJECT_WAS_DELETED:
|
|
//semaphore deleted while waiting
|
|
return MUTEX_DESTROYED_WHILE_WAITING;
|
|
case RTEMS_INVALID_ID:
|
|
//invalid semaphore id
|
|
return MUTEX_INVALID_ID;
|
|
default:
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
}
|
|
|
|
ReturnValue_t Mutex::unlockMutex() {
|
|
rtems_status_code status = rtems_semaphore_release(mutexId);
|
|
switch(status){
|
|
case RTEMS_SUCCESSFUL:
|
|
//semaphore obtained successfully
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
case RTEMS_NOT_OWNER_OF_RESOURCE:
|
|
//semaphore not available
|
|
return CURR_THREAD_DOES_NOT_OWN_MUTEX;
|
|
case RTEMS_INVALID_ID:
|
|
//invalid semaphore id
|
|
return MUTEX_INVALID_ID;
|
|
default:
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
}
|