19b8d2ca1SEirik Nygaard.\" 29b8d2ca1SEirik Nygaard.\" Copyright (C) 2002 Chad David <davidc@acns.ab.ca>. All rights reserved. 39b8d2ca1SEirik Nygaard.\" 49b8d2ca1SEirik Nygaard.\" Redistribution and use in source and binary forms, with or without 59b8d2ca1SEirik Nygaard.\" modification, are permitted provided that the following conditions 69b8d2ca1SEirik Nygaard.\" are met: 79b8d2ca1SEirik Nygaard.\" 1. Redistributions of source code must retain the above copyright 89b8d2ca1SEirik Nygaard.\" notice(s), this list of conditions and the following disclaimer as 99b8d2ca1SEirik Nygaard.\" the first lines of this file unmodified other than the possible 109b8d2ca1SEirik Nygaard.\" addition of one or more copyright notices. 119b8d2ca1SEirik Nygaard.\" 2. Redistributions in binary form must reproduce the above copyright 129b8d2ca1SEirik Nygaard.\" notice(s), this list of conditions and the following disclaimer in the 139b8d2ca1SEirik Nygaard.\" documentation and/or other materials provided with the distribution. 149b8d2ca1SEirik Nygaard.\" 159b8d2ca1SEirik Nygaard.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 169b8d2ca1SEirik Nygaard.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 179b8d2ca1SEirik Nygaard.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 189b8d2ca1SEirik Nygaard.\" DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY 199b8d2ca1SEirik Nygaard.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 209b8d2ca1SEirik Nygaard.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 219b8d2ca1SEirik Nygaard.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 229b8d2ca1SEirik Nygaard.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 239b8d2ca1SEirik Nygaard.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 249b8d2ca1SEirik Nygaard.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 259b8d2ca1SEirik Nygaard.\" DAMAGE. 269b8d2ca1SEirik Nygaard.\" 279b8d2ca1SEirik Nygaard.\" $FreeBSD: src/share/man/man9/lock.9,v 1.11 2003/09/08 19:57:21 ru Exp $ 289b8d2ca1SEirik Nygaard.\" 29*d915b672SAaron LI.Dd January 25, 2024 309b8d2ca1SEirik Nygaard.Dt LOCK 9 319b8d2ca1SEirik Nygaard.Os 329b8d2ca1SEirik Nygaard.Sh NAME 339b8d2ca1SEirik Nygaard.Nm lockinit , 349b8d2ca1SEirik Nygaard.Nm lockmgr , 35a9ea4065SSascha Wildner.Nm lockmgr_try , 369b8d2ca1SEirik Nygaard.Nm lockstatus , 3760d5542fSMarkus Pfeiffer.Nm lockmgr_printinfo , 3860d5542fSMarkus Pfeiffer.Nm lockowned 399b8d2ca1SEirik Nygaard.Nd "lockmgr family of functions" 409b8d2ca1SEirik Nygaard.Sh SYNOPSIS 419b8d2ca1SEirik Nygaard.In sys/types.h 429b8d2ca1SEirik Nygaard.In sys/lock.h 439b8d2ca1SEirik Nygaard.Ft void 4455a2ee33SMarkus Pfeiffer.Fn lockinit "struct lock *lkp" "const char *wmesg" "int timo" "int flags" 45df59f81fSSascha Wildner.Ft void 46df59f81fSSascha Wildner.Fn lockuninit "struct lock *lkp" 479b8d2ca1SEirik Nygaard.Ft int 48b13563f4SSascha Wildner.Fn lockmgr "struct lock *lkp" "u_int flags" 49a9ea4065SSascha Wildner.Ft boolean_t 50a9ea4065SSascha Wildner.Fn lockmgr_try "struct lock *lkp" "u_int flags" 519b8d2ca1SEirik Nygaard.Ft int 529b8d2ca1SEirik Nygaard.Fn lockstatus "struct lock *lkp" "struct thread *td" 539b8d2ca1SEirik Nygaard.Ft void 549b8d2ca1SEirik Nygaard.Fn lockmgr_printinfo "struct lock *lkp" 5560d5542fSMarkus Pfeiffer.Ft int 5660d5542fSMarkus Pfeiffer.Fn lockowned "struct lock *lkp" 579b8d2ca1SEirik Nygaard.Sh DESCRIPTION 589b8d2ca1SEirik NygaardThe 599b8d2ca1SEirik Nygaard.Fn lockinit 609b8d2ca1SEirik Nygaardfunction is used to initialize a lock. 619b8d2ca1SEirik NygaardIt must be called before any operation can be performed on a lock. 629b8d2ca1SEirik NygaardIts arguments are: 639b8d2ca1SEirik Nygaard.Bl -tag -width ".Fa wmesg" 649b8d2ca1SEirik Nygaard.It Fa lkp 659b8d2ca1SEirik NygaardA pointer to the lock to initialize. 669b8d2ca1SEirik Nygaard.It Fa wmesg 679b8d2ca1SEirik NygaardThe lock message. 689b8d2ca1SEirik NygaardThis is used for both debugging output and 699b8d2ca1SEirik Nygaard.Xr tsleep 9 . 709b8d2ca1SEirik Nygaard.It Fa timo 719b8d2ca1SEirik NygaardThe timeout value passed to 729b8d2ca1SEirik Nygaard.Xr tsleep 9 . 739b8d2ca1SEirik Nygaard.It Fa flags 749b8d2ca1SEirik NygaardThe flags the lock is to be initialized with. 753142490eSSascha Wildner.Bl -tag -width ".Dv LK_CANRECURSE" 769b8d2ca1SEirik Nygaard.It Dv LK_NOWAIT 779b8d2ca1SEirik NygaardDo not sleep while acquiring the lock. 789b8d2ca1SEirik Nygaard.It Dv LK_SLEEPFAIL 799b8d2ca1SEirik NygaardFail after a sleep. 809b8d2ca1SEirik Nygaard.It Dv LK_CANRECURSE 819b8d2ca1SEirik NygaardAllow recursive exclusive locks. 829b8d2ca1SEirik Nygaard.It Dv LK_TIMELOCK 839b8d2ca1SEirik NygaardUse 849b8d2ca1SEirik Nygaard.Fa timo 859b8d2ca1SEirik Nygaardduring a sleep; otherwise, 0 is used. 869b8d2ca1SEirik Nygaard.El 879b8d2ca1SEirik Nygaard.El 889b8d2ca1SEirik Nygaard.Pp 899b8d2ca1SEirik NygaardThe 90df59f81fSSascha Wildner.Fn lockuninit 91df59f81fSSascha Wildnerfunction destroys a lock that was previously initialized using 92df59f81fSSascha Wildner.Fn lockinit . 93df59f81fSSascha Wildner.Pp 94df59f81fSSascha WildnerThe 959b8d2ca1SEirik Nygaard.Fn lockmgr 969b8d2ca1SEirik Nygaardfunction handles general locking functionality within the kernel, including 979b8d2ca1SEirik Nygaardsupport for shared and exclusive locks, and recursion. 989b8d2ca1SEirik Nygaard.Fn lockmgr 999b8d2ca1SEirik Nygaardis also able to upgrade and downgrade locks. 1009b8d2ca1SEirik Nygaard.Pp 1019b8d2ca1SEirik NygaardIts arguments are: 1028f1a379eSSascha Wildner.Bl -tag -width ".Fa flags" 1039b8d2ca1SEirik Nygaard.It Fa lkp 1049b8d2ca1SEirik NygaardA pointer to the lock to manipulate. 1059b8d2ca1SEirik Nygaard.It Fa flags 1069b8d2ca1SEirik NygaardFlags indicating what action is to be taken. 1079b8d2ca1SEirik Nygaard.Bl -tag -width ".Dv LK_EXCLUPGRADE" 1089b8d2ca1SEirik Nygaard.It Dv LK_SHARED 1099b8d2ca1SEirik NygaardAcquire a shared lock. 1109b8d2ca1SEirik NygaardIf an exclusive lock is currently held, it will be downgraded. 1119b8d2ca1SEirik Nygaard.It Dv LK_EXCLUSIVE 1129b8d2ca1SEirik NygaardAcquire an exclusive lock. 1139b8d2ca1SEirik NygaardIf an exclusive lock is already held, and 1149b8d2ca1SEirik Nygaard.Dv LK_CANRECURSE 1159b8d2ca1SEirik Nygaardis not set, the system will 1169b8d2ca1SEirik Nygaard.Xr panic 9 . 1179b8d2ca1SEirik Nygaard.It Dv LK_DOWNGRADE 1189b8d2ca1SEirik NygaardDowngrade exclusive lock to a shared lock. 1199b8d2ca1SEirik NygaardDowngrading a shared lock is not permitted. 1209b8d2ca1SEirik NygaardIf an exclusive lock has been recursed, all references will be downgraded. 1219b8d2ca1SEirik Nygaard.It Dv LK_EXCLUPGRADE 1229b8d2ca1SEirik NygaardUpgrade a shared lock to an exclusive lock. 1239b8d2ca1SEirik NygaardFails with 1249b8d2ca1SEirik Nygaard.Er EBUSY 1259b8d2ca1SEirik Nygaardif there is someone ahead of you in line waiting for an upgrade. 126bb36d905SMatthew DillonIf this call fails for any reason, the shared lock is lost. 127bb36d905SMatthew DillonAttempts to upgrade an exclusive lock not already 128bb36d905SMatthew Dillonowned by the caller will cause a 129bb36d905SMatthew Dillon.Xr panic 9 , 130bb36d905SMatthew Dillonbut otherwise will always succeed. 131bb36d905SMatthew DillonNOTE! When this operation succeeds, it guarantees that no other 132bb36d905SMatthew Dillonexclusive lock was able to acquire the lock ahead of you, but 133bb36d905SMatthew Dillonas indicated above, if it fails your current shared lock is lost. 1349b8d2ca1SEirik Nygaard.It Dv LK_UPGRADE 1359b8d2ca1SEirik NygaardUpgrade a shared lock to an exclusive lock. 136bb36d905SMatthew DillonIf this call fails for any reason, the shared lock is lost. 137bb36d905SMatthew DillonAttempts to upgrade an exclusive lock not already 138bb36d905SMatthew Dillonowned by the caller will cause a 139bb36d905SMatthew Dillon.Xr panic 9 , 140bb36d905SMatthew Dillonbut otherwise will always succeed. 141bb36d905SMatthew DillonWARNING! This operation can block with the current lock temporarily 142bb36d905SMatthew Dillonreleased, and other exclusive or shared lock holders can inject before 143bb36d905SMatthew Dillonthe lock is acquired on your behalf. 1449b8d2ca1SEirik Nygaard.It Dv LK_RELEASE 1459b8d2ca1SEirik NygaardRelease the lock. 1469b8d2ca1SEirik NygaardReleasing a lock that is not held can cause a 1479b8d2ca1SEirik Nygaard.Xr panic 9 . 1489b8d2ca1SEirik Nygaard.It Dv LK_SLEEPFAIL 1499b8d2ca1SEirik NygaardFail if operation has slept. 1509b8d2ca1SEirik Nygaard.It Dv LK_NOWAIT 1519b8d2ca1SEirik NygaardDo not allow the call to sleep. 1529b8d2ca1SEirik NygaardThis can be used to test the lock. 1539b8d2ca1SEirik Nygaard.It Dv LK_CANRECURSE 1549b8d2ca1SEirik NygaardAllow recursion on an exclusive lock. 1559b8d2ca1SEirik NygaardFor every lock there must be a release. 1569b8d2ca1SEirik Nygaard.El 1579b8d2ca1SEirik Nygaard.El 1589b8d2ca1SEirik Nygaard.Pp 1599b8d2ca1SEirik NygaardThe 160a9ea4065SSascha Wildner.Fn lockmgr_try 161a9ea4065SSascha Wildnerfunction is similar to 162a9ea4065SSascha Wildner.Fn lockmgr 163a9ea4065SSascha Wildnerbut it will not sleep and returns 164a9ea4065SSascha Wildner.Dv TRUE 165a9ea4065SSascha Wildnerif the lock was successfully obtained and 166a9ea4065SSascha Wildner.Dv FALSE 167a9ea4065SSascha Wildnerif it was not. 168a9ea4065SSascha Wildner.Pp 169a9ea4065SSascha WildnerThe 1709b8d2ca1SEirik Nygaard.Fn lockstatus 1719b8d2ca1SEirik Nygaardfunction returns the status of the lock in relation to the 1729b8d2ca1SEirik Nygaard.Vt thread 1739b8d2ca1SEirik Nygaardpassed to it. 1749b8d2ca1SEirik NygaardNote that if 1759b8d2ca1SEirik Nygaard.Fa td 1769b8d2ca1SEirik Nygaardis 1779b8d2ca1SEirik Nygaard.Dv NULL 1789b8d2ca1SEirik Nygaardand an exclusive lock is held, 1799b8d2ca1SEirik Nygaard.Dv LK_EXCLUSIVE 1809b8d2ca1SEirik Nygaardwill be returned. 1819b8d2ca1SEirik Nygaard.Pp 1829b8d2ca1SEirik NygaardThe 1839b8d2ca1SEirik Nygaard.Fn lockmgr_printinfo 1849b8d2ca1SEirik Nygaardfunction prints debugging information about the lock. 1859b8d2ca1SEirik NygaardIt is used primarily by 1869b8d2ca1SEirik Nygaard.Xr VOP_PRINT 9 1879b8d2ca1SEirik Nygaardfunctions. 18860d5542fSMarkus Pfeiffer.Pp 18960d5542fSMarkus PfeifferThe 19060d5542fSMarkus Pfeiffer.Fn lockowned 19160d5542fSMarkus Pfeifferfunction is used to determine whether the calling thread owns a lock. 1929b8d2ca1SEirik Nygaard.Sh RETURN VALUES 1939b8d2ca1SEirik NygaardThe 1949b8d2ca1SEirik Nygaard.Fn lockmgr 1959b8d2ca1SEirik Nygaardfunction returns 0 on success and non-zero on failure. 1969b8d2ca1SEirik Nygaard.Pp 1979b8d2ca1SEirik NygaardThe 1989b8d2ca1SEirik Nygaard.Fn lockstatus 1999b8d2ca1SEirik Nygaardfunction returns: 200*d915b672SAaron LI.Bl -tag -width ".Dv LK_EXCLUSIVE" -offset indent 2019b8d2ca1SEirik Nygaard.It Dv LK_EXCLUSIVE 2029b8d2ca1SEirik NygaardAn exclusive lock is held by the thread 2039b8d2ca1SEirik Nygaard.Fa td . 2049b8d2ca1SEirik Nygaard.It Dv LK_EXCLOTHER 2059b8d2ca1SEirik NygaardAn exclusive lock is held by someone other than the thread 2069b8d2ca1SEirik Nygaard.Fa td . 2079b8d2ca1SEirik Nygaard.It Dv LK_SHARED 2089b8d2ca1SEirik NygaardA shared lock is held. 2099b8d2ca1SEirik Nygaard.It Li 0 2109b8d2ca1SEirik NygaardThe lock is not held by anyone. 2119b8d2ca1SEirik Nygaard.El 21260d5542fSMarkus Pfeiffer.Pp 21360d5542fSMarkus PfeifferThe 21460d5542fSMarkus Pfeiffer.Fn lockowned 215*d915b672SAaron LIfunction returns a non-zero value if the caller owns the lock shared or 216*d915b672SAaron LIexclusive. 217deff95cbSSascha Wildner.Sh FILES 218*d915b672SAaron LI.Bl -tag -width /sys/kern/kern_lock.c -compact 219*d915b672SAaron LI.It Pa /sys/kern/kern_lock.c 220*d915b672SAaron LIthe lock manager implementation 221*d915b672SAaron LI.It Pa /sys/sys/lock.h 222*d915b672SAaron LIdata structures and function prototypes for the lock manager 223*d915b672SAaron LI.El 2249b8d2ca1SEirik Nygaard.Sh ERRORS 2259b8d2ca1SEirik Nygaard.Fn lockmgr 2269b8d2ca1SEirik Nygaardfails if: 2279b8d2ca1SEirik Nygaard.Bl -tag -width Er 2289b8d2ca1SEirik Nygaard.It Bq Er EBUSY 2299b8d2ca1SEirik Nygaard.Dv LK_NOWAIT 2309b8d2ca1SEirik Nygaardwas set, and a sleep would have been required. 2319b8d2ca1SEirik Nygaard.It Bq Er ENOLCK 2329b8d2ca1SEirik Nygaard.Dv LK_SLEEPFAIL 2339b8d2ca1SEirik Nygaardwas set and 2349b8d2ca1SEirik Nygaard.Fn lockmgr 2359b8d2ca1SEirik Nygaarddid sleep. 2369b8d2ca1SEirik Nygaard.It Bq Er EINTR 2379b8d2ca1SEirik Nygaard.Dv PCATCH 2389b8d2ca1SEirik Nygaardwas set in the lock priority, and a signal was delivered during a sleep. 2399b8d2ca1SEirik NygaardNote the 2409b8d2ca1SEirik Nygaard.Er ERESTART 2419b8d2ca1SEirik Nygaarderror below. 2429b8d2ca1SEirik Nygaard.It Bq Er ERESTART 2439b8d2ca1SEirik Nygaard.Dv PCATCH 2449b8d2ca1SEirik Nygaardwas set in the lock priority, a signal was delivered during a sleep, 2459b8d2ca1SEirik Nygaardand the system call is to be restarted. 2469b8d2ca1SEirik Nygaard.It Bq Er EWOULDBLOCK 2479b8d2ca1SEirik Nygaarda non-zero timeout was given, and the timeout expired. 2489b8d2ca1SEirik Nygaard.El 2499b8d2ca1SEirik Nygaard.Sh LOCKS 2509b8d2ca1SEirik NygaardUpgrade attempts that fail result in the loss of the lock that 2519b8d2ca1SEirik Nygaardis currently held. 2529b8d2ca1SEirik NygaardAlso, it is invalid to upgrade an 2539b8d2ca1SEirik Nygaardexclusive lock, and a 2549b8d2ca1SEirik Nygaard.Xr panic 9 2559b8d2ca1SEirik Nygaardwill be the result of trying. 2569b8d2ca1SEirik Nygaard.Sh SEE ALSO 257c04308e8SMarkus Pfeiffer.Xr locking 9 , 2589b8d2ca1SEirik Nygaard.Xr panic 9 , 2599b8d2ca1SEirik Nygaard.Xr tsleep 9 , 2609b8d2ca1SEirik Nygaard.Xr VOP_PRINT 9 261deff95cbSSascha Wildner.Sh HISTORY 262deff95cbSSascha WildnerThe lock manager appeared in 263deff95cbSSascha Wildner.Dx 1.0 . 264deff95cbSSascha Wildner.Pp 265deff95cbSSascha WildnerThe lock manager API first appeared in 266deff95cbSSascha Wildner.Bx 4.4 lite2 . 2679b8d2ca1SEirik Nygaard.Sh AUTHORS 2689b8d2ca1SEirik NygaardThis man page was written by 269c616d378SFranco Fichtner.An Chad David Aq Mt davidc@acns.ab.ca . 270