[rtems commit] posix: Fix relative CLOCK_REALTIME sleep

Sebastian Huber sebh at rtems.org
Thu Aug 4 05:47:25 UTC 2022


Module:    rtems
Branch:    master
Commit:    c64c638f6dee6c0e92804bbe378ff91cc75f620e
Changeset: http://git.rtems.org/rtems/commit/?id=c64c638f6dee6c0e92804bbe378ff91cc75f620e

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Aug  1 09:03:11 2022 +0200

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.

---

 cpukit/posix/src/clocknanosleep.c          |  9 ++++++
 testsuites/validation/tc-clock-nanosleep.c | 46 +++++++++---------------------
 2 files changed, 23 insertions(+), 32 deletions(-)

diff --git a/cpukit/posix/src/clocknanosleep.c b/cpukit/posix/src/clocknanosleep.c
index 3fa890fecd..bfa8ef7975 100644
--- a/cpukit/posix/src/clocknanosleep.c
+++ b/cpukit/posix/src/clocknanosleep.c
@@ -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 ) {
diff --git a/testsuites/validation/tc-clock-nanosleep.c b/testsuites/validation/tc-clock-nanosleep.c
index 2f4d439efe..45a3355384 100644
--- a/testsuites/validation/tc-clock-nanosleep.c
+++ b/testsuites/validation/tc-clock-nanosleep.c
@@ -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;
 
@@ -854,22 +848,10 @@ CReqClockNanosleep_Entries[] = {
     CReqClockNanosleep_Post_Timer_Monotonic,
     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_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_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_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,
@@ -883,26 +865,26 @@ CReqClockNanosleep_Entries[] = {
     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 },
+    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_Relative,
-    CReqClockNanosleep_Post_Scheduler_Block, CReqClockNanosleep_Post_RMTp_Zero },
+    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_Relative,
+    CReqClockNanosleep_Post_Expire_Absolute,
     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



More information about the vc mailing list