[LEAPSECS] Leap seconds ain't broken, but most implementations are broken
Brooks Harris
brooks at edlmax.com
Sun Jan 8 12:59:21 EST 2017
On 2017-01-08 10:15 AM, Martin Burnicki wrote:
> Brooks Harris wrote:
>> On 2017-01-06 11:52 AM, Martin Burnicki wrote:
>>>> - OS kernels with different features (Windows doesn't even know leap
>>>> seconds, AFAIK)
>>>>
>>>>
>> It is often repeated on LEAPSECS that "Windows doesn't even know leap
>> seconds". That's just not true. It knows very well about Leap Seconds in
>> the same way other systems do but it (typical desktop versions) is lazy
>> about when it updates - it doesn't attempt to update for Leap Seconds
>> until the particular system gets round to syncing to some NTP server
>> (defaulting to time.windows.com, but works perfectly well if set to
>> time.nist.gov, for example).
> Many years ago I wrote a DOS TSR which could read the time from Meinberg
> PCI cards (and ISA cards at that time), and adjusted the DOS time if
> there was a significant difference.
>
> So of course the DOS time was also adjusted after the plug-in card had
> stepped its time due to a leap second.
>
> So according to your argumentation even plain old DOS was aware of leap
> seconds, wasn't it?
Yeah, I think so.
Really, none of DOS, Windows, or (pure) POSIX systems "know" about Leap
Seconds except in so far as the reference counter (Windows FILETIME or
POSIX time_t, (I can't remember what counter DOS relied on)) has been
adjusted by the system in response to NTP queries. That adjustment gets
reflected to YMDhms representation through calls to win::GetSystemTime()
or POSIX::gmtime(). (Again, long time since I played with DOS, not sure
the analogous calls)
By the way, DOS was essentially a real-time OS; you could hammer the
interrupts however you liked. You don't want to do that in a
multitasking event driven OS.
>
>> In Windows, FILETIME (an unsigned 64-bit value) is directly analogous to
>> POSIX time_t except it has a 1601-01-01 00:00:00 epoch. struct
>> SYSTEMTIME is analogous to POSIX struct tm ("broken down time" or
>> "YMDhms" representation). FileTimeToSystemTime() is analogous to POSIX
>> gmtime();
>>
>> Like time_t, FILETIME is "bumped" when the system syncs to a NTP server.
> Yes because the time adjustment software slews or steps the time.
>
> Which Windows API call can be used to notify Windows that a leap second
> is pending, so the Windows system time can account for it at the right time?
I am unaware of any part of Windows that is "aware" of Leap Seconds.
There's no register somewhere that holds current TAI-UTC, announce, or
history, I'm pretty sure, not at user-level access to the OS system
calls, anyway.
(I'm hesitant to state this with great authority because Windows as a
whole is just huge, and there are APIs on APIs developed and exposed
over the years. I keep discovering yet another API that may expose
deeper and deeper access to stuff. There might be something buried
somewhere that can do this somehow. And Windows is always evolving, so
something new might exist. Windows Server is something of a different
animal than regular Windows PC versions, certainly with respect to its
file system support, so there might be something different there
regarding timekeeping, I don't know. I've never seen documentation of
any such thing, though.)
Combinations of SetSystemTime() and SetSystemTimeAdjustment() can adjust
the system clock. I've never tried to use them to tightly adjust system
time. It would probably not be an easy project because monitoring
accurate cause and effect would be tricky. I've played with
SetSystemTimeAdjustment(), and it definitely changes things a bit, but
never explored it carefully. But SetSystemTime() certainly works in the
context of setting values obtained from NTP.
These functions adjust the "System timer" which is responsible for
user-level FILETIME values and such. This is not the the primary CPU
clock, of course, which you'd dearly love to frequency lock to an
outside time source, but I know of no OS level call to do that. Of
course you could build a driver in ring-zero to give it a go, which
would be fun, but not a weekend project. :-) (Recommendation: do not try
anything with interrupts unless you are fond of blue-screens.)
I have never discovered any references to or documentation of exactly
how Windows synchronizes with NTP. Its a black box. (Any tips on this
appreciated). But from everything I've been able to observe and
experiment with it behaves the same as running an NTP client application
and using SetSystemTime() from the NTP results. That works fine, but
I've never tried to critically evaluate just how tightly this can be done.
As you probably know, some aspects of the clock and timer behavior
depend on the CPU model, BIOS, associated chip sets, and the Windows
power-management scheme in use by a given installation, of which there
are many from different Windows versions to support available hardware
technology on a given system. For example, the minimum (average) sleep
time available from ::Sleep() can vary from, like from 10 to 14
Milliseconds and higher on different systems. I've tested and verified
that. (Recommendation: never use ::Sleep() for anything; you've gotta do
it the hard way with thread synchronization mechanisms).
Most of my experience regarding tight timekeeping in Windows revolves
around obtaining media (video and audio) and device control (things like
VTR (video tape recorder) control) from external sources, displaying
those locally or over networks, or emitting media and control to
external devices. None of this is easy. Windows is not a real-time OS;
you have to repeat that mantra. Everything needs to be buffered.
Windows provides many OS systems calls, low-level interfaces, and APIs
for dealing with threading, media, and serial communications. There are
several "multi-media" clocks and APIs to chose from, including high
level APIs like DirectShow. Then there are all the third-party media
systems like Quicktime and Ffmpeg and a bunch of others. Then too there
is the whole other world of .NET.
Generally speaking these sorts of applications don't require
high-precision accurate date-and-time. But the new SMPTE focus on a
*fixed* date-time epoch (1588/PTP) timing scheme is what came to drive
my interest in this broader discussion.
-Brooks
>
> Martin
>
> _______________________________________________
> LEAPSECS mailing list
> LEAPSECS at leapsecond.com
> https://pairlist6.pair.net/mailman/listinfo/leapsecs
>
>
More information about the LEAPSECS
mailing list