From 5d73509a340cbb88f2c8e5f7d634d7c72a569452 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 18 May 2021 11:28:08 +0200 Subject: [PATCH] posix: Fix use of clock for relative times Close #4429. --- cpukit/posix/src/nanosleep.c | 37 ++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c index 8d1a4b84e4..792d222e2b 100644 --- a/cpukit/posix/src/nanosleep.c +++ b/cpukit/posix/src/nanosleep.c @@ -64,7 +64,7 @@ int clock_nanosleep( ) { Thread_queue_Context queue_context; - struct timespec uptime; + struct timespec now; const struct timespec *end; Thread_Control *executing; int eno; @@ -81,21 +81,22 @@ int clock_nanosleep( if ( ( flags & TIMER_ABSTIME ) != 0 ) { end = rqtp; - - if ( clock_id == CLOCK_REALTIME ) { - _Thread_queue_Context_set_enqueue_timeout_realtime_timespec( - &queue_context, - end - ); - } else { - _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec( - &queue_context, - end - ); - } } else { - _Timecounter_Nanouptime( &uptime ); - end = _Watchdog_Future_timespec( &uptime, rqtp ); + if ( clock_id == CLOCK_REALTIME ) { + _Timecounter_Nanotime( &now ); + } else { + _Timecounter_Nanouptime( &now ); + } + + end = _Watchdog_Future_timespec( &now, rqtp ); + } + + if ( clock_id == CLOCK_REALTIME ) { + _Thread_queue_Context_set_enqueue_timeout_realtime_timespec( + &queue_context, + end + ); + } else { _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec( &queue_context, end @@ -120,7 +121,11 @@ int clock_nanosleep( if ( eno == EINTR ) { struct timespec actual_end; - _Timecounter_Nanouptime( &actual_end ); + if ( clock_id == CLOCK_REALTIME ) { + _Timecounter_Nanotime( &actual_end ); + } else { + _Timecounter_Nanouptime( &actual_end ); + } if ( _Timespec_Less_than( &actual_end, end ) ) { _Timespec_Subtract( &actual_end, end, rmtp );