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"