From: John Stultz <john.stultz@linaro.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Andy Lutomirski <luto@amacapital.net>,
Arun Sharma <asharma@fb.com>, LKML <linux-kernel@vger.kernel.org>,
Kumar Sundararajan <kumar@fb.com>
Subject: Re: clock_gettime_ns
Date: Wed, 04 Sep 2013 15:59:28 -0700 [thread overview]
Message-ID: <5227BB50.7000301@linaro.org> (raw)
In-Reply-To: <5227B432.8070205@zytor.com>
On 09/04/2013 03:29 PM, H. Peter Anvin wrote:
> On 09/04/2013 01:54 PM, John Stultz wrote:
>>> I'd advocate for going whole hog and returning, atomically:
>>>
>>> - TAI (nanoseconds from epoch)
>>> - UTC - TAI (seconds or nanoseconds) *
>>> - TAI - CLOCK_MONOTONIC (nanoseconds)
>>> - a leap second flag.
>>>
>>> * There are various ways to define this. My fancy UTC - TAI wouldn't
>>> actually need the leap-second flag, since the UTC time would indicate
>>> leap seconds directly.
> Not so (see below).
>
>> With the conventional approach, someone would
>>> have to decide whether the leap second count increments at the
>>> beginning or the end of the leap second.
>> Well, adjtimex() gives you UTC & tai offset & leapsecond flag in one go.
>>
> But not fractional-second information,right? I believe it would be
> desirable if we can create a small structure (<= 16 bytes) for this.
Well, depending on if STA_NANO is set, adjtimex returns either nsec or
usec precision via the timex.time field.
> UTC - TAI is always an integral number of seconds, possibly negative
> (unlikely, but...)
>
> Something like:
>
> struct time_ns {
> u64 tai_s;
> u32 tai_ns;
> s16 utcdelta; /* TAI - UTC */
> u8 leap; /* Positive leap second in progress */
> u8 pad; /* Something useful here maybe? */
> };
>
> Why the leap second flag? It is necessary to represent the 61st second
> in a minute during a positive leap second. Consider the below
> (artificial) cases:
>
> (leap second)
> TAI 31536000 31536001 31536002 31536003
> Delta 2 2 ? 3
> UTC 23:59:58 23:59:59 23:59:60 00:00:00
>
> (no leap second)
> TAI 31536000 31536001 31536002 31536003
> Delta 2 2 2 2
> UTC 23:59:58 23:59:59 00:00:00 00:00:01
>
> (no leap second)
> TAI 31536000 31536001 31536002 31536003
> Delta 3 3 3 3
> UTC 23:59:57 23:59:58 23:59:59 00:00:00
>
> There simply is no sufficiently meaningful value that can be put on the
> delta during a positive leap second. Both 2 and 3 would be wrong in the
> above example, giving UTC of either 00:00:00 or 23:59:59.
>
> There is a way to do without the leap second flag by making UTC the main
> time; this does have the advantage of higher compatibility with time_t,
> struct timespec, etc:
>
> struct timespecx {
> time_t tx_sec; /* POSIX UTC seconds */
> u32 tx_ns; /* Nanoseconds */
> s32 tx_taidelta; /* TAI - UTC */
> };
And again, most of the detail above is already there w/ adjtimex (though
admittedly not in a very tight format).
My concern with adding these details to the timespec-like structure this
is with most clockids I'm not sure taidelta would make sense.
Also, there's been talk of a slewed-leap-second clockid, basically UTC
but around the leapsecond it slows down to absorb the extra second. This
means that clockid would have a subsecond offset from TAI.
thanks
-john
next prev parent reply other threads:[~2013-09-04 22:59 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-04 9:18 clock_gettime_ns Arun Sharma
2013-09-04 18:51 ` clock_gettime_ns Andy Lutomirski
2013-09-04 19:20 ` clock_gettime_ns John Stultz
2013-09-04 20:33 ` clock_gettime_ns Andy Lutomirski
2013-09-04 20:54 ` clock_gettime_ns John Stultz
2013-09-04 22:29 ` clock_gettime_ns H. Peter Anvin
2013-09-04 22:59 ` John Stultz [this message]
2013-09-04 23:04 ` clock_gettime_ns H. Peter Anvin
2013-09-04 23:20 ` clock_gettime_ns John Stultz
2013-09-04 23:38 ` clock_gettime_ns Andy Lutomirski
2013-09-05 1:22 ` clock_gettime_ns H. Peter Anvin
2013-09-09 17:47 ` clock_gettime_ns Andy Lutomirski
2013-09-11 18:50 ` clock_gettime_ns Richard Cochran
2013-09-04 19:17 ` clock_gettime_ns John Stultz
2013-09-04 20:23 ` clock_gettime_ns Andy Lutomirski
2013-09-04 20:50 ` clock_gettime_ns John Stultz
2013-09-05 4:45 ` clock_gettime_ns Arun Sharma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5227BB50.7000301@linaro.org \
--to=john.stultz@linaro.org \
--cc=asharma@fb.com \
--cc=hpa@zytor.com \
--cc=kumar@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox