FreeBSD Manual Pages
CONDVAR(9) BSD Kernel Developer's Manual CONDVAR(9) NAME condvar, cv_init, cv_destroy, cv_wait, cv_wait_sig, cv_timedwait, cv_timedwait_sig, cv_signal, cv_broadcast, cv_waitq_remove, cv_waitq_empty, cv_wmesg -- kernel condition variable SYNOPSIS #include <sys/param.h> #include <sys/proc.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 mtx *mp); int cv_wait_sig(struct cv *cvp, struct mtx *mp); int cv_timedwait(struct cv *cvp, struct mtx *mp, int timo); int cv_timedwait_sig(struct cv *cvp, struct mtx *mp, int timo); void cv_signal(struct cv *cvp); void cv_broadcast(struct cv *cvp); void cv_waitq_remove(struct thread *td); int cv_waitq_empty(struct cv *cvp); const char * cv_wmesg(struct cv *cvp); DESCRIPTION Condition variables are used in conjunction with mutexes to wait for con- ditions 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() to unblock all waiters. cv_waitq_remove() removes a waiting thread from a condition variable wait queue, if it is on one. cv_waitq_empty() reports whether there are any waiters on cvp. cv_wmesg() returns the description string of cvp, as set by the initial call to cv_init(). A thread must hold mp before calling cv_wait(), cv_wait_sig(), cv_timedwait(), or cv_timedwait_sig(). When a thread waits on a condi- tion, mp is atomically released before the thread is blocked, then atomi- cally reacquired before the function call returns. All waiters must pass the same mp in conjunction with cvp. A thread must hold mp while calling cv_signal() or cv_broadcast(), even though it isn't passed as an argu- ment. When cv_wait(), cv_wait_sig(), cv_timedwait(), and cv_timedwait_sig() un- block, their calling threads are made runnable. cv_timedwait() and cv_timedwait_sig() wait for at most timo / HZ seconds before being un- blocked 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(). RETURN VALUES If successful, cv_wait_sig(), cv_timedwait(), and cv_timedwait_sig() re- turn 0. Otherwise, a non-zero error code is returned. cv_waitq_empty() returns non-zero if there are no threads on the wait queue; 0 otherwise. cv_wmesg() returns the description string that was passed to cv_init(). ERRORS cv_wait_sig() and cv_timedwait_sig() will fail if: [EINTR] An unmasked signal was caught. [ERESTART] A masked signal was caught. cv_timedwait() and cv_timedwait_sig() will fail if: [EWOULDBLOCK] Timeout expired. SEE ALSO msleep(9), mtx_pool(9), mutex(9), sema(9), sx(9) BSD December 11, 2000 BSD
NAME | SYNOPSIS | DESCRIPTION | RETURN VALUES | ERRORS | SEE ALSO
Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=condvar&sektion=9&manpath=FreeBSD+5.2-RELEASE+and+Ports>