From: john stultz <johnstul@us.ibm.com>
To: linux@horizon.com
Cc: linux-kernel@vger.kernel.org,
Roman Zippel <zippel@linux-m68k.org>,
"Theodore Ts'o" <theotso@us.ibm.com>
Subject: Re: Linux time code
Date: Wed, 23 Aug 2006 11:29:45 -0700 [thread overview]
Message-ID: <1156357786.5370.23.camel@localhost.localdomain> (raw)
In-Reply-To: <20060823062546.12798.qmail@science.horizon.com>
On Wed, 2006-08-23 at 02:25 -0400, linux@horizon.com wrote:
> Oh, and if you're going to implement Posix gettimeofday(), have a look at
> Markus Kuhn's UTS proposal (http://www.cl.cam.ac.uk/~mgk25/uts.txt).
> Given that Posix mandates that days have 86400 seconds
> (http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_14),
> but the UTC standard maintained by the BIPM
> (http://www.bipm.fr/en/scientific/tai/time_server.html) mandates
> that days sometimes have 86401 seconds, his system is arguably
> the least insane way to reconcile the irreconcilable.
> (See also http://www.cl.cam.ac.uk/~mgk25/volatile/ITU-R-TF.460-4.pdf)
>
> E.g. The follwing handles positive leap seconds (only).
> next_leap_second is the Posix timestamp of the next leap
> second (23:59:60), which is always a multiple of 86400.
> (http://hpiers.obspm.fr/eop-pc/earthor/utc/TAI-UTC_tab.html)
>
> If you wanted to add the (strictly theoretical and never likely to be
> used) negative leap second code, you could distinguish negative leap
> seconds by the fact that next_leap_second is odd (congruent to -1
> mod 86400).
>
> #define MILLION 1000000
> #define BILLION 1000000000
>
> extern unsigned tai_minus_utc; /* Currently 33 */
> extern time_t next_leap_second; /* UTC time after which tai_minus_utc++ */
>
> switch (clk_id) {
> case CLOCK_UTC:
> clock_gettime(CLOCK_TAI, tp);
> tp->tv_sec -= tai_minus_utc;
> /* Leap seconds per http://www.cl.cam.ac.uk/~mgk25/time/c/ */
> if (tp->tv_sec >= next_leap_second) {
> if (tp->tv_sec == next_leap_second)
> tp->tv_nsec += BILLION;
> tp->tv_sec--;
> }
> break;
> case CLOCK_UTS:
> /* Recommended for gettimeofday() & time() */
> /* See http://www.cl.cam.ac.uk/~mgk25/uts.txt */
> clock_gettime(CLOCK_TAI, tp);
> tp->tv_sec -= tai_minus_utc;
> if (tp->tv_sec > next_leap_second) {
> tp->tv_sec--;
> } else if (next_leap_second - tp->tv_sec < 1000) {
> /* 1000 UTC/TAI seconds = 999 UTS seconds */
> uint32_t offset = next_leap_second - tp->tv_sec + 1;
> offset *= MILLION;
> offset += (uint32_t)(BILLION - tp->tv_nsec)/1000;
> if ((tp->tv_nsec -= offset) < 0) {
> tp->tv_nsec += BILLION;
> tp->tv_sec--;
> }
> }
> break;
> }
I was talking about the UTS/leapsecond bits w/ Ted just the other day
and had a similar thought! To me it makes quite a bit of sense to
generate UTC and UTS from TAI, just as you do in the above, since UTC =
TAI + leapsecond offset, just as local time = GMT + timezone offset.
However the difficulty would be that while NTP provides leapsecond +/-
notifiers, it doesn't provide the absolute UTC offset from TAI. So there
isn't a way for the kernel to generate TAI, from a UTC settimeofday
call. Some method to distribute and inform the kernel of the absolute
leapsecond offset (tai_minus_utc in your code above) would be necessary.
Additionally creating UTS and UTC at the same time would be a bit
complicated. Your solution above isn't quite UTS, since it only handles
the leap insertion, however the insertion case is the one that causes
users most of the pain (since the clock goes backward), so it may very
well be good enough.
Overall, I like your idea quite a bit. Might we look forward to a
patch? :)
Roman: you're thoughts?
thanks
-john
next prev parent reply other threads:[~2006-08-23 18:29 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-23 6:25 Linux time code linux
2006-08-23 18:29 ` john stultz [this message]
2006-08-24 2:35 ` linux
2006-08-28 11:39 ` Roman Zippel
2006-08-28 22:36 ` john stultz
2006-08-29 3:28 ` linux
2006-08-29 13:15 ` Theodore Tso
2006-08-29 15:18 ` linux
2006-08-29 19:23 ` john stultz
2006-08-29 14:43 ` Roman Zippel
2006-08-26 0:17 ` linux
2006-08-28 22:41 ` john stultz
2006-08-26 3:46 ` linux
-- strict thread matches above, loose matches on Subject: below --
2006-08-16 12:26 Ulrich Windl
2006-08-16 12:36 ` Oleg Verych
2006-08-16 15:35 ` H. Peter Anvin
2006-08-16 15:12 ` Oleg Verych
2006-08-16 19:53 ` john stultz
2006-08-17 7:20 ` Ulrich Windl
2006-08-17 19:15 ` john stultz
2006-08-17 11:43 ` Roman Zippel
2006-08-17 21:58 ` john stultz
2006-08-17 22:11 ` Jesse Barnes
2006-08-17 22:32 ` john stultz
2006-08-17 22:50 ` Jesse Barnes
2006-08-17 23:02 ` john stultz
2006-08-20 17:14 ` Roman Zippel
2006-08-20 17:10 ` Roman Zippel
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=1156357786.5370.23.camel@localhost.localdomain \
--to=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@horizon.com \
--cc=theotso@us.ibm.com \
--cc=zippel@linux-m68k.org \
/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