summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_thr.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2010-08-24 07:29:55 +0000
committerdavidxu <davidxu@FreeBSD.org>2010-08-24 07:29:55 +0000
commit22bc7d14adbb5eafb74fafc4d1195b6afb50f8f4 (patch)
tree2e5f115e0e5d1d9d39ca99557f025052b3bbf82c /sys/kern/kern_thr.c
parent6616b254f2075a009cda27d1126639df51d92860 (diff)
downloadFreeBSD-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.c23
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);
OpenPOWER on IntegriCloud