Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Nov 2011 22:20:07 GMT
From:      Jilles Tjoelker <jilles@stack.nl>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: misc/162403: regression in FreeBSD/9 regarding pthread timeouts in kernel context
Message-ID:  <201111102220.pAAMK7oJ008349@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR misc/162403; it has been noted by GNATS.

From: Jilles Tjoelker <jilles@stack.nl>
To: bug-followup@FreeBSD.org, davidxu@FreeBSD.org, ag-freebsd@muc.de
Cc:  
Subject: Re: misc/162403: regression in FreeBSD/9 regarding pthread timeouts
 in kernel context
Date: Thu, 10 Nov 2011 23:14:46 +0100

 > [pthread_cond_timedwait() does not time out when called from RT
 > priority process]
 
 It looks like _thr_ucond_wait() drops the flags such as CVWAIT_ABSTIME
 and CVWAIT_CLOCKID that may be passed from cond_wait_kernel() in
 thr_cond.c. The below patch fixes the problem for me.
 
 Testing and review would be nice.
 
 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?201111102220.pAAMK7oJ008349>