On Mon, Feb 27, 2012 at 01:38:52PM +0000, David Xu wrote: > Author: davidxu > Date: Mon Feb 27 13:38:52 2012 > New Revision: 232209 > URL: http://svn.freebsd.org/changeset/base/232209 > > Log: > Follow changes made in revision 232144, pass absolute timeout to kernel, > this eliminates a clock_gettime() syscall.
This or some other change has broken CLOCK_MONOTONIC usage with condition variables. You should be able to reproduce this by something like this: pthread_cond_t cv; pthread_condattr_t attr; pthread_mutex_t lock; struct timespec ts; int error; (void)pthread_mutex_init(&lock, NULL); (void)pthread_condattr_init(&attr); (void)pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); (void)pthread_cond_init(&cv, &attr); (void)pthread_condattr_destroy(&attr); (void)clock_gettime(CLOCK_MONOTONIC, &ts); ts.tv_sec += 10; (void)pthread_mutex_lock(&lock); (void)pthread_cond_timedwait(&cv, &lock, &ts); (void)pthread_mutex_unlock(&lock); This should timeout after 10 seconds, but pthread_cond_timedwait(3) returns immediately with ETIMEDOUT. CLOCK_REALTIME works properly. Bascially pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) is no-op. If you change CLOCK_MONOTONIC to CLOCK_REALTIME in clock_gettime(2) call, it will timeout after 10 seconds. -- Pawel Jakub Dawidek http://www.wheelsystems.com FreeBSD committer http://www.FreeBSD.org Am I Evil? Yes, I Am! http://tupytaj.pl
pgp18JNvAfgtP.pgp
Description: PGP signature