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 MTX 3C 16dcdfe824SRobert Mustacchi.Os 17dcdfe824SRobert Mustacchi.Sh NAME 18dcdfe824SRobert Mustacchi.Nm mtx , 19dcdfe824SRobert Mustacchi.Nm mtx_destroy , 20dcdfe824SRobert Mustacchi.Nm mtx_init , 21dcdfe824SRobert Mustacchi.Nm mtx_lock , 22dcdfe824SRobert Mustacchi.Nm mtx_timedlock , 23dcdfe824SRobert Mustacchi.Nm mtx_trylock , 24dcdfe824SRobert Mustacchi.Nm mtx_unlock 25dcdfe824SRobert Mustacchi.Nd C11 mutex operations 26dcdfe824SRobert Mustacchi.Sh SYNOPSIS 27dcdfe824SRobert Mustacchi.In threads.h 28dcdfe824SRobert Mustacchi.Ft int 29dcdfe824SRobert Mustacchi.Fo mtx_init 30dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 31dcdfe824SRobert Mustacchi.Fa "int type" 32dcdfe824SRobert Mustacchi.Fc 33dcdfe824SRobert Mustacchi.Ft void 34dcdfe824SRobert Mustacchi.Fo mtx_destroy 35dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 36dcdfe824SRobert Mustacchi.Fc 37dcdfe824SRobert Mustacchi.Ft int 38dcdfe824SRobert Mustacchi.Fo mtx_lock 39dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 40dcdfe824SRobert Mustacchi.Fc 41dcdfe824SRobert Mustacchi.Ft int 42dcdfe824SRobert Mustacchi.Fo mtx_timedlock 43dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 44dcdfe824SRobert Mustacchi.Fa "const struct timespec *restrict ts" 45dcdfe824SRobert Mustacchi.Fc 46dcdfe824SRobert Mustacchi.Ft int 47dcdfe824SRobert Mustacchi.Fo mtx_trylock 48dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 49dcdfe824SRobert Mustacchi.Fc 50dcdfe824SRobert Mustacchi.Ft int 51dcdfe824SRobert Mustacchi.Fo mtx_unlock 52dcdfe824SRobert Mustacchi.Fa "mtx_t *mtx" 53dcdfe824SRobert Mustacchi.Fc 54dcdfe824SRobert Mustacchi.Sh DESCRIPTION 55dcdfe824SRobert MustacchiThe 56dcdfe824SRobert Mustacchi.Sy mtx 57dcdfe824SRobert Mustacchifamily of functions implement mutual exclusion locks (mutexes) and behave 58dcdfe824SRobert Mustacchisimilarly to both POSIX threads and illumos threads; however, they have 59dcdfe824SRobert Mustacchislightly different call signatures and return values. For more 60dcdfe824SRobert Mustacchiinformation, see 61dcdfe824SRobert Mustacchi.Xr threads 5 . 62dcdfe824SRobert MustacchiImportantly, they do not allow for inter-process synchronization. 63dcdfe824SRobert Mustacchi.Ss Creating and Destroying Mutexes 64dcdfe824SRobert MustacchiThe 65dcdfe824SRobert Mustacchi.Fn mtx_init 66dcdfe824SRobert Mustacchifunction initializes the mutex specified by 67dcdfe824SRobert Mustacchi.Fa mtx . 68dcdfe824SRobert MustacchiThe following types of mutexes are valid and may be specified by the 69dcdfe824SRobert Mustacchi.Fa type 70dcdfe824SRobert Mustacchiargument: 71dcdfe824SRobert Mustacchi.Bl -tag -width Dv 72dcdfe824SRobert Mustacchi.It Sy mtx_plain 73dcdfe824SRobert MustacchiA simple, intra-process mutex. 74dcdfe824SRobert Mustacchi.It Sy mtx_timed 75dcdfe824SRobert MustacchiA simple, intra-process mutex, which allows timed locking operations. 76dcdfe824SRobert Mustacchi.It Sy mtx_plain | mtx_recursive 77dcdfe824SRobert MustacchiAn intra-process mutex that may be acquired recursively by the same 78dcdfe824SRobert Mustacchithread. It must be unlocked an equal number of times that it is locked. 79dcdfe824SRobert Mustacchi.It Sy mtx_timed | mtx_recursive 80dcdfe824SRobert MustacchiAn intra-process mutex that supports timed locking operations and may be 81dcdfe824SRobert Mustacchiacquired recursively by the same thread. It must be unlocked an equal 82dcdfe824SRobert Mustacchinumber of times that it is locked. 83dcdfe824SRobert Mustacchi.El 84dcdfe824SRobert MustacchiFor more information on the different kind of mutexes, see 85dcdfe824SRobert Mustacchi.Xr mutex_init 3C . 86dcdfe824SRobert Mustacchi.Pp 87dcdfe824SRobert MustacchiThe 88dcdfe824SRobert Mustacchi.Fn mtx_destroy 89dcdfe824SRobert Mustacchifunction destroys the mutex pointed to by 90dcdfe824SRobert Mustacchi.Fa mtx . 91dcdfe824SRobert MustacchiIt is illegal for threads to be blocked waiting for 92dcdfe824SRobert Mustacchi.Fa mtx 93dcdfe824SRobert Mustacchiwhen 94dcdfe824SRobert Mustacchi.Fn mtx_destroy 95dcdfe824SRobert Mustacchiis called . 96dcdfe824SRobert Mustacchi.Ss Locking and Unlocking Mutexes 97dcdfe824SRobert MustacchiThe 98dcdfe824SRobert Mustacchi.Fn mtx_lock 99dcdfe824SRobert Mustacchifunction attempts to lock the mutex 100dcdfe824SRobert Mustacchi.Fa mtx . 101dcdfe824SRobert MustacchiWhen the function returns, it will be the sole owner of the mutex and 102dcdfe824SRobert Mustacchimust call 103dcdfe824SRobert Mustacchi.Fn mtx_unlock 104dcdfe824SRobert Mustacchiwhen it is done, or risk inducing a deadlock in the process. Other 105dcdfe824SRobert Mustacchithreads that make calls to 106dcdfe824SRobert Mustacchi.Fn mtx_lock 107dcdfe824SRobert Mustacchiafter another thread has successfully completed its call to 108dcdfe824SRobert Mustacchi.Fn mtx_lock 109dcdfe824SRobert Mustacchiwill block. 110dcdfe824SRobert MustacchiWhen they finally return, then they will have obtained the mutex 111dcdfe824SRobert Mustacchi.Fa mtx . 112dcdfe824SRobert Mustacchi.Pp 113dcdfe824SRobert MustacchiUnless a lock of type 114dcdfe824SRobert Mustacchi.Sy mtx_recursive 115dcdfe824SRobert Mustacchiwas created, a thread calling 116dcdfe824SRobert Mustacchi.Fn mtx_lock 117dcdfe824SRobert Mustacchiwhen it already holds 118dcdfe824SRobert Mustacchi.Fa mtx 119dcdfe824SRobert Mustacchiwill cause the thread to deadlock. Othewrise, the lock will be 120dcdfe824SRobert Mustacchisuccessfully taken again. However, a thread must call 121dcdfe824SRobert Mustacchi.Fn mtx_unlock 122dcdfe824SRobert Mustacchifor each time that it has acquried 123dcdfe824SRobert Mustacchi.Fa mtx . 124dcdfe824SRobert Mustacchi.Pp 125dcdfe824SRobert MustacchiThe 126dcdfe824SRobert Mustacchi.Fn mtx_trylock 127dcdfe824SRobert Mustacchifunction will attempt to obtain the mutex pointed to by 128dcdfe824SRobert Mustacchi.Fa mtx . 129dcdfe824SRobert MustacchiHowever, unlike 130dcdfe824SRobert Mustacchi.Fn mtx_lock , 131dcdfe824SRobert Mustacchiif 132dcdfe824SRobert Mustacchi.Fa mtx 133dcdfe824SRobert Mustacchiis locked, then it will not block and wait for 134dcdfe824SRobert Mustacchi.Fa mtx 135dcdfe824SRobert Mustacchiand instead return 136dcdfe824SRobert Mustacchi.Sy thrd_busy 137dcdfe824SRobert Mustacchito indicate that the lock is currently held. 138dcdfe824SRobert Mustacchi.Pp 139dcdfe824SRobert MustacchiThe 140dcdfe824SRobert Mustacchi.Fn mtx_timedlock 141dcdfe824SRobert Mustacchifunction attempts to obtain the mutex pointed to by 142dcdfe824SRobert Mustacchi.Fa mtx . 143dcdfe824SRobert MustacchiIf it is unable to obtain it, then it will block for a set amount of 144dcdfe824SRobert Mustacchitime dictated by 145dcdfe824SRobert Mustacchi.Fa ts . 146dcdfe824SRobert MustacchiThe timeout in 147dcdfe824SRobert Mustacchi.Fa ts 148dcdfe824SRobert Mustacchiis treated as an absolute time in UTC to block until, measured based on 149dcdfe824SRobert Mustacchithe 150dcdfe824SRobert Mustacchi.Sy CLOCK_REALTIME 151dcdfe824SRobert Mustacchiclock. 152dcdfe824SRobert Mustacchi.Pp 153dcdfe824SRobert MustacchiThe 154dcdfe824SRobert Mustacchi.Fn mtx_unlock 155dcdfe824SRobert Mustacchifunction unlocks the mutex pointed to by 156dcdfe824SRobert Mustacchi.Fa mtx , 157dcdfe824SRobert Mustacchiwhich allows another thread the opportunity to obtain it. If any threads 158dcdfe824SRobert Mustacchiare actively blocking on the mutex, one of them will obtain it and be 159dcdfe824SRobert Mustacchiwoken up. It is an error to call 160dcdfe824SRobert Mustacchi.Fn mtx_unlock 161dcdfe824SRobert Mustacchion a mutex which the calling thread does not currently own. 162dcdfe824SRobert Mustacchi.Sh RETURN VALUES 163dcdfe824SRobert MustacchiUpon successful completion, the function 164dcdfe824SRobert Mustacchi.Fn mtx_init returns 165dcdfe824SRobert Mustacchi.Sy thrd_success. 166dcdfe824SRobert MustacchiIf there was insufficient memory to create the thread, 167dcdfe824SRobert Mustacchiit instead returns 168dcdfe824SRobert Mustacchi.Sy thrd_nomem . 169dcdfe824SRobert MustacchiIf any other error occurred, it returns 170dcdfe824SRobert Mustacchi.Sy thrd_error . 171dcdfe824SRobert Mustacchi.Pp 172dcdfe824SRobert MustacchiThe functions 173dcdfe824SRobert Mustacchi.Fn mtx_lock , 174dcdfe824SRobert Mustacchiand 175dcdfe824SRobert Mustacchi.Fn mtx_unlock 176dcdfe824SRobert Mustacchireturn 177dcdfe824SRobert Mustacchi.Sy thrd_success . 178dcdfe824SRobert MustacchiIf they were unable to successfully complete the operation, they instead 179dcdfe824SRobert Mustacchireturn 180dcdfe824SRobert Mustacchi.Sy thrd_error . 181dcdfe824SRobert Mustacchi.Pp 182dcdfe824SRobert MustacchiUpon sucessful completion, the 183dcdfe824SRobert Mustacchi.Fn mtx_timedlock 184dcdfe824SRobert Mustacchifunction returns 185dcdfe824SRobert Mustacchi.Sy thrd_success . 186dcdfe824SRobert MustacchiIf the timeout is reached and the calling thread is unable to obtain the 187dcdfe824SRobert Mustacchimutex, then 188dcdfe824SRobert Mustacchi.Sy thrd_timedout 189dcdfe824SRobert Mustacchiis returned . 190dcdfe824SRobert MustacchiIf any other error occurs, then 191dcdfe824SRobert Mustacchi.Sy thrd_error is returned. 192dcdfe824SRobert Mustacchi.Pp 193dcdfe824SRobert MustacchiUpon successful completion, the 194dcdfe824SRobert Mustacchi.Fn mtx_trylock 195dcdfe824SRobert Mustacchifunction returns 196dcdfe824SRobert Mustacchi.Sy thrd_success . 197dcdfe824SRobert MustacchiIf the thread was unable to obtain the mutex because another thread owns 198dcdfe824SRobert Mustacchiit, then it returns 199dcdfe824SRobert Mustacchi.Sy thrd_busy . 200dcdfe824SRobert MustacchiOtherwise, an error will have occurred and 201dcdfe824SRobert Mustacchi.Sy thrd_error 202dcdfe824SRobert Mustacchiis returned. 203dcdfe824SRobert Mustacchi.Sh INTERFACE STABILITY 204dcdfe824SRobert Mustacchi.Sy Standard 205dcdfe824SRobert Mustacchi.Sh MT-LEVEL 206dcdfe824SRobert Mustacchi.Sy MT-Safe 207dcdfe824SRobert Mustacchi.Sh SEE ALSO 208dcdfe824SRobert Mustacchi.Xr mutex_init 3C , 209dcdfe824SRobert Mustacchi.Xr pthread_mutex_destroy 3C , 210dcdfe824SRobert Mustacchi.Xr pthread_mutex_init 3C , 211dcdfe824SRobert Mustacchi.Xr pthread_mutex_lock 3C , 212dcdfe824SRobert Mustacchi.Xr pthread_mutex_timedlock 3C , 213dcdfe824SRobert Mustacchi.Xr pthread_mutex_trylock 3C , 214dcdfe824SRobert Mustacchi.Xr pthread_mutex_unlock 3C , 215dcdfe824SRobert Mustacchi.Xr threads.h 3HEAD , 216dcdfe824SRobert Mustacchi.Xr attributes 5 217