1dcdfe824SRobert Mustacchi.\"
2dcdfe824SRobert Mustacchi.\" This file and its contents are supplied under the terms of the
3dcdfe824SRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
4dcdfe824SRobert Mustacchi.\" You may only use this file in accordance with the terms of version
5dcdfe824SRobert Mustacchi.\" 1.0 of the CDDL.
6dcdfe824SRobert Mustacchi.\"
7dcdfe824SRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
8dcdfe824SRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
9dcdfe824SRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
10dcdfe824SRobert Mustacchi.\"
11dcdfe824SRobert Mustacchi.\"
12dcdfe824SRobert Mustacchi.\" Copyright 2016 Joyent, Inc.
13dcdfe824SRobert Mustacchi.\"
14dcdfe824SRobert Mustacchi.Dd "Jan 11, 2015"
15dcdfe824SRobert Mustacchi.Dt CND 3C
16dcdfe824SRobert Mustacchi.Os
17dcdfe824SRobert Mustacchi.Sh NAME
18dcdfe824SRobert Mustacchi.Nm cnd
19dcdfe824SRobert Mustacchi.Nm cnd_broadcast ,
20dcdfe824SRobert Mustacchi.Nm cnd_destroy ,
21dcdfe824SRobert Mustacchi.Nm cnd_init ,
22dcdfe824SRobert Mustacchi.Nm cnd_signal ,
23dcdfe824SRobert Mustacchi.Nm cnd_timedwait ,
24dcdfe824SRobert Mustacchi.Nm cnd_wait
25dcdfe824SRobert Mustacchi.Nd C11 condition variable functions
26dcdfe824SRobert Mustacchi.Sh SYNOPSIS
27dcdfe824SRobert Mustacchi.In threads.h
28dcdfe824SRobert Mustacchi.Ft int
29dcdfe824SRobert Mustacchi.Fo cnd_init
30dcdfe824SRobert Mustacchi.Fa "cnd_t *cnd"
31dcdfe824SRobert Mustacchi.Fc
32dcdfe824SRobert Mustacchi.Ft void
33dcdfe824SRobert Mustacchi.Fo cnd_destroy
34dcdfe824SRobert Mustacchi.Fa "cnd_t *cnd"
35dcdfe824SRobert Mustacchi.Fc
36dcdfe824SRobert Mustacchi.Ft int
37dcdfe824SRobert Mustacchi.Fo cnd_broadcast
38dcdfe824SRobert Mustacchi.Fa "cnd_t *cnd"
39dcdfe824SRobert Mustacchi.Fc
40dcdfe824SRobert Mustacchi.Ft int
41dcdfe824SRobert Mustacchi.Fo cnd_signal
42dcdfe824SRobert Mustacchi.Fa "cnd_t *cnd"
43dcdfe824SRobert Mustacchi.Fc
44dcdfe824SRobert Mustacchi.Ft int
45dcdfe824SRobert Mustacchi.Fo cnd_timedwait
46dcdfe824SRobert Mustacchi.Fa "cnd_t *restrict cnd"
47dcdfe824SRobert Mustacchi.Fa "mtx_t *restrict mtx"
48dcdfe824SRobert Mustacchi.Fa "const struct timespec *abstime"
49dcdfe824SRobert Mustacchi.Fc
50dcdfe824SRobert Mustacchi.Ft int
51dcdfe824SRobert Mustacchi.Fo cnd_wait
52dcdfe824SRobert Mustacchi.Fa "cnd_t *restrict cnd"
53dcdfe824SRobert Mustacchi.Fa "mtx_t *restrict mtx"
54dcdfe824SRobert Mustacchi.Fc
55dcdfe824SRobert Mustacchi.Sh DESCRIPTION
56dcdfe824SRobert MustacchiThe
57dcdfe824SRobert Mustacchi.Sy cnd
58dcdfe824SRobert Mustacchifamily of functions implement condition variables which allow threads
59dcdfe824SRobert Mustacchiwithin a process to wait until a condition occurs and be signaled when
60dcdfe824SRobert Mustacchiit does. These functions behave similar to both the POSIX threads and
61dcdfe824SRobert Mustacchiillumos threads; however, they have slightly different call signatures
62dcdfe824SRobert Mustacchiand return values. For more information, see
63dcdfe824SRobert Mustacchi.Xr threads 5 .
64dcdfe824SRobert MustacchiImportantly, they do not allow for inter-process synchronization.
65dcdfe824SRobert Mustacchi.Ss Creating and Destroy Condition Variables
66dcdfe824SRobert MustacchiThe function
67dcdfe824SRobert Mustacchi.Fn cnd_init
68dcdfe824SRobert Mustacchiinitializes the condition variable referred to by
69dcdfe824SRobert Mustacchi.Fa cnd .
70dcdfe824SRobert MustacchiThe condition variable is suitable for intra-process use. Initializing
71dcdfe824SRobert Mustacchian already initialized condition variable results in undefined behavior.
72dcdfe824SRobert Mustacchi.Pp
73dcdfe824SRobert MustacchiThe function
74dcdfe824SRobert Mustacchi.Fn cnd_destroy
75dcdfe824SRobert Mustacchidestroys an initialized condition variable at which point it is illegal
76dcdfe824SRobert Mustacchito use it, though it may be initialized again.
77dcdfe824SRobert Mustacchi.Ss Condition Waiting
78dcdfe824SRobert MustacchiThe function
79dcdfe824SRobert Mustacchi.Fn cond_wait
80dcdfe824SRobert Mustacchican be used to wait on a condition variable. A thread that waits on a
81dcdfe824SRobert Mustacchicondition variable blocks until another thread signals that the
82dcdfe824SRobert Mustacchicondition has changed, generally after making the condition that was
83dcdfe824SRobert Mustacchifalse, true.
84dcdfe824SRobert Mustacchi.Pp
85dcdfe824SRobert MustacchiThe function
86dcdfe824SRobert Mustacchi.Fn cond_wait
87dcdfe824SRobert Mustacchiatomically release the mutex pointed to by
88dcdfe824SRobert Mustacchi.Fa mtx
89dcdfe824SRobert Mustacchiand blocks on the condition variable
90dcdfe824SRobert Mustacchi.Fa cond .
91dcdfe824SRobert MustacchiWhen the thread returns, it will once again be holding
92dcdfe824SRobert Mustacchi.Fa mtx
93dcdfe824SRobert Mustacchiand must check the current state of the condition. There is no
94dcdfe824SRobert Mustacchiguarantee that another thread has not gotten in and changed the value
95dcdfe824SRobert Mustacchibefore being woken. In addition, a thread blocking on a condition
96dcdfe824SRobert Mustacchivariable, may be woken spuriously, such as when a signal is received or
97dcdfe824SRobert Mustacchi.Fn fork
98dcdfe824SRobert Mustacchiis called .
99dcdfe824SRobert Mustacchi.Pp
100dcdfe824SRobert MustacchiThe function
101dcdfe824SRobert Mustacchi.Fn cond_timedwait
102dcdfe824SRobert Mustacchiallows a thread to block in a similar fashion to
103dcdfe824SRobert Mustacchi.Fn cond_wait ,
104dcdfe824SRobert Mustacchiexcept that when the absolute time specified in seconds since the epoch
105dcdfe824SRobert Mustacchi(based on
106dcdfe824SRobert Mustacchi.Sy CLOCK_REALTIME )
107dcdfe824SRobert Mustacchiin UTC, expires, then the thread will be woken up. The timeout is
108dcdfe824SRobert Mustacchispecified in
109dcdfe824SRobert Mustacchi.Fa abstime .
110dcdfe824SRobert Mustacchi.Ss Conditional Signaling
111dcdfe824SRobert MustacchiThe
112dcdfe824SRobert Mustacchi.Fn cnd_signal
113dcdfe824SRobert Mustacchiand
114dcdfe824SRobert Mustacchi.Fn cnd_broadcast
115dcdfe824SRobert Mustacchifunctions can be used to signal threads waiting on the condition variable
116dcdfe824SRobert Mustacchi.Fa cnd
117dcdfe824SRobert Mustacchithat they should be woken up and check the variable again. The
118dcdfe824SRobert Mustacchi.Fn cnd_signal
119dcdfe824SRobert Mustacchifunction will only wake a single thread that is blocked on the
120dcdfe824SRobert Mustacchicondition variable
121dcdfe824SRobert Mustacchi.Fa cnd ;
122dcdfe824SRobert Mustacchiwhile
123dcdfe824SRobert Mustacchi.Fn cnd_broadcast
124dcdfe824SRobert Mustacchiwill wake up every thread waiting on the condition variable
125dcdfe824SRobert Mustacchi.Fa cnd .
126dcdfe824SRobert Mustacchi.Pp
127dcdfe824SRobert MustacchiA thread calling either
128dcdfe824SRobert Mustacchi.Fn cnd_signal
129dcdfe824SRobert Mustacchior
130dcdfe824SRobert Mustacchi.Fn cnd_broadcast
131dcdfe824SRobert Mustacchiis not required to hold any of the mutexes that are associated with the
132dcdfe824SRobert Mustacchicondition variable.
133dcdfe824SRobert Mustacchi.Pp
134dcdfe824SRobert MustacchiIf there are no threads currently blocked in the condition variable
135dcdfe824SRobert Mustacchi.Fa cnd
136dcdfe824SRobert Mustacchithen neither function has an effect.
137dcdfe824SRobert Mustacchi.Sh RETURN VALUES
138dcdfe824SRobert MustacchiUpon successful completion, the
139dcdfe824SRobert Mustacchi.Fn cond_init
140dcdfe824SRobert Mustacchifunction returns
141dcdfe824SRobert Mustacchi.Sy thrd_success.
142dcdfe824SRobert MustacchiIf insufficient memory was available, then
143dcdfe824SRobert Mustacchi.Sy thrd_nomem
144dcdfe824SRobert Mustacchiis returned; otherwise, if any other error occurred,
145dcdfe824SRobert Mustacchi.Sy thrd_error
146dcdfe824SRobert Mustacchiis returned.
147dcdfe824SRobert Mustacchi.Pp
148dcdfe824SRobert MustacchiUpon successful completion, the
149dcdfe824SRobert Mustacchi.Fn cond_broadcast ,
150dcdfe824SRobert Mustacchi.Fn cond_signal ,
151dcdfe824SRobert Mustacchiand
152dcdfe824SRobert Mustacchi.Fn cond_wait
153dcdfe824SRobert Mustacchifunctions return
154dcdfe824SRobert Mustacchi.Sy thrd_success .
155dcdfe824SRobert MustacchiOtherwise, they return
156dcdfe824SRobert Mustacchi.Sy thrd_error
157dcdfe824SRobert Mustacchito indicate that an error occurred and they were unable to complete.
158dcdfe824SRobert Mustacchi.Pp
159dcdfe824SRobert MustacchiUpon successful completion, the
160dcdfe824SRobert Mustacchi.Fn cond_timedwait
161dcdfe824SRobert Mustacchifunction returns
162dcdfe824SRobert Mustacchi.Sy thrd_success .
163dcdfe824SRobert MustacchiIf
164dcdfe824SRobert Mustacchi.Fa abstime
165dcdfe824SRobert Mustacchiexpires without being signaled, it instead returns
166dcdfe824SRobert Mustacchi.Sy thrd_timedout .
167dcdfe824SRobert MustacchiOtherwise,
168dcdfe824SRobert Mustacchi.Sy thrd_error
169dcdfe824SRobert Mustacchiis returned to indicate an error.
170dcdfe824SRobert Mustacchi.Sh INTERFACE STABILITY
171dcdfe824SRobert Mustacchi.Sy Standard
172dcdfe824SRobert Mustacchi.Sh MT-LEVEL
173dcdfe824SRobert Mustacchi.Sy MT-Safe
174dcdfe824SRobert Mustacchi.Sh SEE ALSO
175dcdfe824SRobert Mustacchi.Xr cond_braodcast 3C ,
176dcdfe824SRobert Mustacchi.Xr cond_destroy 3C ,
177dcdfe824SRobert Mustacchi.Xr cond_init 3C ,
178dcdfe824SRobert Mustacchi.Xr cond_signal 3C ,
179dcdfe824SRobert Mustacchi.Xr cond_timedwait 3C ,
180dcdfe824SRobert Mustacchi.Xr cond_wait 3C ,
181dcdfe824SRobert Mustacchi.Xr threads 3HEAD ,
182dcdfe824SRobert Mustacchi.Xr attributes 5 ,
183dcdfe824SRobert Mustacchi.Xr threads 5
184