1 #ifndef _SYS_CONDVAR_H_ 2 #define _SYS_CONDVAR_H_ 3 4 #include <sys/spinlock.h> 5 #include <sys/mutex.h> 6 7 struct lock; 8 9 struct cv { 10 struct spinlock cv_lock; 11 int cv_waiters; 12 const char *cv_desc; 13 }; 14 15 void cv_init(struct cv *, const char *desc); 16 void cv_destroy(struct cv *); 17 18 int _cv_timedwait(struct cv *, struct lock *, int timo, int wakesig); 19 int _cv_mtx_timedwait(struct cv *, struct mtx *, int timo, int wakesig); 20 void _cv_signal(struct cv *, int broadcast); 21 22 int cv_has_waiters(const struct cv *); 23 24 #define cv_wait(cv, lock) \ 25 _cv_timedwait((cv), (lock), 0, 0) 26 #define cv_wait_sig(cv, lock) \ 27 _cv_timedwait((cv), (lock), 0, 1) 28 #define cv_timedwait(cv, lock, timeo) \ 29 _cv_timedwait((cv), (lock), (timeo), 0) 30 #define cv_timedwait_sig(cv, lock, timeo) \ 31 _cv_timedwait((cv), (lock), (timeo), 1) 32 33 #define cv_mtx_wait(cv, mtx) \ 34 _cv_mtx_timedwait((cv), (mtx), 0, 0) 35 #define cv_mtx_wait_sig(cv, mtx) \ 36 _cv_mtx_timedwait((cv), (mtx), 0, 1) 37 #define cv_mtx_timedwait(cv, mtx, timeo) \ 38 _cv_mtx_timedwait((cv), (mtx), (timeo), 0) 39 #define cv_mtx_timedwait_sig(cv, mtx, timeo) \ 40 _cv_mtx_timedwait((cv), (mtx), (timeo), 1) 41 42 #define cv_signal(cv) \ 43 _cv_signal((cv), 0) 44 #define cv_broadcast(cv) \ 45 _cv_signal((cv), 1) 46 #define cv_broadcastpri(cv, pri) \ 47 cv_broadcast((cv)) 48 49 #endif /* _SYS_CONDVAR_H_ */ 50