Author: davidxu Date: Tue Aug 24 07:29:55 2010 New Revision: 211733 URL: http://svn.freebsd.org/changeset/base/211733
Log: Optimize thr_suspend, if timeout is zero, don't call msleep, just return immediately. Modified: head/sys/kern/kern_thr.c Modified: head/sys/kern/kern_thr.c ============================================================================== --- head/sys/kern/kern_thr.c Tue Aug 24 07:22:24 2010 (r211732) +++ head/sys/kern/kern_thr.c Tue Aug 24 07:29:55 2010 (r211733) @@ -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, stru } 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, stru if (error == EWOULDBLOCK) error = ETIMEDOUT; else if (error == ERESTART) { - if (hz != 0) + if (timo != 0) error = EINTR; } return (error); _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"