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. */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to