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"

Reply via email to