One downside of the traditional style of writing Unix manpages
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_ABSTIME
is 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_id
reaches 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_ABSTIME
flag 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_ABSTIME
is 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_value
member ofvalue
and the current value of the clock associated withtimerid
. That is, the timer expires when the clock reaches the value specified by theit_value
member 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.
|
|