DragonFly On-Line Manual Pages

Search: Section:  


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

Search: Section: