posix: Fix relative CLOCK_REALTIME sleep

A relative CLOCK_REALTIME time out shall not be affected by CLOCK_REALTIME
changes through clock_settime().  Since our CLOCK_REALTIME is basically just
CLOCK_MONOTONIC plus an offset, we can simply use the CLOCK_MONOTONIC watchdog
for relative CLOCK_REALTIME time outs.

Update #4690.
This commit is contained in:
Sebastian Huber
2022-08-01 09:03:11 +02:00
parent 071640d310
commit c64c638f6d
2 changed files with 32 additions and 41 deletions

View File

@@ -82,6 +82,15 @@ int clock_nanosleep(
rmtp = NULL;
} else {
absolute = false;
/*
* A relative CLOCK_REALTIME time out shall not be affected by
* CLOCK_REALTIME changes through clock_settime(). Since our
* CLOCK_REALTIME is basically just CLOCK_MONOTONIC plus an offset, we can
* simply use the CLOCK_MONOTONIC watchdog for relative CLOCK_REALTIME time
* outs.
*/
clock_id = CLOCK_MONOTONIC;
}
if ( clock_id == CLOCK_REALTIME ) {

View File

@@ -659,16 +659,10 @@ static void CReqClockNanosleep_Post_Expire_Check(
case CReqClockNanosleep_Post_Expire_Relative: {
/*
* The timer of the calling task shall expire at the time point specified
* by the sum of the current time of the clock specified by the
* ``clock_id`` parameter and the interval specified by the ``rqtp``
* parameter.
* by the sum of the current time of the clock specified by
* CLOCK_MONOTONIC and the interval specified by the ``rqtp`` parameter.
*/
if ( ctx->clock_id == CLOCK_REALTIME ) {
expire = ctx->now_realtime;
} else {
expire = ctx->now_monotonic;
}
expire = ctx->now_monotonic;
expire.tv_sec += ctx->rqtp_obj.tv_sec;
expire.tv_nsec += ctx->rqtp_obj.tv_nsec;
@@ -855,54 +849,42 @@ CReqClockNanosleep_Entries[] = {
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Absolute,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Absolute,
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Inactive, CReqClockNanosleep_Post_Expire_NA,
CReqClockNanosleep_Post_Scheduler_BlockUnblock,
CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Absolute,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Monotonic,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Last,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
{ 0, 0, 0, 0, 0, 0, 0, CReqClockNanosleep_Post_Status_Zero,
CReqClockNanosleep_Post_Timer_Realtime,
CReqClockNanosleep_Post_Expire_Relative,
CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Nop }
};
static const uint8_t
CReqClockNanosleep_Map[] = {
6, 6, 8, 8, 10, 10, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 7, 2, 13, 8, 14, 15, 11, 6, 7, 2, 7, 2, 7, 2, 7, 2, 3,
0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 9, 9, 12, 12, 6, 6, 2, 2,
2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 16,
9, 17, 18, 11, 6, 7, 2, 7, 2, 7, 2, 7, 2, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
6, 6, 8, 8, 9, 9, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 7, 2, 10, 8, 11, 12, 13, 6, 7, 2, 7, 2, 7, 2, 7, 2, 3, 0,
3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 14, 14, 15, 15, 6, 6, 2, 2,
2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 10,
8, 11, 12, 13, 6, 7, 2, 7, 2, 7, 2, 7, 2, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
3, 0, 3, 0, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1