Package: kfreebsd-image-9.0-1-amd64
Version: 9.0-3
Severity: important
File: kfreebsd-9
Tags: upstream
Hi,
when using pthread_cond_timedwait, it often returns immediately with
the error ETIMEDOUT regardless to the length of the timeout passed to the
function. I have provided a C program that illustrates the problem.
It affects the upstream version (obtained by kfreebsd-downloader).
I have found a thread that, I believe, discusses about the issue:
http://freebsd.1045724.n5.nabble.com/pthread-cond-timedwait-broken-in-9-stable-from-JAN-10-td5487565.html
I would normally not report the bug since it seems already reported
upstream. However, I stumbled into this problem while I was trying to fix an
RC-bug (#673681) and according to the linked thread, there might be a small
patch that could fix the issue.
Thanks for considering the problem,
Cheers
Nicolas Bourdaud
-- System Information:
Debian Release: wheezy/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: kfreebsd-amd64 (x86_64)
Kernel: kFreeBSD 9.0-RELEASE
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Versions of packages kfreebsd-image-9.0-1-amd64 depends on:
ii devd 9.0+ds1-4
ii freebsd-utils 9.0+ds1-4
ii kbdcontrol 9.0+ds1-4
ii kldutils 9.0+ds1-4
kfreebsd-image-9.0-1-amd64 recommends no packages.
kfreebsd-image-9.0-1-amd64 suggests no packages.
-- no debconf information
#include stdio.h
#include pthread.h
#include errno.h
#include time.h
#include stdlib.h
#define DELTA 4 //400ms
#define NS_PER_MS 100
#define NS_PER_SEC 10
void addtime(struct timespec* res, struct timespec* ref, long delta)
{
res-tv_sec = ref-tv_sec;
res-tv_nsec = ref-tv_nsec + delta;
if (res-tv_nsec = NS_PER_SEC) {
res-tv_nsec -= NS_PER_SEC;
res-tv_sec++;
}
}
int main(void)
{
int i;
struct timespec ts, to;
pthread_mutex_t lock;
pthread_cond_t cond;
pthread_mutex_init(lock, NULL);
pthread_cond_init(cond, NULL);
for (i=0; i10; i++) {
clock_gettime(CLOCK_REALTIME, ts);
printf(start: sec:%li msec:%li\n, (long)ts.tv_sec, ts.tv_nsec/NS_PER_MS);
addtime(to, ts, DELTA);
pthread_mutex_lock(lock);
while (pthread_cond_timedwait(cond, lock, to) != ETIMEDOUT);
pthread_mutex_unlock(lock);
clock_gettime(CLOCK_REALTIME, ts);
printf(end: sec:%li msec:%li\n, (long)ts.tv_sec, ts.tv_nsec/NS_PER_MS);
}
pthread_mutex_destroy(lock);
pthread_cond_destroy(cond);
return EXIT_SUCCESS;
}