#ifndef _SYS_CONDVAR_H_ #define _SYS_CONDVAR_H_ #include #include struct lock; struct cv { struct spinlock cv_lock; int cv_waiters; const char *cv_desc; }; void cv_init(struct cv *, const char *desc); void cv_destroy(struct cv *); int _cv_timedwait(struct cv *, struct lock *, int timo, int wakesig); int _cv_mtx_timedwait(struct cv *, struct mtx *, int timo, int wakesig); void _cv_signal(struct cv *, int broadcast); int cv_has_waiters(const struct cv *); #define cv_wait(cv, lock) \ _cv_timedwait((cv), (lock), 0, 0) #define cv_wait_sig(cv, lock) \ _cv_timedwait((cv), (lock), 0, 1) #define cv_timedwait(cv, lock, timeo) \ _cv_timedwait((cv), (lock), (timeo), 0) #define cv_timedwait_sig(cv, lock, timeo) \ _cv_timedwait((cv), (lock), (timeo), 1) #define cv_mtx_wait(cv, mtx) \ _cv_mtx_timedwait((cv), (mtx), 0, 0) #define cv_mtx_wait_sig(cv, mtx) \ _cv_mtx_timedwait((cv), (mtx), 0, 1) #define cv_mtx_timedwait(cv, mtx, timeo) \ _cv_mtx_timedwait((cv), (mtx), (timeo), 0) #define cv_mtx_timedwait_sig(cv, mtx, timeo) \ _cv_mtx_timedwait((cv), (mtx), (timeo), 1) #define cv_signal(cv) \ _cv_signal((cv), 0) #define cv_broadcast(cv) \ _cv_signal((cv), 1) #define cv_broadcastpri(cv, pri) \ cv_broadcast((cv)) #endif /* _SYS_CONDVAR_H_ */