Skip site navigation (1)Skip section navigation (2)

FreeBSD Man Pages

Man Page or Keyword Search:
Man Architecture
Apropos Keyword Search (all sections) Output format
home | help
SX(9)                  FreeBSD Kernel Developer's Manual                 SX(9)

NAME
     sx, sx_init, sx_destroy, sx_slock, sx_xlock, sx_try_slock, sx_try_xlock,
     sx_sunlock, sx_xunlock, sx_try_upgrade, sx_downgrade, sx_assert,
     SX_SYSINIT - kernel shared/exclusive lock

SYNOPSIS
     #include <sys/param.h>
     #include <sys/lock.h>
     #include <sys/mutex.h>
     #include <sys/sx.h>

     void
     sx_init(struct sx *sx, const char *description);

     void
     sx_destroy(struct sx *sx);

     void
     sx_slock(struct sx *sx);

     void
     sx_xlock(struct sx *sx);

     int
     sx_try_slock(struct sx *sx);

     int
     sx_try_xlock(struct sx *sx);

     void
     sx_sunlock(struct sx *sx);

     void
     sx_xunlock(struct sx *sx);

     int
     sx_try_upgrade(struct sx *sx);

     void
     sx_downgrade(struct sx *sx);

     void
     sx_assert(struct sx *sx, int what);

     SX_SYSINIT(name, struct sx *sx, const char *description);

DESCRIPTION
     Shared/exclusive locks are used to protect data that are read far more
     often than they are written.  Mutexes are inherently more efficient than
     shared/exclusive locks, so shared/exclusive locks should be used
     prudently.

     Shared/exclusive locks are created with sx_init(), where sx is a pointer
     to space for a struct sx, and description is a pointer to a null-
     terminated character string that describes the shared/exclusive lock.
     Shared/exclusive locks are destroyed with sx_destroy().  Threads acquire
     and release a shared lock by calling sx_slock() or sx_try_slock() and
     sx_sunlock().  Threads acquire and release an exclusive lock by calling
     sx_xlock() or sx_try_xlock() and sx_xunlock().  A thread can attempt to
     upgrade a currently owned shared lock to an exclusive lock by calling
     sx_try_upgrade().  A thread that owns an exclusive lock can downgrade it
     to a shared lock by calling sx_downgrade().

     sx_try_slock() and sx_try_xlock() will return 0 if the shared/exclusive
     lock cannot be acquired immediately; otherwise the shared/exclusive lock
     will be acquired and a non-zero value will be returned.

     sx_try_upgrade() will return 0 if the shared lock cannot be upgraded to
     an exclusive lock immediately; otherwise the exclusive lock will be
     acquired and a non-zero value will be returned.

     The sx_assert() function tests specified conditions and panics if they
     are not met and the kernel is compiled with INVARIANTS.

     The SX_SYSINIT() macro is used to generate a call to the sx_sysinit()
     routine at system startup in order to initialize a given sx lock.  The
     parameters are the same as sx_init() but with an additional argument,
     name, that is used in generating unique variable names for the related
     structures associated with the lock and the sysinit routine.

     The following assertions are supported:

     SX_LOCKED       Assert that the current thread has either a shared or an
                     exclusive lock on the sx lock pointed to by the first
                     argument.

     SX_SLOCKED      Assert that the current thread has a shared lock on the
                     sx lock pointed to by the first argument.

     SX_XLOCKED      Assert that the current thread has an exclusive lock on
                     the sx lock pointed to by the first argument.

     A thread may not own a shared lock and an exclusive lock simultaneously;
     attempting to do so will result in deadlock.

CONTEXT
     It is allowed to own a shared lock or an exclusive lock while sleeping.

SEE ALSO
     condvar(9), mtx_pool(9), mutex(9), sema(9)

BUGS
     Currently there is no way to assert that a lock is not held.  This is not
     possible in the non-WITNESS case for asserting that this thread does not
     hold a shared lock.  In the non-WITNESS case, the SX_LOCKED and
     SX_SLOCKED assertions merely check that some thread holds a shared lock.
     They do not ensure that the current thread holds a shared lock.

FreeBSD 11.0-PRERELEASE         August 14, 2001        FreeBSD 11.0-PRERELEASE

NAME | SYNOPSIS | DESCRIPTION | CONTEXT | SEE ALSO | BUGS

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=sx&sektion=9&manpath=FreeBSD+5.2-RELEASE>

home | help