libc/stdio: Add _unlocked() flavors of fflush, fputc, fputs, fread, fwrite.
[dragonfly.git] / sys / sys / condvar.h
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_ */