RWLOCK(9) | Kernel Developer's Manual | RWLOCK(9) |
rwlock
, rw_init
,
rw_init_flags
, rw_enter
,
rw_exit
, rw_enter_read
,
rw_enter_write
,
rw_exit_read
, rw_exit_write
,
rw_assert_wrlock
,
rw_assert_rdlock
,
rw_assert_anylock
,
rw_assert_unlocked
,
rw_status
,
RWLOCK_INITIALIZER
,
rrw_init
, rrw_init_flags
,
rrw_enter
, rrw_exit
,
rrw_status
— interface to
read/write locks
#include
<sys/rwlock.h>
void
rw_init
(struct
rwlock *rwl, const char
*name);
void
rw_init_flags
(struct
rwlock *rwl, const char
*name, int
flags);
int
rw_enter
(struct
rwlock *rwl, int
flags);
void
rw_exit
(struct
rwlock *rwl);
void
rw_enter_read
(struct
rwlock *rwl);
void
rw_enter_write
(struct
rwlock *rwl);
void
rw_exit_read
(struct
rwlock *rwl);
void
rw_exit_write
(struct
rwlock *rwl);
int
rw_assert_wrlock
(struct
rwlock *rwl);
void
rw_assert_rdlock
(struct
rwlock *rwl);
void
rw_assert_anylock
(struct
rwlock *rwl);
void
rw_assert_unlocked
(struct
rwlock *rwl);
int
rw_status
(struct
rwlock *rwl);
RWLOCK_INITIALIZER
(const
char *name);
void
rrw_init
(struct
rrwlock *rrwl, const char
*name);
void
rrw_init_flags
(struct
rrwlock *rrwl, const char
*name, int
flags);
int
rrw_enter
(struct
rrwlock *rrwl, int
flags);
void
rrw_exit
(struct
rrwlock *rrwl);
int
rrw_status
(struct
rrwlock *rrwl);
The rwlock
set of functions provides a
multiple-reader, single-writer locking mechanism to ensure mutual exclusion
between different threads.
Read locks can be acquired while the write lock is not held, and may coexist in distinct threads at any time. A write lock, however, can only be acquired when there are no read locks held, granting exclusive access to a single thread.
The rw_init
() function is used to initiate
the lock pointed to by rwl. The
name argument specifies the name of the lock, which is
used as the wait message if the thread needs to sleep.
The rw_init_flags
() macro is similar to
rw_init
(), but it additionally accepts a bitwise OR
of the following flags:
RWL_DUPOK
RWL_IS_VNODE
RWL_IS_VNODE
flag.RWL_NOWITNESS
The rw_enter
() function acquires a lock.
The flags argument specifies what kind of lock should
be obtained and also modifies the operation. The possible flags are:
RW_READ
RW_WRITE
RW_DOWNGRADE
RW_INTR
RW_NOSLEEP
EBUSY
instead.RW_SLEEPFAIL
EAGAIN
instead.RW_DUPOK
rw_enter
(), from logging when this thread already
has a lock of this lock type.The rw_exit
() function is used to release
a held lock.
The rw_enter_read
() function acquires a
read lock, sleeping if necessary.
The rw_enter_write
() function acquires a
write lock, sleeping if necessary.
The rw_exit_read
() function releases a
read lock.
The rw_exit_write
() function releases a
write lock.
The rw_assert_wrlock
(),
rw_assert_rdlock
(),
rw_assert_anylock
(), and
rw_assert_unlocked
() functions check the status
rwl, panicking if it is not write-, read-, any-, or
unlocked, respectively.
rw_status
returns the current state of the
lock.
A lock declaration may be initialised with the
RWLOCK_INITIALIZER
() macro. The
name argument specifies the name of the lock, which is
used as the wait message if the thread needs to sleep.
The rrwlock
functions support recursive
write locking by the same process. They otherwise behave the same as their
rwlock counterparts.
rw_init
(),
rw_init_flags
(), rrw_init
()
and rrw_init_flags
() can be called during autoconf,
from process context, or from interrupt context.
All other functions can be called during autoconf or from process context.
rw_enter
and
rrw_enter
return 0 on success, or an
errno(2) style value on failure.
rw_status
and
rrw_status
return the state of the lock:
RW_WRITE
RW_WRITE_OTHER
RW_READ
The rwlock
functions first appeared in
OpenBSD 3.5.
The rwlock
functions were written by
Artur Grabowski
<art@openbsd.org>.
November 4, 2019 | OpenBSD-current |