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