diff options
author | davidxu <davidxu@FreeBSD.org> | 2010-08-24 07:29:55 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2010-08-24 07:29:55 +0000 |
commit | 22bc7d14adbb5eafb74fafc4d1195b6afb50f8f4 (patch) | |
tree | 2e5f115e0e5d1d9d39ca99557f025052b3bbf82c /sys/kern/kern_thr.c | |
parent | 6616b254f2075a009cda27d1126639df51d92860 (diff) | |
download | FreeBSD-src-22bc7d14adbb5eafb74fafc4d1195b6afb50f8f4.zip FreeBSD-src-22bc7d14adbb5eafb74fafc4d1195b6afb50f8f4.tar.gz |
Optimize thr_suspend, if timeout is zero, don't call msleep, just
return immediately.
Diffstat (limited to 'sys/kern/kern_thr.c')
-rw-r--r-- | sys/kern/kern_thr.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index 17b6cd5..21f0644 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -430,15 +430,12 @@ int kern_thr_suspend(struct thread *td, struct timespec *tsp) { struct timeval tv; - int error = 0, hz = 0; + int error = 0; + int timo = 0; if (tsp != NULL) { if (tsp->tv_nsec < 0 || tsp->tv_nsec > 1000000000) return (EINVAL); - if (tsp->tv_sec == 0 && tsp->tv_nsec == 0) - return (ETIMEDOUT); - TIMESPEC_TO_TIMEVAL(&tv, tsp); - hz = tvtohz(&tv); } if (td->td_pflags & TDP_WAKEUP) { @@ -447,9 +444,17 @@ kern_thr_suspend(struct thread *td, struct timespec *tsp) } PROC_LOCK(td->td_proc); - if ((td->td_flags & TDF_THRWAKEUP) == 0) - error = msleep((void *)td, &td->td_proc->p_mtx, PCATCH, "lthr", - hz); + if ((td->td_flags & TDF_THRWAKEUP) == 0) { + if (tsp->tv_sec == 0 && tsp->tv_nsec == 0) + error = EWOULDBLOCK; + else { + TIMESPEC_TO_TIMEVAL(&tv, tsp); + timo = tvtohz(&tv); + error = msleep((void *)td, &td->td_proc->p_mtx, + PCATCH, "lthr", timo); + } + } + if (td->td_flags & TDF_THRWAKEUP) { thread_lock(td); td->td_flags &= ~TDF_THRWAKEUP; @@ -461,7 +466,7 @@ kern_thr_suspend(struct thread *td, struct timespec *tsp) if (error == EWOULDBLOCK) error = ETIMEDOUT; else if (error == ERESTART) { - if (hz != 0) + if (timo != 0) error = EINTR; } return (error); |