version 1.61, 2017/06/01 02:45:13 |
version 1.62, 2017/12/08 01:19:29 |
Line 542 lwp_park(clockid_t clock_id, int flags, |
|
Line 542 lwp_park(clockid_t clock_id, int flags, |
|
kmutex_t *mp; |
kmutex_t *mp; |
wchan_t wchan; |
wchan_t wchan; |
int timo, error; |
int timo, error; |
|
struct timespec start; |
lwp_t *l; |
lwp_t *l; |
|
bool timeremain = !(flags & TIMER_ABSTIME) && ts; |
|
|
if (ts != NULL) { |
if (ts != NULL) { |
if ((error = ts2timo(clock_id, flags, ts, &timo, NULL)) != 0) |
if ((error = ts2timo(clock_id, flags, ts, &timo, |
|
timeremain ? &start : NULL)) != 0) |
return error; |
return error; |
KASSERT(timo != 0); |
KASSERT(timo != 0); |
} else { |
} else { |
Line 575 lwp_park(clockid_t clock_id, int flags, |
|
Line 578 lwp_park(clockid_t clock_id, int flags, |
|
switch (error) { |
switch (error) { |
case EWOULDBLOCK: |
case EWOULDBLOCK: |
error = ETIMEDOUT; |
error = ETIMEDOUT; |
|
if (timeremain) |
|
memset(ts, 0, sizeof(*ts)); |
break; |
break; |
case ERESTART: |
case ERESTART: |
error = EINTR; |
error = EINTR; |
break; |
/*FALLTHROUGH*/ |
default: |
default: |
/* nothing */ |
if (timeremain) |
|
clock_timeleft(clock_id, ts, &start); |
break; |
break; |
} |
} |
return error; |
return error; |
Line 598 sys____lwp_park60(struct lwp *l, const s |
|
Line 604 sys____lwp_park60(struct lwp *l, const s |
|
/* { |
/* { |
syscallarg(clockid_t) clock_id; |
syscallarg(clockid_t) clock_id; |
syscallarg(int) flags; |
syscallarg(int) flags; |
syscallarg(const struct timespec *) ts; |
syscallarg(struct timespec *) ts; |
syscallarg(lwpid_t) unpark; |
syscallarg(lwpid_t) unpark; |
syscallarg(const void *) hint; |
syscallarg(const void *) hint; |
syscallarg(const void *) unparkhint; |
syscallarg(const void *) unparkhint; |
Line 621 sys____lwp_park60(struct lwp *l, const s |
|
Line 627 sys____lwp_park60(struct lwp *l, const s |
|
return error; |
return error; |
} |
} |
|
|
return lwp_park(SCARG(uap, clock_id), SCARG(uap, flags), tsp, |
error = lwp_park(SCARG(uap, clock_id), SCARG(uap, flags), tsp, |
SCARG(uap, hint)); |
SCARG(uap, hint)); |
|
if (SCARG(uap, ts) != NULL && (SCARG(uap, flags) & TIMER_ABSTIME) == 0) |
|
(void)copyout(tsp, SCARG(uap, ts), sizeof(*tsp)); |
|
return error; |
} |
} |
|
|
int |
int |