Posix threads: CLOCK_REALTIME/CLOCK_MONOTONIC

John Baldwin jhb at FreeBSD.org
Wed Jun 29 09:14:00 GMT 2005


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 at FreeBSD.org as that is where all 
the guys who implement the thread libraries hang out. :)

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-hackers mailing list