xref: /freebsd/share/man/man9/condvar.9 (revision 2988974b586b3617fd24ad5b65598a1cfed01303)
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