in FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_utils.c [103:159]
int UTILS_TimespecToTicks( const struct timespec * const pxTimespec,
TickType_t * const pxResult )
{
int iStatus = 0;
int64_t llTotalTicks = 0;
long lNanoseconds = 0;
/* Check parameters. */
if( ( pxTimespec == NULL ) || ( pxResult == NULL ) )
{
iStatus = EINVAL;
}
else if( ( iStatus == 0 ) && ( UTILS_ValidateTimespec( pxTimespec ) == false ) )
{
iStatus = EINVAL;
}
if( iStatus == 0 )
{
/* Convert timespec.tv_sec to ticks. */
llTotalTicks = ( int64_t ) configTICK_RATE_HZ * ( pxTimespec->tv_sec );
/* Convert timespec.tv_nsec to ticks. This value does not have to be checked
* for overflow because a valid timespec has 0 <= tv_nsec < 1000000000 and
* NANOSECONDS_PER_TICK > 1. */
lNanoseconds = pxTimespec->tv_nsec / ( long ) NANOSECONDS_PER_TICK + /* Whole nanoseconds. */
( long ) ( pxTimespec->tv_nsec % ( long ) NANOSECONDS_PER_TICK != 0 ); /* Add 1 to round up if needed. */
/* Add the nanoseconds to the total ticks. */
llTotalTicks += ( int64_t ) lNanoseconds;
/* Check for overflow */
if( llTotalTicks < 0 )
{
iStatus = EINVAL;
}
else
{
/* check if TickType_t is 32 bit or 64 bit */
uint32_t ulTickTypeSize = sizeof( TickType_t );
/* check for downcast overflow */
if( ulTickTypeSize == sizeof( uint32_t ) )
{
if( llTotalTicks > UINT_MAX )
{
iStatus = EINVAL;
}
}
}
/* Write result. */
*pxResult = ( TickType_t ) llTotalTicks;
}
return iStatus;
}