xref: /dragonfly/sys/sys/condvar.h (revision 3426d2c2fbeac9a3dbd8dbb031afd28623ead0fa)
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