Re: Posix threads: CLOCK_REALTIME/CLOCK_MONOTONIC

From: John Baldwin (jhb_at_FreeBSD.org)
Date: 06/29/05

  • Next message: John Baldwin: "Re: problem handling POSIX thread on FreeBSD"
    To: freebsd-hackers@FreeBSD.org
    Date: Wed, 29 Jun 2005 04:52:41 -0400
    
    

    On Wednesday 29 June 2005 03:57 am, Norbert Koch wrote:
    > Hello.
    >
    > I am working on a multi-threaded application which
    > may call settimeofday() and therefore may have
    > serious problems with timing calculations.
    >
    > In my applications I calclulate time differences
    > using clock_gettime(CLOCK_MONOTONIC) under FreeBSD-5.
    > Under FreeBSD-4 it is a trivial kernel patch in kern_time.c
    > to have CLOCK_MONOTONIC, as there already is a kernel function
    > nanouptime().
    >
    > int
    > clock_gettime(p, uap)
    > struct proc *p;
    > struct clock_gettime_args *uap;
    > {
    > struct timespec ats;
    >
    > switch (SCARG(uap, clock_id)) {
    > case CLOCK_REALTIME:
    > nanotime(&ats);
    > break;
    >
    > case CLOCK_MONOTONIC:
    > nanouptime(&ats);
    > break;
    >
    > default:
    > return (EINVAL);
    > };
    > return (copyout(&ats, SCARG(uap, tp), sizeof(ats)));
    > }
    >
    >
    >
    >
    > Looking through the sources of the various threading libraries
    > I found that either gettimeofday() or clock_gettime(CLOCK_REALTIME)
    > is used for all calculations.
    >
    > I am not sure, what posix currently says about this
    > but found a chapter 'Condition variable wait clock' in [Butenhof] (p.359).
    > As I understand it, Posix.1j expects an implementation to
    > - at least for pthread_cond_timedwait() - use CLOCK_MONOTONIC by default.
    > They introduce a new function pair pthread_condattr_(get|set)clock()
    > to change pthread_cond_timedwait() to use either CLOCK_MONOTONIC or
    > CLOCK_REALTIME.
    >
    > >From my understanding of the threading libraries' internals, it
    >
    > should be trivial to modify them to using CLOCK_MONOTONIC only, but not
    > quite as trivial to implement pthread_condattr_(get|set)clock().
    >
    > For FreeBSD-4 I already have a modified libc_r, where I call
    > clock_gettime(CLOCK_MONOTONIC) once in _thread_init() and set
    > a global variable _sched_clkid to either CLOCK_MONOTONIC or CLOCK_REALTIME
    > for further calls to clock_gettime().
    >
    > Any comments/ideas/opinions?

    You probably want to bring this up on threads@FreeBSD.org as that is where all
    the guys who implement the thread libraries hang out. :)

    -- 
    John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
    "Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
    _______________________________________________
    freebsd-hackers@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
    To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
    

  • Next message: John Baldwin: "Re: problem handling POSIX thread on FreeBSD"