diff options
author | Neependra Khare <[email protected]> | 2010-12-06 17:05:58 +0530 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-01-11 12:14:48 -0800 |
commit | 3f688a8c381d298062467a318994bb5849b1c8c1 (patch) | |
tree | 9928481bcc392993b97eabdeeffac8dfa5b5485e /include | |
parent | 6bf4d76f4782a13f3ed378d77a0bc17967c3642a (diff) |
Add cv_timedwait_interruptible() function
The cv_timedwait() function by definition must wait unconditionally
for cv_signal()/cv_broadcast() before waking. This causes processes
to go in the D state which increases the load average. The load
average is the summation of processes in D state and run queue.
To avoid this it can be desirable to sleep interruptibly. These
processes do not count against the load average but may be woken by
a signal. It is up to the caller to determine why the process
was woken it may be for one of three reasons.
1) cv_signal()/cv_broadcast()
2) the timeout expired
3) a signal was received
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/condvar.h | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/include/sys/condvar.h b/include/sys/condvar.h index 18e5a6fcf..7566daed7 100644 --- a/include/sys/condvar.h +++ b/include/sys/condvar.h @@ -53,21 +53,25 @@ extern void __cv_destroy(kcondvar_t *cvp); extern void __cv_wait(kcondvar_t *cvp, kmutex_t *mp); extern void __cv_wait_interruptible(kcondvar_t *cvp, kmutex_t *mp); extern clock_t __cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time); +extern clock_t __cv_timedwait_interruptible(kcondvar_t *cvp, kmutex_t *mp, + clock_t exp_time); extern void __cv_signal(kcondvar_t *cvp); extern void __cv_broadcast(kcondvar_t *cvp); -#define cv_init(cvp, name, type, arg) \ -({ \ - if ((name) == NULL) \ - __cv_init(cvp, #cvp, type, arg); \ - else \ - __cv_init(cvp, name, type, arg); \ +#define cv_init(cvp, name, type, arg) \ +({ \ + if ((name) == NULL) \ + __cv_init(cvp, #cvp, type, arg); \ + else \ + __cv_init(cvp, name, type, arg); \ }) -#define cv_destroy(cvp) __cv_destroy(cvp) -#define cv_wait(cvp, mp) __cv_wait(cvp, mp) -#define cv_wait_interruptible(cvp, mp) __cv_wait_interruptible(cvp, mp) -#define cv_timedwait(cvp, mp, t) __cv_timedwait(cvp, mp, t) -#define cv_signal(cvp) __cv_signal(cvp) -#define cv_broadcast(cvp) __cv_broadcast(cvp) +#define cv_destroy(cvp) __cv_destroy(cvp) +#define cv_wait(cvp, mp) __cv_wait(cvp, mp) +#define cv_wait_interruptible(cvp, mp) __cv_wait_interruptible(cvp,mp) +#define cv_timedwait(cvp, mp, t) __cv_timedwait(cvp, mp, t) +#define cv_timedwait_interruptible(cvp, mp, t) \ + __cv_timedwait_interruptible(cvp, mp, t) +#define cv_signal(cvp) __cv_signal(cvp) +#define cv_broadcast(cvp) __cv_broadcast(cvp) #endif /* _SPL_CONDVAR_H */ |