8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man3c / cond_init.3c
blob47e1910e9d171a9a9d33f9c0cdb26c27aafec1c8
1 '\" te
2 .\" Copyright (c) 2007, Sun Microsystems, Inc.  All Rights Reserved.
3 .\" Portions Copyright (c) 2001, the Institute of Electrical and Electronics Engineers, Inc. and The Open Group. All Rights Reserved.
4 .\" Portions Copyright (c) 1995 IEEE.  All Rights Reserved.
5 .\" Sun Microsystems, Inc. gratefully acknowledges The Open Group for permission to reproduce portions of its copyrighted documentation. Original documentation from The Open Group can be obtained online at
6 .\" http://www.opengroup.org/bookstore/.
7 .\" The Institute of Electrical and Electronics Engineers and The Open Group, have given us permission to reprint portions of their documentation. In the following statement, the phrase "this text" refers to portions of the system documentation. Portions of this text are reprinted and reproduced in electronic form in the Sun OS Reference Manual, from IEEE Std 1003.1, 2004 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2004 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between these versions and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html.
8 .\"  This notice shall appear on any product containing this material.
9 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
10 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
11 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
12 .TH COND_INIT 3C "Jun 5, 2007"
13 .SH NAME
14 cond_init, cond_wait, cond_timedwait, cond_reltimedwait, cond_signal,
15 cond_broadcast, cond_destroy \- condition variables
16 .SH SYNOPSIS
17 .LP
18 .nf
19 cc -mt [ \fIflag\fR... ] \fIfile\fR... [ \fIlibrary\fR... ]
20 #include <thread.h>
21 #include <synch.h>
23 \fBint\fR \fBcond_init\fR(\fBcond_t *\fR\fIcvp\fR, \fBint\fR \fItype\fR, \fBvoid *\fR\fIarg\fR);
24 .fi
26 .LP
27 .nf
28 \fBint\fR \fBcond_wait\fR(\fBcond_t *\fR\fIcvp\fR, \fBmutex_t *\fR\fImp\fR);
29 .fi
31 .LP
32 .nf
33 \fBint\fR \fBcond_timedwait\fR(\fBcond_t *\fR\fIcvp\fR, \fBmutex_t *\fR\fImp\fR,
34      \fBtimestruc_t *\fR\fIabstime\fR);
35 .fi
37 .LP
38 .nf
39 \fBint\fR \fBcond_reltimedwait\fR(\fBcond_t *\fR\fIcvp\fR, \fBmutex_t *\fR\fImp\fR,
40      \fBtimestruc_t *\fR\fIreltime\fR);
41 .fi
43 .LP
44 .nf
45 \fBint\fR \fBcond_signal\fR(\fBcond_t *\fR\fIcvp\fR);
46 .fi
48 .LP
49 .nf
50 \fBint\fR \fBcond_broadcast\fR(\fBcond_t *\fR\fIcvp\fR);
51 .fi
53 .LP
54 .nf
55 \fBint\fR \fBcond_destroy\fR(\fBcond_t *\fR\fIcvp\fR);
56 .fi
58 .SH DESCRIPTION
59 .SS "Initialize"
60 .sp
61 .LP
62 Condition variables and mutexes should be global. Condition variables that are
63 allocated in writable memory can synchronize threads among processes if they
64 are shared by the cooperating processes (see \fBmmap\fR(2)) and are initialized
65 for this purpose.
66 .sp
67 .LP
68 The scope of a condition variable is either intra-process or inter-process.
69 This is dependent upon whether the argument is passed implicitly or explicitly
70 to the initialization of that condition variable. A condition variable does not
71 need to be explicitly initialized. A condition variable is initialized with all
72 zeros, by default, and its scope is set to within the calling process. For
73 inter-process synchronization, a condition variable must be initialized once,
74 and only once, before use.
75 .sp
76 .LP
77 A condition variable must not be simultaneously initialized by multiple threads
78 or re-initialized while in use by other threads.
79 .sp
80 .LP
81 Attributes of condition variables can be set to the default or customized at
82 initialization.
83 .sp
84 .LP
85 The \fBcond_init()\fR function initializes the condition variable pointed to by
86 \fIcvp\fR. A condition variable can have several different types of behavior,
87 specified by \fItype\fR. No current type uses  \fIarg\fR although a future type
88 may specify additional behavior parameters with \fIarg\fR. The \fItype\fR
89 argument c take one of the following values:
90 .sp
91 .ne 2
92 .na
93 \fB\fBUSYNC_THREAD\fR\fR
94 .ad
95 .RS 17n
96 The condition variable can synchronize  threads only in this process. This is
97 the default.
98 .RE
101 .ne 2
103 \fB\fBUSYNC_PROCESS\fR\fR
105 .RS 17n
106 The condition variable can synchronize threads in this process and other
107 processes. Only one process should initialize the condition variable. The
108 object initialized with this attribute must be allocated in memory shared
109 between processes, either in System V shared memory (see \fBshmop\fR(2)) or in
110 memory mapped to a file (see \fBmmap\fR(2)). It is illegal to initialize the
111 object this way and to not allocate it in such shared memory.
116 Initializing condition variables can also be accomplished by allocating in
117 zeroed memory, in which case, a \fItype\fR of \fBUSYNC_THREAD\fR is assumed.
120 If default condition variable attributes are used, statically allocated
121 condition variables can be initialized by the macro \fBDEFAULTCV\fR.
124 Default condition variable initialization (intra-process):
126 .in +2
128 cond_t cvp;
130 cond_init(&cvp, NULL, NULL); /*initialize condition variable
131                                 with default*/
133 .in -2
139 .in +2
141 cond_init(&cvp, USYNC_THREAD, NULL);
143 .in -2
149 .in +2
151 cond_t  cond  = DEFAULTCV;
153 .in -2
157 Customized condition variable initialization (inter-process):
159 .in +2
161 cond_init(&cvp, USYNC_PROCESS, NULL); /* initialize cv with
162                                         inter-process scope */
164 .in -2
166 .SS "Condition Wait"
169 The condition wait interface allows a thread to wait for a condition and
170 atomically release the associated mutex that it needs to hold to check the
171 condition. The thread waits for another thread to make the condition true and
172 that thread's resulting call to signal and wakeup the waiting thread.
175 The \fBcond_wait()\fR function atomically releases the mutex pointed to by
176 \fImp\fR and causes the calling thread to block on the condition variable
177 pointed to by \fIcvp\fR. The blocked thread may be awakened by
178 \fBcond_signal()\fR, \fBcond_broadcast()\fR, or when interrupted by delivery of
179 a  \fBUNIX\fR signal or a \fBfork()\fR.
182 The \fBcond_wait()\fR, \fBcond_timedwait()\fR, and \fBcond_reltimedwait()\fR
183 functions always return with the mutex locked and owned by the calling thread
184 even when returning an error, except when the mutex has the \fBLOCK_ROBUST\fR
185 attribute and has been left irrecoverable by the mutex's last owner. The
186 \fBcond_wait()\fR, \fBcond_timedwait()\fR, and \fBcond_reltimedwait()\fR
187 functions return the appropriate error value if they fail to internally
188 reacquire the mutex.
189 .SS "Condition Signaling"
192 A condition signal allows a thread to unblock a single thread waiting on the
193 condition variable, whereas a condition broadcast allows a thread to unblock
194 all threads waiting on the condition variable.
197 The \fBcond_signal()\fR function unblocks one thread that is blocked on the
198 condition variable pointed to by \fIcvp\fR.
201 The \fBcond_broadcast()\fR function unblocks all threads that are blocked on
202 the condition variable pointed to by \fIcvp\fR.
205 If no threads are blocked on the condition variable, then \fBcond_signal()\fR
206 and \fBcond_broadcast()\fR have no effect.
209 The \fBcond_signal()\fR or \fBcond_broadcast()\fR functions can be called by a
210 thread whether or not it currently owns the mutex that threads calling
211 \fBcond_wait()\fR, \fBcond_timedwait()\fR, or \fBcond_reltimedwait()\fR have
212 associated with the condition variable during their waits. If, however,
213 predictable scheduling behavior is required, then that mutex should be locked
214 by the thread prior to calling \fBcond_signal()\fR or \fBcond_broadcast()\fR.
215 .SS "Destroy"
218 The condition destroy functions destroy any state, but not the space,
219 associated with the condition variable.
222 The \fBcond_destroy()\fR function destroys any state associated with the
223 condition variable pointed to by \fIcvp\fR. The space for storing the condition
224 variable is not freed.
225 .SH RETURN VALUES
228 Upon successful completion, these functions return \fB0\fR. Otherwise, a
229 non-zero value is returned to indicate the error.
230 .SH ERRORS
233 The \fBcond_timedwait()\fR and \fBcond_reltimedwait()\fR functions will fail
236 .ne 2
238 \fB\fBETIME\fR\fR
240 .RS 9n
241 The time specified by \fIabstime\fR or \fIreltime\fR has passed.
246 The \fBcond_wait()\fR, \fBcond_timedwait()\fR, and \fBcond_reltimedwait()\fR
247 functions will fail if:
249 .ne 2
251 \fB\fBEINTR\fR\fR
253 .RS 9n
254 Interrupted. The calling thread was awakened by the delivery of a UNIX signal.
259 If the mutex pointed to by \fImp\fR is a robust mutex (initialized with the
260 \fBLOCK_ROBUST\fR attribute), the \fBcond_wait()\fR, \fBcond_timedwait()\fR and
261 \fBcond_reltimedwait()\fR functions will, under the specified conditions,
262 return the following error values.  For complete information, see the
263 description of the \fBmutex_lock()\fR function on the \fBmutex_init\fR(3C)
264 manual page.
266 .ne 2
268 \fB\fBENOTRECOVERABLE\fR\fR
270 .RS 19n
271 The mutex was protecting the state that has now been left irrecoverable. The
272 mutex has not been acquired.
276 .ne 2
278 \fB\fBEOWNERDEAD\fR\fR
280 .RS 19n
281 The last owner of the mutex died while  holding the mutex, possibly leaving the
282 state it was protecting inconsistent. The mutex is now owned by the caller.
287 These functions may fail if:
289 .ne 2
291 \fB\fBEFAULT\fR\fR
293 .RS 10n
294 The \fIcond\fR, \fIattr\fR, \fIcvp\fR, \fIarg\fR, \fIabstime\fR, or \fImutex\fR
295 argument points to an illegal address.
299 .ne 2
301 \fB\fBEINVAL\fR\fR
303 .RS 10n
304 Invalid argument. For \fBcond_init()\fR, \fItype\fR is not a recognized type.
305 For \fBcond_timedwait()\fR, the number of nanoseconds is greater than or equal
306 to 1,000,000,000.
309 .SH EXAMPLES
311 \fBExample 1 \fRUse \fBcond_wait()\fR in a loop to test some condition.
314 The \fBcond_wait()\fR functin is normally used in a loop testing some
315 condition, as follows:
318 .in +2
320 (void) mutex_lock(mp);
321 while (cond == FALSE) {
322      (void) cond_wait(cvp, mp);
324 (void) mutex_unlock(mp);
326 .in -2
329 \fBExample 2 \fRUse \fBcond_timedwait()\fR in a loop to test some condition.
332 The \fBcond_timedwait()\fR function is normally used in a loop testing some
333 condition.  It uses an absolute timeout value as follows:
336 .in +2
338 timestruc_t to;
339 \&...
340 (void) mutex_lock(mp);
341 to.tv_sec = time(NULL) + TIMEOUT;
342 to.tv_nsec = 0;
343 while (cond == FALSE) {
344       err = cond_timedwait(cvp, mp, &to);
345       if (err == ETIME) {
346             /* timeout, do something */
347             break;
348       }
350 (void) mutex_unlock(mp);
352 .in -2
355 \fBExample 3 \fRUse \fBcond_reltimedwait()\fR in a loop to test some condition.
358 The \fBcond_reltimedwait()\fR function is normally used in a loop testing in
359 some condition. It uses a relative timeout value as follows:
362 .in +2
364 timestruc_t to;
365 \&...
366 (void) mutex_lock(mp);
367 while (cond == FALSE) {
368      to.tv_sec = TIMEOUT;
369      to.tv_nsec = 0;
370      err = cond_reltimedwait(cvp, mp, &to);
371      if (err == ETIME) {
372           /* timeout, do something */
373           break;
374      }
376 (void) mutex_unlock(mp);
378 .in -2
380 .SH ATTRIBUTES
383 See \fBattributes\fR(5) for descriptions of the following attributes:
388 box;
389 c | c
390 l | l .
391 ATTRIBUTE TYPE  ATTRIBUTE VALUE
393 MT-Level        MT-Safe
396 .SH SEE ALSO
399 \fBfork\fR(2), \fBmmap\fR(2), \fBsetitimer\fR(2), \fBshmop\fR(2),
400 \fBmutex_init\fR(3C), \fBsignal\fR(3C), \fBattributes\fR(5),
401 \fBcondition\fR(5), \fBmutex\fR(5), \fBstandards\fR(5)
402 .SH NOTES
405 If more than one thread is blocked on a condition variable, the order in which
406 threads are unblocked is determined by the scheduling policy. When each thread,
407 unblocked as a result of a \fBcond_signal()\fR or \fBcond_broadcast()\fR,
408 returns from its call to \fBcond_wait()\fR or \fBcond_timedwait()\fR , the
409 thread owns the mutex with which it called \fBcond_wait()\fR,
410 \fBcond_timedwait()\fR, or \fBcond_reltimedwait()\fR. The thread(s) that are
411 unblocked compete for the mutex according to the scheduling policy and as if
412 each had called \fBmutex_lock\fR(3C).
415 When \fBcond_wait()\fR returns the value of the condition is indeterminate and
416 must be reevaluated.
419 The \fBcond_timedwait()\fR and \fBcond_reltimedwait()\fR functions are similar
420 to \fBcond_wait()\fR, except that the calling thread will not wait for the
421 condition to become true past the absolute time specified by \fIabstime\fR or
422 the relative time specified by \fIreltime\fR. Note that \fBcond_timedwait()\fR
423 or \fBcond_reltimedwait()\fR might continue to block as it trys to reacquire
424 the mutex pointed to by \fImp\fR, which may be locked by another thread. If
425 either \fBcond_timedwait()\fR or \fBcond_reltimedwait()\fR returns because of a
426 timeout, it returns the error value \fBETIME\fR.