Posix threads: CLOCK_REALTIME/CLOCK_MONOTONIC

From: Norbert Koch (NKoch_at_demig.de)
Date: 06/29/05

  • Next message: Seb: "Re: Accessing filesystem from a KLD"
    To: "Freebsd-Hackers@Freebsd. Org" <freebsd-hackers@freebsd.org>
    Date: Wed, 29 Jun 2005 09:57:11 +0200
    
    

    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?

    Norbert

    _______________________________________________
    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: Seb: "Re: Accessing filesystem from a KLD"