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