mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Add cv_wait_interruptible() function.
This is a minor extension to the condition variable API to allow for reasonable signal handling on Linux. The cv_wait() function by definition must wait unconditionally for cv_signal()/cv_broadcast() before waking it. This makes it impossible to woken by a signal such as SIGTERM. The cv_wait_interruptible() function was added to handle this case. It behaves identically to cv_wait() with the exception that it waits interruptibly allowing a signal to wake it up. This means you do need to be careful and check issig() after waking.
This commit is contained in:
@@ -57,8 +57,8 @@ typedef enum { CV_DEFAULT=0, CV_DRIVER } kcv_type_t;
|
||||
extern void __cv_init(kcondvar_t *cvp, char *name, kcv_type_t type, void *arg);
|
||||
extern void __cv_destroy(kcondvar_t *cvp);
|
||||
extern void __cv_wait(kcondvar_t *cvp, kmutex_t *mp);
|
||||
extern clock_t __cv_timedwait(kcondvar_t *cvp, kmutex_t *mp,
|
||||
clock_t expire_time);
|
||||
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 void __cv_signal(kcondvar_t *cvp);
|
||||
extern void __cv_broadcast(kcondvar_t *cvp);
|
||||
|
||||
@@ -71,6 +71,7 @@ extern void __cv_broadcast(kcondvar_t *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_signal(cvp) __cv_signal(cvp)
|
||||
#define cv_broadcast(cvp) __cv_broadcast(cvp)
|
||||
|
||||
Reference in New Issue
Block a user