Usually CLOCK_MONOTONIC_RAW
is used for obtaining a clock that is not affected by NTP or adjtime()
. However clock_nanosleep()
doesn't support CLOCK_MONOTONIC_RAW
and trying to use it anyway will result in return code 95 Operation not supported (Kernel 4.6.0).
Does clock_nanosleep()
somehow take these clock adjustments into account or will the sleep time be affected by it?
What are the alternatives if a sleeping time is required which should not be affected by clock adjustments?
CLOCK_MONOTONIC_RAW
never had support for clock_nanosleep()
since it was introduced in Linux 2.6.28. It was also explicitly fixed to not have this support in 2.6.32 because of oopses. The code had been refactored several times after that, but still there is no support for CLOCK_MONOTONIC_RAW
in clock_nanosleep()
and I wasn't able to find any comments on why is that.
At the very minimum, the fact that there was a patch that explicitly disabled this functionality and it passed all reviews tells us that it doesn't look like a big problem for kernel developers. So, at the moment (4.7) the only things CLOCK_MONOTONIC_RAW
supports are clock_getres()
and clock_gettime()
.
Speaking of adjustments, as already noted by Rich CLOCK_MONOTONIC
is subject to rate adjustments just by the nature of this clock. This happens because hrtimer_interrupt()
runs its queues with adjusted monotonic time value (ktime_get_update_offsets_now()->timekeeping_get_ns()->timekeeping_delta_to_ns() and that operates with xtime_nsec
which is subject to adjustment). Actually, looking at this code I'm probably no longer surprised that CLOCK_MONOTONIC_RAW
has no support for clock_nanosleep()
(and probably won't have it in future) — adjusted monotonic clock usage seems to be the basis for hrtimers.
As for alternatives, I think there are none. nanosleep()
uses the same CLOCK_MONOTONIC
, setitimer()
has its own set of timers, alarm()
uses ITIMER_REAL (same as setitimer()
), that (with some indirection) is also our good old friend CLOCK_MONOTONIC
. What else do we have? I guess nothing.
As an unrelated side note, there is an interesting observation in that if you call clock_nanosleep()
for relative interval (that is not TIMER_ABSTIME
) then CLOCK_REALTIME
actually becomes a synonym for CLOCK_MONOTONIC
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With