1238510fcSJason Evans.\" 2c5e7e03aSRuslan Ermilov.\" Copyright (C) 2000 Jason Evans <jasone@FreeBSD.org>. All rights reserved. 3238510fcSJason Evans.\" 4238510fcSJason Evans.\" Redistribution and use in source and binary forms, with or without 5238510fcSJason Evans.\" modification, are permitted provided that the following conditions 6238510fcSJason Evans.\" are met: 7238510fcSJason Evans.\" 1. Redistributions of source code must retain the above copyright 8238510fcSJason Evans.\" notice(s), this list of conditions and the following disclaimer as 9238510fcSJason Evans.\" the first lines of this file unmodified other than the possible 10238510fcSJason Evans.\" addition of one or more copyright notices. 11238510fcSJason Evans.\" 2. Redistributions in binary form must reproduce the above copyright 12238510fcSJason Evans.\" notice(s), this list of conditions and the following disclaimer in the 13238510fcSJason Evans.\" documentation and/or other materials provided with the distribution. 14238510fcSJason Evans.\" 15238510fcSJason Evans.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 16238510fcSJason Evans.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17238510fcSJason Evans.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18238510fcSJason Evans.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 19238510fcSJason Evans.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20238510fcSJason Evans.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21238510fcSJason Evans.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22238510fcSJason Evans.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23238510fcSJason Evans.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24238510fcSJason Evans.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 25238510fcSJason Evans.\" DAMAGE. 26238510fcSJason Evans.\" 27238510fcSJason Evans.\" $FreeBSD$ 28238510fcSJason Evans.\" 29238510fcSJason Evans.Dd December 11, 2000 30238510fcSJason Evans.Dt CONDVAR 9 31238510fcSJason Evans.Os 32238510fcSJason Evans.Sh NAME 33238510fcSJason Evans.Nm condvar , 34238510fcSJason Evans.Nm cv_init , 35238510fcSJason Evans.Nm cv_destroy , 36238510fcSJason Evans.Nm cv_wait , 37238510fcSJason Evans.Nm cv_wait_sig , 38238510fcSJason Evans.Nm cv_timedwait , 39238510fcSJason Evans.Nm cv_timedwait_sig , 40238510fcSJason Evans.Nm cv_signal , 41238510fcSJason Evans.Nm cv_broadcast , 42f5531a09SJohn Baldwin.Nm cv_broadcastpri , 43238510fcSJason Evans.Nm cv_wmesg 44238510fcSJason Evans.Nd kernel condition variable 45238510fcSJason Evans.Sh SYNOPSIS 46f16b3c0dSChad David.In sys/param.h 47f16b3c0dSChad David.In sys/proc.h 4832eef9aeSRuslan Ermilov.In sys/condvar.h 49238510fcSJason Evans.Ft void 50238510fcSJason Evans.Fn cv_init "struct cv *cvp" "const char *desc" 51238510fcSJason Evans.Ft void 52238510fcSJason Evans.Fn cv_destroy "struct cv *cvp" 53238510fcSJason Evans.Ft void 54238510fcSJason Evans.Fn cv_wait "struct cv *cvp" "struct mtx *mp" 55238510fcSJason Evans.Ft int 56238510fcSJason Evans.Fn cv_wait_sig "struct cv *cvp" "struct mtx *mp" 57238510fcSJason Evans.Ft int 58238510fcSJason Evans.Fn cv_timedwait "struct cv *cvp" "struct mtx *mp" "int timo" 59238510fcSJason Evans.Ft int 60238510fcSJason Evans.Fn cv_timedwait_sig "struct cv *cvp" "struct mtx *mp" "int timo" 61238510fcSJason Evans.Ft void 62238510fcSJason Evans.Fn cv_signal "struct cv *cvp" 63238510fcSJason Evans.Ft void 64238510fcSJason Evans.Fn cv_broadcast "struct cv *cvp" 65238510fcSJason Evans.Ft void 66f5531a09SJohn Baldwin.Fn cv_broadcastpri "struct cv *cvp" "int pri" 67238510fcSJason Evans.Ft const char * 68238510fcSJason Evans.Fn cv_wmesg "struct cv *cvp" 69238510fcSJason Evans.Sh DESCRIPTION 70238510fcSJason EvansCondition variables are used in conjunction with mutexes to wait for conditions 71238510fcSJason Evansto occur. 72238510fcSJason EvansCondition variables are created with 73238510fcSJason Evans.Fn cv_init , 74238510fcSJason Evanswhere 7555f4342bSRuslan Ermilov.Fa cvp 76238510fcSJason Evansis a pointer to space for a 7755f4342bSRuslan Ermilov.Vt struct cv , 78238510fcSJason Evansand 7955f4342bSRuslan Ermilov.Fa desc 80238510fcSJason Evansis a pointer to a null-terminated character string that describes the condition 81238510fcSJason Evansvariable. 82238510fcSJason EvansCondition variables are destroyed with 83238510fcSJason Evans.Fn cv_destroy . 84238510fcSJason EvansThreads wait on condition variables by calling 85238510fcSJason Evans.Fn cv_wait , 86238510fcSJason Evans.Fn cv_wait_sig , 87238510fcSJason Evans.Fn cv_timedwait , 88238510fcSJason Evansor 89238510fcSJason Evans.Fn cv_timedwait_sig . 90238510fcSJason EvansThreads unblock waiters by calling 91238510fcSJason Evans.Fn cv_signal 92238510fcSJason Evansto unblock one waiter, or 93238510fcSJason Evans.Fn cv_broadcast 94f5531a09SJohn Baldwinor 95f5531a09SJohn Baldwin.Fn cv_broadcastpri 96238510fcSJason Evansto unblock all waiters. 97f5531a09SJohn BaldwinIn addition to waking waiters, 98f5531a09SJohn Baldwin.Fn cv_broadcastpri 992988974bSMike Pritchardensures that all of the waiters have a priority of at least 100f5531a09SJohn Baldwin.Fa pri 101f5531a09SJohn Baldwinby raising the priority of any threads that do not. 102238510fcSJason Evans.Fn cv_wmesg 103238510fcSJason Evansreturns the description string of 10455f4342bSRuslan Ermilov.Fa cvp , 105238510fcSJason Evansas set by the initial call to 106238510fcSJason Evans.Fn cv_init . 107238510fcSJason Evans.Pp 108238510fcSJason EvansA thread must hold 10955f4342bSRuslan Ermilov.Fa mp 110238510fcSJason Evansbefore calling 111238510fcSJason Evans.Fn cv_wait , 112238510fcSJason Evans.Fn cv_wait_sig , 113238510fcSJason Evans.Fn cv_timedwait , 114238510fcSJason Evansor 115238510fcSJason Evans.Fn cv_timedwait_sig . 116238510fcSJason EvansWhen a thread waits on a condition, 11755f4342bSRuslan Ermilov.Fa mp 118238510fcSJason Evansis atomically released before the thread is blocked, then atomically reacquired 119238510fcSJason Evansbefore the function call returns. 120238510fcSJason EvansAll waiters must pass the same 12155f4342bSRuslan Ermilov.Fa mp 122238510fcSJason Evansin conjunction with 12355f4342bSRuslan Ermilov.Fa cvp . 124238510fcSJason EvansA thread must hold 12555f4342bSRuslan Ermilov.Fa mp 126238510fcSJason Evanswhile calling 127f5531a09SJohn Baldwin.Fn cv_signal , 128238510fcSJason Evans.Fn cv_broadcast , 129f5531a09SJohn Baldwinor 130f5531a09SJohn Baldwin.Fn cv_broadcastpri 131238510fcSJason Evanseven though it isn't passed as an argument. 132238510fcSJason Evans.Pp 133238510fcSJason EvansWhen 134238510fcSJason Evans.Fn cv_wait , 135238510fcSJason Evans.Fn cv_wait_sig , 136238510fcSJason Evans.Fn cv_timedwait , 137238510fcSJason Evansand 138238510fcSJason Evans.Fn cv_timedwait_sig 139238510fcSJason Evansunblock, their calling threads are made runnable. 140238510fcSJason Evans.Fn cv_timedwait 141238510fcSJason Evansand 142238510fcSJason Evans.Fn cv_timedwait_sig 143238510fcSJason Evanswait for at most 14455f4342bSRuslan Ermilov.Fa timo 145238510fcSJason Evans/ 146238510fcSJason Evans.Dv HZ 147238510fcSJason Evansseconds before being unblocked and returning 148238510fcSJason Evans.Er EWOULDBLOCK ; 149238510fcSJason Evansotherwise, they return 0. 150238510fcSJason Evans.Fn cv_wait_sig 151238510fcSJason Evansand 152238510fcSJason Evans.Fn cv_timedwait_sig 153238510fcSJason Evansreturn prematurely with a value of 154238510fcSJason Evans.Er EINTR 155238510fcSJason Evansor 156238510fcSJason Evans.Er ERESTART 157238510fcSJason Evansif a signal is caught, or 0 if signaled via 158238510fcSJason Evans.Fn cv_signal 159238510fcSJason Evansor 160238510fcSJason Evans.Fn cv_broadcast . 161238510fcSJason Evans.Sh RETURN VALUES 162238510fcSJason EvansIf successful, 163238510fcSJason Evans.Fn cv_wait_sig , 164238510fcSJason Evans.Fn cv_timedwait , 165238510fcSJason Evansand 166238510fcSJason Evans.Fn cv_timedwait_sig 167238510fcSJason Evansreturn 0. 168238510fcSJason EvansOtherwise, a non-zero error code is returned. 169238510fcSJason Evans.Pp 170238510fcSJason Evans.Fn cv_wmesg 171238510fcSJason Evansreturns the description string that was passed to 172238510fcSJason Evans.Fn cv_init . 173238510fcSJason Evans.Sh ERRORS 174238510fcSJason Evans.Fn cv_wait_sig 175238510fcSJason Evansand 176238510fcSJason Evans.Fn cv_timedwait_sig 177238510fcSJason Evanswill fail if: 178238510fcSJason Evans.Bl -tag -width Er 179238510fcSJason Evans.It Bq Er EINTR 180238510fcSJason EvansAn unmasked signal was caught. 181238510fcSJason Evans.It Bq Er ERESTART 182238510fcSJason EvansA masked signal was caught. 183238510fcSJason Evans.El 184238510fcSJason Evans.Pp 185238510fcSJason Evans.Fn cv_timedwait 186238510fcSJason Evansand 187238510fcSJason Evans.Fn cv_timedwait_sig 188238510fcSJason Evanswill fail if: 189238510fcSJason Evans.Bl -tag -width Er 190238510fcSJason Evans.It Bq Er EWOULDBLOCK 191238510fcSJason EvansTimeout expired. 192238510fcSJason Evans.El 193238510fcSJason Evans.Sh SEE ALSO 194238510fcSJason Evans.Xr msleep 9 , 195a254506eSDima Dorfman.Xr mtx_pool 9 , 19642e5dee9SMike Silbersack.Xr mutex 9 , 19742e5dee9SMike Silbersack.Xr sema 9 , 19842e5dee9SMike Silbersack.Xr sx 9 199