DragonFly On-Line Manual Pages
CONDVAR(9) DragonFly Kernel Developer's Manual CONDVAR(9)
NAME
condvar, cv_init, cv_destroy, cv_wait, cv_wait_sig, cv_timedwait,
cv_timedwait_sig, cv_mtx_wait, cv_mtx_wait_sig, cv_mtx_timedwait,
cv_mtx_timedwait_sig, cv_signal, cv_broadcast, cv_broadcastpri -- kernel
condition variable
SYNOPSIS
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/condvar.h>
void
cv_init(struct cv *cvp, const char *desc);
void
cv_destroy(struct cv *cvp);
void
cv_wait(struct cv *cvp, struct lock *l);
int
cv_wait_sig(struct cv *cvp, struct lock *l);
int
cv_timedwait(struct cv *cvp, struct lock *l, int timo);
int
cv_timedwait_sig(struct cv *cvp, struct lock *l, int timo);
void
cv_mtx_wait(struct cv *cvp, struct mtx *m);
int
cv_mtx_wait_sig(struct cv *cvp, struct mtx *m);
int
cv_mtx_timedwait(struct cv *cvp, struct mtx *m, int timo);
int
cv_mtx_timedwait_sig(struct cv *cvp, struct mtx *m, int timo);
void
cv_signal(struct cv *cvp);
void
cv_broadcast(struct cv *cvp);
void
cv_broadcastpri(struct cv *cvp, int pri);
DESCRIPTION
Condition variables are used in conjunction with locks to wait for
conditions to occur. Condition variables are created with cv_init(),
where cvp is a pointer to space for a struct cv, and desc is a pointer to
a null-terminated character string that describes the condition variable.
Condition variables are destroyed with cv_destroy(). Threads wait on
condition variables by calling cv_wait(), cv_wait_sig(), cv_timedwait(),
or cv_timedwait_sig(). Threads unblock waiters by calling cv_signal() to
unblock one waiter, or cv_broadcast() or cv_broadcastpri() to unblock all
waiters. cv_broadcastpri() is a synonym for cv_broadcast() in DragonFly
and discards the pri parameter.
A thread must hold l before calling cv_wait(), cv_wait_sig(),
cv_timedwait(), or cv_timedwait_sig(). When a thread waits on a
condition, l is atomically released before the thread is blocked, then
atomically reacquired before the function call returns. All waiters must
pass the same l in conjunction with cvp.
When cv_wait(), cv_wait_sig(), cv_timedwait(), and cv_timedwait_sig()
unblock, their calling threads are made runnable. cv_timedwait() and
cv_timedwait_sig() wait for at most timo / hz seconds before being
unblocked and returning EWOULDBLOCK; otherwise, they return 0.
cv_wait_sig() and cv_timedwait_sig() return prematurely with a value of
EINTR or ERESTART if a signal is caught, or 0 if signaled via cv_signal()
or cv_broadcast().
cv_mtx_wait(), cv_mtx_wait_sig(), cv_mtx_timedwait(), and
cv_mtx_timedwait_sig() work the same as cv_wait(), cv_wait_sig(),
cv_timedwait(), and cv_timedwait_sig() except that they take struct mtx
argument m.
IMPLEMENTATION NOTES
Condition variables exist primarily for code imported from other systems;
for DragonFly code, the tsleep() / wakeup() family of functions should be
used instead.
RETURN VALUES
If successful, cv_wait_sig(), cv_timedwait(), cv_timedwait_sig()
cv_mtx_wait_sig(), cv_mtx_timedwait(), and cv_mtx_timedwait_sig() return
0. Otherwise, a non-zero error code is returned.
FILES
Condition variables are implemented in /sys/kern/kern_condvar.c. The
public interface and structure is found in /sys/sys/condvar.h.
SEE ALSO
locking(9), lockmgr(9), mutex(9), tsleep(9)
HISTORY
Condition variables appeared in DragonFly 2.7.
AUTHORS
This manual page was written by Jason Evans for FreeBSD.
DragonFly 5.3 June 29, 2018 DragonFly 5.3