svn commit: r238814 - in projects/calloutng/sys: kern sys
Davide Italiano
davide at FreeBSD.org
Thu Jul 26 18:13:22 UTC 2012
Author: davide
Date: Thu Jul 26 18:13:21 2012
New Revision: 238814
URL: http://svn.freebsd.org/changeset/base/238814
Log:
Introduce tsleep_bt() function as part of the sleep(9) KPI. Use it in
kern_nanosleep() so that we don't need to duplicate _sleep() code.
Modified:
projects/calloutng/sys/kern/kern_synch.c
projects/calloutng/sys/kern/kern_time.c
projects/calloutng/sys/sys/systm.h
Modified: projects/calloutng/sys/kern/kern_synch.c
==============================================================================
--- projects/calloutng/sys/kern/kern_synch.c Thu Jul 26 17:30:34 2012 (r238813)
+++ projects/calloutng/sys/kern/kern_synch.c Thu Jul 26 18:13:21 2012 (r238814)
@@ -162,7 +162,7 @@ _sleep(void *ident, struct lock_object *
#endif
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Sleeping on \"%s\"", wmesg);
- KASSERT(timo != 0 || mtx_owned(&Giant) || lock != NULL,
+ KASSERT(timo != 0 || bt != NULL || mtx_owned(&Giant) || lock != NULL,
("sleeping without a lock"));
KASSERT(p != NULL, ("msleep1"));
KASSERT(ident != NULL && TD_IS_RUNNING(td), ("msleep"));
@@ -242,9 +242,9 @@ _sleep(void *ident, struct lock_object *
lock_state = class->lc_unlock(lock);
sleepq_lock(ident);
}
- if ((timo || bt) && catch)
+ if ((timo != 0 || bt != NULL) && catch)
rval = sleepq_timedwait_sig(ident, pri);
- else if (timo || bt)
+ else if (timo != 0 || bt != NULL)
rval = sleepq_timedwait(ident, pri);
else if (catch)
rval = sleepq_wait_sig(ident, pri);
Modified: projects/calloutng/sys/kern/kern_time.c
==============================================================================
--- projects/calloutng/sys/kern/kern_time.c Thu Jul 26 17:30:34 2012 (r238813)
+++ projects/calloutng/sys/kern/kern_time.c Thu Jul 26 18:13:21 2012 (r238814)
@@ -365,10 +365,8 @@ kern_nanosleep(struct thread *td, struct
timespec2bintime(rqt, &tmp);
bintime_add(&bt,&tmp);
for (;;) {
- sleepq_lock(&nanowait);
- sleepq_add(&nanowait, NULL, "nanslp", PWAIT | PCATCH, 0);
- sleepq_set_timeout_bt(&nanowait, &bt, C_DIRECT_EXEC);
- error = sleepq_timedwait_sig(&nanowait, PWAIT | PCATCH);
+ error = tsleep_bt(&nanowait, PWAIT | PCATCH, "nanslp", &bt,
+ C_DIRECT_EXEC);
binuptime(&bt2);
if (error != EWOULDBLOCK) {
if (error == ERESTART)
Modified: projects/calloutng/sys/sys/systm.h
==============================================================================
--- projects/calloutng/sys/sys/systm.h Thu Jul 26 17:30:34 2012 (r238813)
+++ projects/calloutng/sys/sys/systm.h Thu Jul 26 18:13:21 2012 (r238814)
@@ -356,6 +356,8 @@ int msleep_spin(void *chan, struct mtx *
int pause(const char *wmesg, int timo);
#define tsleep(chan, pri, wmesg, timo) \
_sleep((chan), NULL, (pri), (wmesg), (timo), NULL, 0)
+#define tsleep_bt(chan, pri, wmesg, bt, flags) \
+ _sleep((chan), NULL, (pri), (wmesg), 0, (bt), (flags))
void wakeup(void *chan) __nonnull(1);
void wakeup_one(void *chan) __nonnull(1);
More information about the svn-src-projects
mailing list