diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-05-18 11:28:08 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-05-04 15:57:37 +0200 |
commit | 5d73509a340cbb88f2c8e5f7d634d7c72a569452 (patch) | |
tree | 8a0243ceec359b3eccc9d19d270d8e1eb36522ed | |
parent | heap: Fix heap statistics with protection enabled (diff) | |
download | rtems-5d73509a340cbb88f2c8e5f7d634d7c72a569452.tar.bz2 |
posix: Fix use of clock for relative times
Close #4429.
-rw-r--r-- | cpukit/posix/src/nanosleep.c | 31 |
1 files changed, 18 insertions, 13 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; - + } else { if ( clock_id == CLOCK_REALTIME ) { - _Thread_queue_Context_set_enqueue_timeout_realtime_timespec( - &queue_context, - end - ); + _Timecounter_Nanotime( &now ); } else { - _Thread_queue_Context_set_enqueue_timeout_monotonic_timespec( - &queue_context, - end - ); + _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 { - _Timecounter_Nanouptime( &uptime ); - end = _Watchdog_Future_timespec( &uptime, rqtp ); _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 ); |