mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 19:19:32 +03:00
Fix cv_timedwait_hires
The user space implementation of cv_timedwait_hires() was always passing
a relative time to pthread_cond_timedwait() when an absolute time is
expected. This was accidentally introduced in commit 206971d2
.
Replace two magic values with their corresponding preprocessor macro.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Closes #5024
This commit is contained in:
parent
9907cc1cc8
commit
67925abb5e
@ -509,7 +509,7 @@ cv_timedwait(kcondvar_t *cv, kmutex_t *mp, clock_t abstime)
|
|||||||
VERIFY(gettimeofday(&tv, NULL) == 0);
|
VERIFY(gettimeofday(&tv, NULL) == 0);
|
||||||
|
|
||||||
ts.tv_sec = tv.tv_sec + delta / hz;
|
ts.tv_sec = tv.tv_sec + delta / hz;
|
||||||
ts.tv_nsec = tv.tv_usec * 1000 + (delta % hz) * (NANOSEC / hz);
|
ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % hz) * (NANOSEC / hz);
|
||||||
if (ts.tv_nsec >= NANOSEC) {
|
if (ts.tv_nsec >= NANOSEC) {
|
||||||
ts.tv_sec++;
|
ts.tv_sec++;
|
||||||
ts.tv_nsec -= NANOSEC;
|
ts.tv_nsec -= NANOSEC;
|
||||||
@ -534,6 +534,7 @@ cv_timedwait_hires(kcondvar_t *cv, kmutex_t *mp, hrtime_t tim, hrtime_t res,
|
|||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
struct timeval tv;
|
||||||
timestruc_t ts;
|
timestruc_t ts;
|
||||||
hrtime_t delta;
|
hrtime_t delta;
|
||||||
|
|
||||||
@ -546,11 +547,17 @@ cv_timedwait_hires(kcondvar_t *cv, kmutex_t *mp, hrtime_t tim, hrtime_t res,
|
|||||||
if (delta <= 0)
|
if (delta <= 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
ts.tv_sec = delta / NANOSEC;
|
VERIFY(gettimeofday(&tv, NULL) == 0);
|
||||||
ts.tv_nsec = delta % NANOSEC;
|
|
||||||
|
ts.tv_sec = tv.tv_sec + delta / NANOSEC;
|
||||||
|
ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC + (delta % NANOSEC);
|
||||||
|
if (ts.tv_nsec >= NANOSEC) {
|
||||||
|
ts.tv_sec++;
|
||||||
|
ts.tv_nsec -= NANOSEC;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(mutex_owner(mp) == curthread);
|
ASSERT(mutex_owner(mp) == curthread);
|
||||||
mp->m_owner = NULL;
|
mp->m_owner = MTX_INIT;
|
||||||
error = pthread_cond_timedwait(&cv->cv, &mp->m_lock, &ts);
|
error = pthread_cond_timedwait(&cv->cv, &mp->m_lock, &ts);
|
||||||
mp->m_owner = curthread;
|
mp->m_owner = curthread;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user