Author: davidxu
Date: Wed Oct 20 00:41:38 2010
New Revision: 214091
URL: http://svn.freebsd.org/changeset/base/214091

Log:
  - Don't include sx.h, it is not needed.
  - Check NULL pointer, move timeout calculation code outside of
    process lock.

Modified:
  head/sys/kern/kern_thr.c

Modified: head/sys/kern/kern_thr.c
==============================================================================
--- head/sys/kern/kern_thr.c    Wed Oct 20 00:24:30 2010        (r214090)
+++ head/sys/kern/kern_thr.c    Wed Oct 20 00:41:38 2010        (r214091)
@@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/sysproto.h>
 #include <sys/signalvar.h>
-#include <sys/sx.h>
 #include <sys/ucontext.h>
 #include <sys/thr.h>
 #include <sys/rtprio.h>
@@ -431,40 +430,40 @@ thr_suspend(struct thread *td, struct th
 int
 kern_thr_suspend(struct thread *td, struct timespec *tsp)
 {
+       struct proc *p = td->td_proc;
        struct timeval tv;
        int error = 0;
        int timo = 0;
 
-       if (tsp != NULL) {
-               if (tsp->tv_nsec < 0 || tsp->tv_nsec > 1000000000)
-                       return (EINVAL);
-       }
-
        if (td->td_pflags & TDP_WAKEUP) {
                td->td_pflags &= ~TDP_WAKEUP;
                return (0);
        }
 
-       PROC_LOCK(td->td_proc);
-       if ((td->td_flags & TDF_THRWAKEUP) == 0) {
+       if (tsp != NULL) {
+               if (tsp->tv_nsec < 0 || tsp->tv_nsec > 1000000000)
+                       return (EINVAL);
                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);
                }
        }
 
+       PROC_LOCK(p);
+       if (error == 0 && (td->td_flags & TDF_THRWAKEUP) == 0)
+               error = msleep((void *)td, &p->p_mtx,
+                        PCATCH, "lthr", timo);
+
        if (td->td_flags & TDF_THRWAKEUP) {
                thread_lock(td);
                td->td_flags &= ~TDF_THRWAKEUP;
                thread_unlock(td);
-               PROC_UNLOCK(td->td_proc);
+               PROC_UNLOCK(p);
                return (0);
        }
-       PROC_UNLOCK(td->td_proc);
+       PROC_UNLOCK(p);
        if (error == EWOULDBLOCK)
                error = ETIMEDOUT;
        else if (error == ERESTART) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to