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