svn commit: r194771 - in head/sys: kern sys

Ed Schouten ed at FreeBSD.org
Tue Jun 23 21:43:03 UTC 2009


Author: ed
Date: Tue Jun 23 21:43:02 2009
New Revision: 194771
URL: http://svn.freebsd.org/changeset/base/194771

Log:
  Improve my last commit: use a separate condvar to serialize.
  
  The advantage of using a separate condvar is that we can just use
  cv_signal(9) instead of cv_broadcast(9). It makes no sense to wake up
  multiple threads. It also makes the TTY code easier to understand.
  t_dcdwait sounds totally unrelated.

Modified:
  head/sys/kern/tty.c
  head/sys/sys/tty.h

Modified: head/sys/kern/tty.c
==============================================================================
--- head/sys/kern/tty.c	Tue Jun 23 21:37:12 2009	(r194770)
+++ head/sys/kern/tty.c	Tue Jun 23 21:43:02 2009	(r194771)
@@ -456,7 +456,7 @@ ttydev_write(struct cdev *dev, struct ui
 	} else {
 		/* Serialize write() calls. */
 		while (tp->t_flags & TF_BUSY_OUT) {
-			error = tty_wait(tp, &tp->t_dcdwait);
+			error = tty_wait(tp, &tp->t_outserwait);
 			if (error)
 				goto done;
 		}
@@ -464,7 +464,7 @@ ttydev_write(struct cdev *dev, struct ui
  		tp->t_flags |= TF_BUSY_OUT;
 		error = ttydisc_write(tp, uio, ioflag);
  		tp->t_flags &= ~TF_BUSY_OUT;
-		cv_broadcast(&tp->t_dcdwait);
+		cv_signal(&tp->t_outserwait);
 	}
 
 done:	tty_unlock(tp);
@@ -916,6 +916,7 @@ tty_alloc_mutex(struct ttydevsw *tsw, vo
 
 	cv_init(&tp->t_inwait, "ttyin");
 	cv_init(&tp->t_outwait, "ttyout");
+	cv_init(&tp->t_outserwait, "ttyosr");
 	cv_init(&tp->t_bgwait, "ttybg");
 	cv_init(&tp->t_dcdwait, "ttydcd");
 
@@ -959,6 +960,7 @@ tty_dealloc(void *arg)
 	cv_destroy(&tp->t_outwait);
 	cv_destroy(&tp->t_bgwait);
 	cv_destroy(&tp->t_dcdwait);
+	cv_destroy(&tp->t_outserwait);
 
 	if (tp->t_mtx == &tp->t_mtxobj)
 		mtx_destroy(&tp->t_mtxobj);

Modified: head/sys/sys/tty.h
==============================================================================
--- head/sys/sys/tty.h	Tue Jun 23 21:37:12 2009	(r194770)
+++ head/sys/sys/tty.h	Tue Jun 23 21:43:02 2009	(r194771)
@@ -97,6 +97,7 @@ struct tty {
 	/* Sleeping mechanisms. */
 	struct cv	t_inwait;	/* (t) Input wait queue. */
 	struct cv	t_outwait;	/* (t) Output wait queue. */
+	struct cv	t_outserwait;	/* (t) Serial output wait queue. */
 	struct cv	t_bgwait;	/* (t) Background wait queue. */
 	struct cv	t_dcdwait;	/* (t) Carrier Detect wait queue. */
 


More information about the svn-src-head mailing list