lockinit,
- Provided by: freebsd-manpages (Version: 10.1~RC1-1)
- Report a bug
#include
<sys/types.h>
#include <sys/lock.h>
#include <sys/lockmgr.h>
void
lockinit(struct
lock *lkp, int
prio, const char
*wmesg, int timo,
int flags);
void
lockdestroy(struct
lock *lkp);
int
lockmgr(struct
lock *lkp, u_int
flags, struct mtx
*ilk);
int
lockmgr_args(struct
lock *lkp, u_int
flags, struct mtx
*ilk, const char
*wmesg, int prio,
int timo);
int
lockmgr_args_rw(struct
lock *lkp, u_int
flags, struct rwlock
*ilk, const char
*wmesg, int prio,
int timo);
void
lockmgr_disown(struct
lock *lkp);
void
lockmgr_printinfo(const
struct lock *lkp);
int
lockmgr_recursed(const
struct lock *lkp);
int
lockmgr_rw(struct
lock *lkp, u_int
flags, struct rwlock
*ilk);
int
lockmgr_waiters(const
struct lock *lkp);
int
lockstatus(const
struct lock *lkp);
options INVARIANTS
options INVARIANT_SUPPORT
void
lockmgr_assert(const
struct lock *lkp, int
what);
The
lockinit()
function is used to initialize a lock. It must be called before any
operation can be performed on a lock. Its arguments are:
LK_ADAPTIVELK_CANRECURSELK_NOPROFILELK_NOSHARELK_NOWITNESSLK_NODUPLK_QUIETLK_TIMELOCKThe
lockdestroy()
function is used to destroy a lock, and while it is called in a number of
places in the kernel, it currently does nothing.
The
lockmgr()
and
lockmgr_rw()
functions handle general locking functionality within the kernel, including
support for shared and exclusive locks, and recursion.
lockmgr() and lockmgr_rw()
are also able to upgrade and downgrade locks.
Their arguments are:
LK_SHAREDEDEADLK will be returned.LK_EXCLUSIVELK_CANRECURSE is not set, the system will
panic(9).LK_DOWNGRADELK_UPGRADELK_NOWAIT
flag is specified. During the upgrade, the shared lock could be
temporarily dropped. Attempts to upgrade an exclusive lock will cause
a panic(9).LK_TRYUPGRADELK_RELEASELK_DRAIN<sys/lockmgr.h>.)LK_SLEEPFAILLK_NOWAITLK_NOWITNESSLK_CANRECURSELK_INTERLOCKLK_INTERLOCK is specified,
lockmgr()
and
lockmgr_rw()
assume ilk is currently owned and not recursed, and
will return it unlocked. See mtx_assert(9).The
lockmgr_args()
and
lockmgr_args_rw()
function work like lockmgr() and
lockmgr_rw() but accepting a
wmesg, timo and
prio on a per-instance basis. The specified values
will override the default ones, but this can still be used passing,
respectively, LK_WMESG_DEFAULT,
LK_PRIO_DEFAULT and
LK_TIMO_DEFAULT.
The
lockmgr_disown()
function switches the owner from the current thread to be
LK_KERNPROC, if the lock is already held.
The
lockmgr_printinfo()
function prints debugging information about the lock. It is used primarily
by VOP_PRINT(9) functions.
The
lockmgr_recursed()
function returns true if the lock is recursed, 0 otherwise.
The
lockmgr_waiters()
function returns true if the lock has waiters, 0 otherwise.
The
lockstatus()
function returns the status of the lock in relation to the current
thread.
When compiled with options
INVARIANTS and options INVARIANT_SUPPORT, the
lockmgr_assert()
function tests lkp for the assertions specified in
what, and panics if they are not met. One of the
following assertions must be specified:
KA_LOCKEDKA_SLOCKEDKA_XLOCKEDKA_UNLOCKEDIn addition, one of the following optional assertions can be used
with either an KA_LOCKED,
KA_SLOCKED, or KA_XLOCKED
assertion:
KA_RECURSEDKA_NOTRECURSEDThe lockmgr() and
lockmgr_rw() functions return 0 on success and
non-zero on failure.
The lockstatus() function returns:
LK_EXCLUSIVELK_EXCLOTHERLK_SHARED0lockmgr() and
lockmgr_rw() fail if:
EBUSY]LK_FORCEUPGRADE
was requested and another thread had already requested a lock
upgrade.EBUSY]LK_NOWAIT
was set, and a sleep would have been required, or
LK_TRYUPGRADE operation was not able to upgrade
the lock.ENOLCK]LK_SLEEPFAIL
was set and lockmgr() or
lockmgr_rw() did sleep.EINTR]PCATCH
was set in the lock priority, and a signal was delivered during a sleep.
Note the
ERESTART
error below.ERESTART]PCATCH
was set in the lock priority, a signal was delivered during a sleep, and
the system call is to be restarted.EWOULDBLOCK]If LK_INTERLOCK is passed in the
flags argument to
lockmgr()
or
lockmgr_rw(),
the ilk must be held prior to calling
lockmgr() or lockmgr_rw(),
and will be returned unlocked.
Upgrade attempts that fail result in the loss of the lock that is currently held. Also, it is invalid to upgrade an exclusive lock, and a panic(9) will be the result of trying.
condvar(9), locking(9), mutex(9), rwlock(9), sleep(9), sx(9), mtx_assert(9), panic(9), VOP_PRINT(9)
This manual page was written by Chad David ⟨davidc@acns.ab.ca⟩.