1.\" 2.\" Copyright (c) 2010 The DragonFly Project. All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in 12.\" the documentation and/or other materials provided with the 13.\" distribution. 14.\" 3. Neither the name of The DragonFly Project nor the names of its 15.\" contributors may be used to endorse or promote products derived 16.\" from this software without specific, prior written permission. 17.\" 18.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 24.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29.\" SUCH DAMAGE. 30.\" 31.Dd August 24, 2012 32.Dt MUTEX 9 33.Os 34.Sh NAME 35.Nm mutex , 36.Nm mtx_init , 37.Nm mtx_uninit , 38.Nm mtx_lock_sh , 39.Nm mtx_lock_sh_quick , 40.Nm mtx_lock_ex , 41.Nm mtx_lock_ex_quick , 42.Nm mtx_lock , 43.Nm mtx_spinlock , 44.Nm mtx_lock_ex_try , 45.Nm mtx_lock_sh_try , 46.Nm mtx_spinlock_try , 47.Nm mtx_downgrade , 48.Nm mtx_upgrade_try , 49.Nm mtx_unlock , 50.Nm mtx_unlock_ex , 51.Nm mtx_unlock_sh , 52.Nm mtx_spinunlock , 53.Nm mtx_islocked , 54.Nm mtx_islocked_ex , 55.Nm mtx_notlocked , 56.Nm mtx_notlocked_ex , 57.Nm mtx_owned , 58.Nm mtx_notowned , 59.Nm mtx_lockrefs , 60.Nm mtx_hold , 61.Nm mtx_drop 62.Nd general blocking/spinnable mutex functions 63.Sh SYNOPSIS 64.In sys/globaldata.h 65.In sys/mutex2.h 66.Ft void 67.Fn mtx_init "struct mtx *mtx" 68.Ft void 69.Fn mtx_uninit "struct mtx *mtx" 70.Ft void 71.Fn mtx_lock_sh "struct mtx *mtx" "const char *ident" "int flags" "int to" 72.Ft void 73.Fn mtx_lock_sh_quick "struct mtx *mtx" "const char *ident" 74.Ft void 75.Fn mtx_lock_ex "struct mtx *mtx" "const char *ident" "int flags" "int to" 76.Ft void 77.Fn mtx_lock_ex_quick "struct mtx *mtx" "const char *ident" 78.Ft void 79.Fn mtx_lock "struct mtx *mtx" 80.Ft void 81.Fn mtx_spinlock "struct mtx *mtx" 82.Ft int 83.Fn mtx_lock_ex_try "struct mtx *mtx" 84.Ft int 85.Fn mtx_lock_sh_try "struct mtx *mtx" 86.Ft int 87.Fn mtx_spinlock_try "struct mtx *mtx" 88.Ft void 89.Fn mtx_downgrade "struct mtx *mtx" 90.Ft int 91.Fn mtx_upgrade_try "struct mtx *mtx" 92.Ft void 93.Fn mtx_unlock "struct mtx *mtx" 94.Ft void 95.Fn mtx_unlock_ex "struct mtx *mtx" 96.Ft void 97.Fn mtx_unlock_sh "struct mtx *mtx" 98.Ft void 99.Fn mtx_spinunlock "struct mtx *mtx" 100.Ft int 101.Fn mtx_islocked "struct mtx *mtx" 102.Ft int 103.Fn mtx_islocked_ex "struct mtx *mtx" 104.Ft int 105.Fn mtx_notlocked "struct mtx *mtx" 106.Ft int 107.Fn mtx_notlocked_ex "struct mtx *mtx" 108.Ft int 109.Fn mtx_owned "struct mtx *mtx" 110.Ft int 111.Fn mtx_notowned "struct mtx *mtx" 112.Ft int 113.Fn mtx_lockrefs "struct mtx *mtx" 114.Ft void 115.Fn mtx_hold "struct mtx *mtx" 116.Ft int 117.Fn mtx_drop "struct mtx *mtx" 118.Sh DESCRIPTION 119Mutexes are used to implement mutual exclusion between threads. 120Mutexes can be locked in shared or exclusive mode; they can also block 121or spin the current thread when there is contention. 122.Pp 123Mutexes also have an associated reference count, independent of the lock. 124.Pp 125System-wide mutex contention statistics can be found in the 126.Va kern.mtx_contention_count , 127.Va kern.mtx_collision_count , 128and 129.Va kern.mtx_wakeup_count 130variables. 131.Va kern.mtx_contention_count 132is incremented each time an attempt to acquire a mutex fails due to contention. 133.Va kern.mtx_wakeup_count 134is incremented each time an exclusive lock is converted to either a shared or 135unlocked state an waiters for the shared state are woken. 136.Pp 137The mutex functions are similar to the 138.Xr lockmgr 9 139functions. 140.Sh FUNCTIONS 141The 142.Fn mtx_init 143function initializes a mutex to the unlocked state. 144It is an error to use a mutex without initializing it. 145.Pp 146The 147.Fn mtx_uninit 148function deinitializes a mutex. 149.Pp 150The 151.Fn mtx_lock_sh 152function attempts to lock a mutex in shared mode and blocks the current 153thread until it is able to do so. 154The 155.Fa ident 156parameter is as in 157.Xr tsleep 9 , 158it is a string describing the reason for a thread to be blocked. 159The 160.Fa flags 161parameter is passed to 162.Xr tsleep 9 163if the thread must block; the 164.Fa to 165parameter is a timeout for the sleep. 166The 167.Fn mtx_lock_sh_quick 168function is a version of 169.Fn mtx_lock_sh 170without flags or a timeout. 171.Pp 172The 173.Fn mtx_lock_ex 174function attempts to lock a mutex exclusively and blocks the current thread 175until it is able to do so. 176The 177.Fa ident 178and 179.Fa flags 180parameters are as in 181.Xr tsleep 9 . 182The 183.Fa to 184parameter is a timeout on the sleep. 185The 186.Fn mtx_lock_ex_quick 187function is a version of 188.Fn mtx_lock_ex 189without flags or a timeout. 190The 191.Fn mtx_lock 192function is a yet shorter form for exclusively locking a mutex, blocking the 193current thread until acquired. 194It is equivalent to mtx_lock_ex(mtx, "mtxex", 0, 0). 195.Pp 196The 197.Fn mtx_spinlock 198function attempts to lock the mutex in exclusive mode and spins until it is 199able to do so. 200.Pp 201The 202.Fn mtx_lock_ex_try 203and 204.Fn mtx_lock_sh_try 205functions attempt to lock the mutex in exclusive or shared mode, respectively. 206If they are not able to, they return 207.Er EAGAIN . 208The 209.Fn mtx_spinlock_try 210function does the same but for spin mutexes. 211.Pp 212The 213.Fn mtx_downgrade 214function converts an exclusively held lock to a shared lock. 215The lock must be held by the calling thread. 216If the lock is already shared, this call is a no-op. 217.Pp 218The 219.Fn mtx_upgrade_try 220function attempts to convert a shared lock to an exclusive one. 221The mutex must be held by the caller in the shared state. 222If the upgrade is successful, this function returns 0; otherwise, it returns 223.Er EDEADLK . 224.Pp 225The 226.Fn mtx_unlock 227function releases a held mutex; 228it works on both exclusive and shared mutexes. 229The 230.Fn mtx_unlock_ex 231and 232.Fn mtx_unlock_sh 233functions are optimized unlock paths, used when it is known that a lock is held 234exclusively or in shared state. 235.Pp 236The 237.Fn mtx_spinunlock 238function releases a held spin mutex. 239.Pp 240The 241.Fn mtx_islocked 242function returns non-zero if the mutex is locked in either shared of 243exclusive state by any thread. 244.Fn mtx_islocked_ex 245returns non-zero if the mutex is locked exclusively by any thread. 246The 247.Fn mtx_notlocked 248function returns non-zero if the mutex is not locked. 249The 250.Fn mtx_owned 251function returns non-zero if the mutex is exclusively locked by the calling 252thread. 253The 254.Fn mtx_notowned 255function returns non-zero if the mutex is not exclusively locked by the 256calling thread. 257The 258.Fn mtx_lockrefs 259function returns the number of shared or exclusive locks on the mutex. 260.Pp 261The 262.Fn mtx_hold 263function increments the reference count associated with each mutex. 264The reference count is independent of the lock field. 265The 266.Fn mtx_drop 267function decrements the reference count associated with each mutex 268and returns the old value of the count. 269A return value of 270.Sq 1 271means that the current count is 272.Sq 0 . 273.Sh FILES 274The uncontended path of the 275.Nm 276implementation is in 277.Pa /sys/sys/mutex2.h . 278The data structures are in 279.Pa /sys/sys/mutex.h . 280The core of the spinlock implementation is in 281.Pa /sys/kern/kern_mutex.c . 282.Sh SEE ALSO 283.Xr crit_enter 9 , 284.Xr lockmgr 9 , 285.Xr serializer 9 , 286.Xr sleep 9 , 287.Xr spinlock 9 288.Sh HISTORY 289Mutexes first appeared in 290.Dx 2.3 . 291.Sh AUTHORS 292.An -nosplit 293The 294.Nm 295implementation was written by 296.An Matthew Dillon . 297