in FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_utils.c [268:319]
int UTILS_TimespecSubtract( const struct timespec * const x,
const struct timespec * const y,
struct timespec * const pxResult )
{
int iCompareResult = 0;
int iStatus = 0;
/* Check parameters. */
if( ( pxResult == NULL ) || ( x == NULL ) || ( y == NULL ) )
{
iStatus = -1;
}
if( iStatus == 0 )
{
iCompareResult = UTILS_TimespecCompare( x, y );
/* if x < y then result would be negative, return 1 */
if( iCompareResult == -1 )
{
iStatus = 1;
}
else if( iCompareResult == 0 )
{
/* if times are the same return zero */
pxResult->tv_sec = 0;
pxResult->tv_nsec = 0;
}
else
{
/* If x > y Perform subtraction. */
pxResult->tv_sec = x->tv_sec - y->tv_sec;
pxResult->tv_nsec = x->tv_nsec - y->tv_nsec;
/* check if nano seconds value needs to borrow */
if( pxResult->tv_nsec < 0 )
{
/* Based on comparison, tv_sec > 0 */
pxResult->tv_sec--;
pxResult->tv_nsec += ( long ) NANOSECONDS_PER_SECOND;
}
/* if nano second is negative after borrow, it is an overflow error */
if( pxResult->tv_nsec < 0 )
{
iStatus = -1;
}
}
}
return iStatus;
}