Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Nov 2011 00:54:37 +0100
From:      Jilles Tjoelker <jilles@stack.nl>
To:        freebsd-threads@freebsd.org
Subject:   [patch] Fix pthread_cond_timedwait() in realtime thread or with PI or PP mutex
Message-ID:  <20111116235437.GA31850@stack.nl>

next in thread | raw e-mail | index | archive | help
As reported in PR 162403, pthread_cond_timedwait()'s timeout is broken
if the kernel condition variable is used (that means, when it is called
from a thread with realtime priority or with a priority-inherit or
priority-protect mutex; process-shared mutexes and condition variables
do not currently work).

The below patch appears to work in my testing and for the PR submitter.
I would like to see this in 9.0, if possible.

Index: lib/libthr/thread/thr_umtx.c
===================================================================
--- lib/libthr/thread/thr_umtx.c	(revision 226880)
+++ lib/libthr/thread/thr_umtx.c	(working copy)
@@ -231,7 +231,7 @@
 
 int
 _thr_ucond_wait(struct ucond *cv, struct umutex *m,
-	const struct timespec *timeout, int check_unparking)
+	const struct timespec *timeout, int flags)
 {
 	if (timeout && (timeout->tv_sec < 0 || (timeout->tv_sec == 0 &&
 	    timeout->tv_nsec <= 0))) {
@@ -240,7 +240,7 @@
                 return (ETIMEDOUT);
 	}
 	return _umtx_op_err(cv, UMTX_OP_CV_WAIT,
-		     check_unparking ? UMTX_CHECK_UNPARKING : 0, 
+		     flags,
 		     m, __DECONST(void*, timeout));
 }
  
Index: lib/libthr/thread/thr_umtx.h
===================================================================
--- lib/libthr/thread/thr_umtx.h	(revision 226880)
+++ lib/libthr/thread/thr_umtx.h	(working copy)
@@ -55,7 +55,7 @@
 	const struct timespec *timeout, int shared) __hidden;
 int _thr_umtx_wake(volatile void *mtx, int count, int shared) __hidden;
 int _thr_ucond_wait(struct ucond *cv, struct umutex *m,
-        const struct timespec *timeout, int check_unpaking) __hidden;
+        const struct timespec *timeout, int flags) __hidden;
 void _thr_ucond_init(struct ucond *cv) __hidden;
 int _thr_ucond_signal(struct ucond *cv) __hidden;
 int _thr_ucond_broadcast(struct ucond *cv) __hidden;

-- 
Jilles Tjoelker



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20111116235437.GA31850>