summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorNeependra Khare <[email protected]>2010-12-06 17:05:58 +0530
committerBrian Behlendorf <[email protected]>2011-01-11 12:14:48 -0800
commit3f688a8c381d298062467a318994bb5849b1c8c1 (patch)
tree9928481bcc392993b97eabdeeffac8dfa5b5485e /include
parent6bf4d76f4782a13f3ed378d77a0bc17967c3642a (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.h28
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 */