gpsd-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gpsd-dev] Updated docs on NTP segment management


From: Eric S. Raymond
Subject: Re: [gpsd-dev] Updated docs on NTP segment management
Date: Sat, 7 Mar 2015 17:57:07 -0500
User-agent: Mutt/1.5.23 (2014-03-12)

Gary E. Miller <address@hidden>:
> I spot some doubles still on my hit list, so more clutter yet to go.

I wa AFK during this exchange.  But Gary is right - writing the small shim 
needed
ta make clock_gettime() available even on the Mac and systems without full
POSIX-2008 is trivial, and with a little autoconf hackery it's easy to hide the
seam from any system that doesn't have it natively.

/*
 * Simulate ANSI/POSIX conformance on platforms that don't have it
 *
 * This file is Copyright (c) 2010 by the GPSD project
 * BSD terms apply: see the file COPYING in the distribution root for details.
 */
#include <time.h>
#include <sys/time.h>

#include "compiler.h"

#ifdef __MACH__
#include <mach/clock.h>
#include <mach/mach.h>
#endif

#ifndef HAVE_CLOCK_GETTIME
int clock_gettime(clockid_t clk_id UNUSED, struct timespec *tp)
{
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
    clock_serv_t cclock;
    mach_timespec_t mts;
    host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
    clock_get_time(cclock, &mts);
    mach_port_deallocate(mach_task_self(), cclock);
    ts.tv_sec = mts.tv_sec;
    ts.tv_nsec = mts.tv_nsec;
#else
    struct timeval tv;
    if (gettimeofday(&tv, NULL) < 0)
        return -1;
    tp->ts_sec = tv.tv_sec;
    tp->ts_nsec = tv.tv_usec * 1000;
    /* paranoid programming */
    if (1000000 <= (tv)->tv_usec) {
        (tv)->tv_usec -= 1000000;
        (tv)->tv_sec++;
    } else if (0 > (tv)->tv_usec) {
        (tv)->tv_usec += 1000000;
        (tv)->tv_sec--;
    }
    return 0;
#endif /* __MACH__ */
}
#endif /* HAVE_CLOCK_GETTIME */

/* end */

That's really all there is to it.  Worst case is the host quietly does 
millisecond resolution in ns.

A related point of interest: now that Bionic has implemented getsid(), this
is pretty much the *only* API porting issue we have across our entire
platform range.  I believe POSIX-2001 confirmance is now effectively universal 
on Unixes and - by report - on recent Windows as well.

This is a reality the NTP project has not caught up with, and should.  What it
does (and I've been reading the code recently) is good portability practice
for about 10 to 12 years ago.

Toolchains are really much more standardized today, and the
possibilities for reducing code complexity are major.
-- 
                <a href="http://www.catb.org/~esr/";>Eric S. Raymond</a>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]