in FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread_mutex.c [112:166]
int pthread_mutex_init( pthread_mutex_t * mutex,
const pthread_mutexattr_t * attr )
{
int iStatus = 0;
pthread_mutex_internal_t * pxMutex = ( pthread_mutex_internal_t * ) mutex;
if( pxMutex == NULL )
{
/* No memory. */
iStatus = ENOMEM;
}
if( iStatus == 0 )
{
*pxMutex = FREERTOS_POSIX_MUTEX_INITIALIZER;
/* No attributes given, use default attributes. */
if( attr == NULL )
{
pxMutex->xAttr = xDefaultMutexAttributes;
}
/* Otherwise, use provided attributes. */
else
{
pxMutex->xAttr = *( ( pthread_mutexattr_internal_t * ) ( attr ) );
}
/* Call the correct FreeRTOS mutex creation function based on mutex type. */
if( pxMutex->xAttr.iType == PTHREAD_MUTEX_RECURSIVE )
{
/* Recursive mutex. */
( void ) xSemaphoreCreateRecursiveMutexStatic( &pxMutex->xMutex );
}
else
{
/* All other mutex types. */
( void ) xSemaphoreCreateMutexStatic( &pxMutex->xMutex );
}
/* Ensure that the FreeRTOS mutex was successfully created. */
if( ( SemaphoreHandle_t ) &pxMutex->xMutex == NULL )
{
/* Failed to create mutex. Set error EAGAIN and free mutex object. */
iStatus = EAGAIN;
vPortFree( pxMutex );
}
else
{
/* Mutex successfully created. */
pxMutex->xIsInitialized = pdTRUE;
}
}
return iStatus;
}