lkml.org 
[lkml]   [2008]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: nanosleep() uses CLOCK_MONOTONIC, should be CLOCK_REALTIME?
On Mon, Jun 23, 2008 at 1:56 PM, Bart Van Assche
<bart.vanassche@gmail.com> wrote:
> On Mon, Jun 23, 2008 at 11:48 AM, Michael Kerrisk
> <mtk.manpages@googlemail.com> wrote:
>> On Mon, Jun 23, 2008 at 10:34 AM, Bart Van Assche
>> <bart.vanassche@gmail.com> wrote:
>>> On Sun, Jun 22, 2008 at 9:35 AM, Michael Kerrisk <mtk.manpages@gmail.com> wrote:
>>>> The POSIX.1 specification of nanosleep() says:
>>>>
>>>> But, except for the case of being interrupted by a signal, the
>>>> suspension time shall not be less than the time specified by
>>>> rqtp, as measured by the system clock CLOCK_REALTIME.
>>>>
>>>>
>>>> However, reading kernel/hrtimer.c:sys_nanosleep(), it appears that
>>>> CLOCK_MONOTONIC is used.
>>>>
>>>> return hrtimer_nanosleep(&tu, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
>>>>
>>>> Is there a reason to use CLOCK_MONOTONIC, instead of CLOCK_REALTIME? Is it
>>>> intentional? If yes, then I should document this in the man-pages. If not,
>>>> then it should be fixed.
>>>
>>> CLOCK_MONOTONIC works fine even if ntpd steps the clock forward or
>>> backward, CLOCK_REALTIME not. So the man page should be fixed.
>>
>> Thanks for your reply, but I'm not quite convinced yet. The things
>> is: the Solaris man page also says "CLOCK_REALTIME". (Of course that
>> man page may just be parroting the standard.) Could there not be some
>> reasonable semantics for a nanosleep() that was based on
>> CLOCK_REALTIME?
>
> Sorry, but I don't think that a nanosleep() based on CLOCK_REALTIME
> would have reasonable semantics. The first line of the description in
> nanosleep()'s manpage says:
> "nanosleep() delays the execution of the program for at least the
> time specified in *req". So you really need CLOCK_MONOTONIC and not
> CLOCK_REALTIME.

I meant to add. It seems to me that there really could be reasonable
semantics here: nanosleep() sleeps until the specified time has
elapsed, as measured by CLOCK_REALTIME. That may mean, for example,
that the sleep finishes "early" if CLOCK_REALTIME jumps forward for
some reason. That seems perfectly reasonable as possible semantics
for sleeping (i.e., we are interested in sleeping for an interval
based on what the system understands the time to be in the "outside
world"). Note that POSIX also specifies clcok_nanosleep(), which
allows CLOCK_REALTIME and CLOCK_MONOTONIC, and is again explicit about
what nanosleep() should be doing:

APPLICATION USAGE
Calling clock_nanosleep() with the value TIMER_ABSTIME not set
in the flags argument and with a clock_id of CLOCK_REALTIME is
equivalent to calling nanosleep() with the same rqtp and rmtp
arguments.

RATIONALE
The nanosleep() function specifies that the system-wide clock
CLOCK_REALTIME is used to measure the elapsed time for this
time service. However, with the introduction of the monotonic
clock CLOCK_MONOTONIC a new relative sleep function is needed
to allow an application to take advantage of the special char-
acteristics of this clock.

Cheers,

Michael


\
 
 \ /
  Last update: 2008-06-24 07:21    [W:0.066 / U:0.536 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site