diff options
author | Xin LI <delphij@FreeBSD.org> | 2013-09-10 01:46:47 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2013-09-10 01:46:47 +0000 |
commit | e8de677c74061216f4a31f8f61e1d940f98a68c8 (patch) | |
tree | 0687bff9ba2d5136268f4e5308ff47b239b85978 /cddl/contrib/opensolaris/lib/libzpool | |
parent | 5dc80df9c54c97b902bd430900971055c3c8973d (diff) | |
parent | 0c75791b4cd5947e74ef52fb08958459b762d1d6 (diff) | |
download | src-e8de677c74061216f4a31f8f61e1d940f98a68c8.tar.gz src-e8de677c74061216f4a31f8f61e1d940f98a68c8.zip |
MFV r247844 (illumos-gate 13975:ef6409bc370f)
Illumos ZFS issues:
3582 zfs_delay() should support a variable resolution
3584 DTrace sdt probes for ZFS txg states
Provide a compatibility shim for Solaris's cv_timedwait_hires
to help aid future porting.
Approved by: re (ZFS blanket)
Notes
Notes:
svn path=/head/; revision=255437
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libzpool')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libzpool/common/kernel.c | 35 | ||||
-rw-r--r-- | cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h | 2 |
2 files changed, 37 insertions, 0 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c b/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c index 71c3dceaa0f1..c4e2d2e78aaa 100644 --- a/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c +++ b/cddl/contrib/opensolaris/lib/libzpool/common/kernel.c @@ -349,6 +349,41 @@ top: return (1); } +/*ARGSUSED*/ +clock_t +cv_timedwait_hires(kcondvar_t *cv, kmutex_t *mp, hrtime_t tim, hrtime_t res, + int flag) +{ + int error; + timestruc_t ts; + hrtime_t delta; + + ASSERT(flag == 0); + +top: + delta = tim - gethrtime(); + if (delta <= 0) + return (-1); + + ts.tv_sec = delta / NANOSEC; + ts.tv_nsec = delta % NANOSEC; + + ASSERT(mutex_owner(mp) == curthread); + mp->m_owner = NULL; + error = pthread_cond_timedwait(cv, &mp->m_lock, &ts); + mp->m_owner = curthread; + + if (error == ETIMEDOUT) + return (-1); + + if (error == EINTR) + goto top; + + ASSERT(error == 0); + + return (1); +} + void cv_signal(kcondvar_t *cv) { diff --git a/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h b/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h index da153c7c1668..15c181e204a5 100644 --- a/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h +++ b/cddl/contrib/opensolaris/lib/libzpool/common/sys/zfs_context.h @@ -313,6 +313,8 @@ extern void cv_init(kcondvar_t *cv, char *name, int type, void *arg); extern void cv_destroy(kcondvar_t *cv); extern void cv_wait(kcondvar_t *cv, kmutex_t *mp); extern clock_t cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime); +extern clock_t cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t tim, + hrtime_t res, int flag); extern void cv_signal(kcondvar_t *cv); extern void cv_broadcast(kcondvar_t *cv); |