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