in FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_clock.c [122:192]
int clock_nanosleep( clockid_t clock_id,
int flags,
const struct timespec * rqtp,
struct timespec * rmtp )
{
int iStatus = 0;
TickType_t xSleepTime = 0;
struct timespec xCurrentTime = { 0 };
/* Silence warnings about unused parameters. */
( void ) clock_id;
( void ) rmtp;
( void ) flags; /* This is only ignored if INCLUDE_vTaskDelayUntil is 0. */
/* Check rqtp. */
if( UTILS_ValidateTimespec( rqtp ) == false )
{
iStatus = EINVAL;
}
/* Get current time */
if( ( iStatus == 0 ) && ( clock_gettime( CLOCK_REALTIME, &xCurrentTime ) != 0 ) )
{
iStatus = EINVAL;
}
if( iStatus == 0 )
{
/* Check for absolute time sleep. */
if( ( flags & TIMER_ABSTIME ) == TIMER_ABSTIME )
{
/* Get current time */
if( clock_gettime( CLOCK_REALTIME, &xCurrentTime ) != 0 )
{
iStatus = EINVAL;
}
/* Get number of ticks until absolute time. */
if( ( iStatus == 0 ) && ( UTILS_AbsoluteTimespecToDeltaTicks( rqtp, &xCurrentTime, &xSleepTime ) == 0 ) )
{
/* Delay until absolute time if vTaskDelayUntil is available. */
#if ( INCLUDE_vTaskDelayUntil == 1 )
/* Get the current tick count. This variable isn't declared
* at the top of the function because it's only used and needed
* if vTaskDelayUntil is available. */
TickType_t xCurrentTicks = xTaskGetTickCount();
/* Delay until absolute time. */
vTaskDelayUntil( &xCurrentTicks, xSleepTime );
#else
/* If vTaskDelayUntil isn't available, ignore the TIMER_ABSTIME flag
* and sleep for a relative time. */
vTaskDelay( xSleepTime );
#endif
}
}
else
{
/* If TIMER_ABSTIME isn't specified, convert rqtp to ticks and
* sleep for a relative time. */
if( UTILS_TimespecToTicks( rqtp, &xSleepTime ) == 0 )
{
vTaskDelay( xSleepTime );
}
}
}
return iStatus;
}