From 2961a78226146c45dbed5c8f0c66379162087a25 Mon Sep 17 00:00:00 2001 From: David Xu Date: Tue, 24 Aug 2010 07:29:55 +0000 Subject: [PATCH] Optimize thr_suspend, if timeout is zero, don't call msleep, just return immediately. --- sys/kern/kern_thr.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index 17b6cd5d3d1a..21f064458bf2 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);