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 */
/* 'expire_time' argument is an absolute wall clock time in jiffies.
* Return value is time left (expire_time - now) or -1 if timeout occurred.
*/
-clock_t
-__cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time)
+static clock_t
+__cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp,
+ clock_t expire_time, int state)
{
DEFINE_WAIT(wait);
clock_t time_left;
if (time_left <= 0)
SRETURN(-1);
- prepare_to_wait_exclusive(&cvp->cv_event, &wait,
- TASK_UNINTERRUPTIBLE);
+ prepare_to_wait_exclusive(&cvp->cv_event, &wait, state);
atomic_inc(&cvp->cv_waiters);
/* Mutex should be dropped after prepare_to_wait() this
SRETURN(time_left > 0 ? time_left : -1);
}
+
+clock_t
+__cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time)
+{
+ return __cv_timedwait_common(cvp, mp, exp_time, TASK_UNINTERRUPTIBLE);
+}
EXPORT_SYMBOL(__cv_timedwait);
+clock_t
+__cv_timedwait_interruptible(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time)
+{
+ return __cv_timedwait_common(cvp, mp, exp_time, TASK_INTERRUPTIBLE);
+}
+EXPORT_SYMBOL(__cv_timedwait_interruptible);
+
void
__cv_signal(kcondvar_t *cvp)
{