sx sx_init sx_init_flags sx_destroy sx_slock sx_xlock sx_slock_sig sx_xlock_sig sx_try_slock sx_try_xlock sx_sunlock sx_xunlock sx_unlock sx_try_upgrade sx_downgrade sx_sleep sx_xholder sx_xlocked sx_assert SX_SYSINIT - kernel shared/exclusive lock
options INVARIANTS
options INVARIANT_SUPPORT
void
sx_assert (struct sx *sx int what);
#include <sys/kernel.h>
SX_SYSINIT (name struct sx *sx const char *description);
Shared/exclusive locks are created with either
sx_init ();
or
sx_init_flags ();
where
Fa sx
is a pointer to space for a
Vt struct sx ,
and
Fa description
is a pointer to a null-terminated character string that describes the
shared/exclusive lock.
The
Fa opts
argument to
sx_init_flags ();
specifies a set of optional flags to alter the behavior of
Fa sx .
It contains one or more of the following flags:
Shared/exclusive locks are destroyed with
sx_destroy (.);
The lock
Fa sx
must not be locked by any thread when it is destroyed.
Threads acquire and release a shared lock by calling
sx_slock (,);
sx_slock_sig ();
or
sx_try_slock ();
and
sx_sunlock ();
or
sx_unlock (.);
Threads acquire and release an exclusive lock by calling
sx_xlock (,);
sx_xlock_sig ();
or
sx_try_xlock ();
and
sx_xunlock ();
or
sx_unlock (.);
A thread can attempt to upgrade a currently held shared lock to an exclusive
lock by calling
sx_try_upgrade (.);
A thread that has 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.
sx_slock_sig ();
and
sx_xlock_sig ();
do the same as their normal versions but performing an interruptible sleep.
They return a non-zero value if the sleep has been interrupted by a signal
or an interrupt, otherwise 0.
A thread can atomically release a shared/exclusive lock while waiting for an
event by calling
sx_sleep (.);
For more details on the parameters to this function,
see
sleep(9).
When compiled with
options INVARIANTS
and
options INVARIANT_SUPPORT
the
sx_assert ();
function tests
Fa sx
for the assertions specified in
Fa what ,
and panics if they are not met.
One of the following assertions must be specified:
In addition, one of the following optional assertions may be included with either an SA_LOCKED SA_SLOCKED or SA_XLOCKED assertion:
sx_xholder ();
will return a pointer to the thread which currently holds an exclusive lock on
Fa sx .
If no thread holds an exclusive lock on
Fa sx ,
then
NULL
is returned instead.
sx_xlocked ();
will return non-zero if the current thread holds the exclusive lock;
otherwise, it will return zero.
For ease of programming,
sx_unlock ();
is provided as a macro frontend to the respective functions,
sx_sunlock ();
and
sx_xunlock (.);
Algorithms that are aware of what state the lock is in should use either
of the two specific functions for a minor performance benefit.
The
SX_SYSINIT ();
macro is used to generate a call to the
sx_sysinit ();
routine at system startup in order to initialize a given
Fa sx
lock.
The parameters are the same as
sx_init ();
but with an additional argument,
Fa name ,
that is used in generating unique variable names for the related
structures associated with the lock and the sysinit routine.
A thread may not hold both a shared lock and an exclusive lock on the same lock simultaneously; attempting to do so will result in deadlock.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |