A while back I wrote about waiting for a specific wall-clock time in Unix , which according to POSIX you can do by using
clock_nanosleep
with the
CLOCK_REALTIME
clock and the
TIMER_ABSTIME
flag. This is fully supported on Linux ( cf ) and not supported on FreeBSD . But here's a question: is it supported on Illumos-derived systems?
So, let us consult the Illumos
clock_nanosleep
manpage . This manpage is very much written in the traditional (corporate) style of Unix manpages, high on specification and low on extra frills. This style either invites or actively requires a very close reading , paying very careful attention to both what is said and what is not said. The Illumos manpage does not explicitly say that your sleep immediately ends if the system's wall clock time is adjusted forward far enough; instead it says, well:
If the flag
TIMER_ABSTIMEis set in the flags argument, theclock_nanosleep()function causes the current thread to be suspended from execution until either the time value of the clock specified byclock_idreaches the absolute time specified by the rqtp argument, [or a signal happens]. [...]The suspension time caused by this function can be longer than requested because the argument value is rounded up to an integer multiple of the sleep resolution, or because of the scheduling of other activity by the system. [...] The suspension for the absolute
clock_nanosleep()function (that is, with theTIMER_ABSTIMEflag set) will be in effect at least until the value of the corresponding clock reaches the absolute time specified byrqtp, [except for signals].
On the surface, this certainly describes a fully-featured implementation of
clock_nanosleep
that behaves the way we want. Unfortunately, if you're a neurotic reader of Unix manpages, all is not so clear. The potential weasel words are 'the suspension ... will be in effect at least until ...'. If you don't shorten
CLOCK_REALTIME
timeouts when the system clock jumps forward, you are technically having them wait 'at least until' the clock reaches their timeout value, because you sort of gave yourself room to have them wait (significantly) longer. At the same time this is a somewhat perverse reading of the manpage, partly because the first sentence of that paragraph alleges that the system will only delay waking you up because of scheduling, which would disallow this particular perversity.
To add to my uncertainty, let's look at the Illumos
timer_settime
manpage , which contains the following eyebrow-raising wording:
If the flag
TIMER_ABSTIMEis set in the argumentflags,timer_settime()behaves as if the time until next expiration is set to be equal to the difference between the absolute time specified by theit_valuemember ofvalueand the current value of the clock associated withtimerid. That is, the timer expires when the clock reaches the value specified by theit_valuemember ofvalue. [...]
These two sentences do not appear to be equivalent for the case of
CLOCK_REALTIME
clocks. The first describes an algorithm that freezes the time to (next) expiration when
timer_settime
is called, which is not proper
CLOCK_REALTIME
behavior, and then the second broadly describes correct
CLOCK_REALTIME
behavior where the timer expires if the real time clock advances past it for any reason.
With all that said, Illumos probably fully implements
CLOCK_REALTIME
, with proper handling of the system time being adjusted while you're suspended or have a timer set. But its manpages never comes out and say that explicitly, because that's simply not the traditional style of Unix manpages, and the way they're written leaves me with uncertainty. If I cared about this, I would have to write a test program and then run it on a machine where I could set the system time both forward and backward.
This fault is not really with these specific Illumos manpages, although some elements of their wording aren't helping things. This is ultimately a downside to the terse, specification-like traditional style of Unix manpages. Where every word may count and the difference between 'digit' and 'digits' matters, you sooner or later get results like this, situations where you just can't tell.
(Yes, this would be a perverse implementation and a weird way of writing the manpages, but (you might say) perhaps the original Solaris corporate authors really didn't want to admit in plain text that Solaris didn't have a complete implementation of
CLOCK_REALTIME
.)
Also, I'm sure that different people will read these manpages differently. My reading is unquestionably biased by knowing that
clock_nanosleep
support is not portable across all Unixes, so I started out wondering if Illumos does support it. If you start reading these manpages with the assumption that of course Illumos supports it, then you get plenty of evidence for that position and all of the wording that I'm jumpy about is obviously me being overly twitchy.