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.
This commit is contained in:
ed 2009-06-23 21:43:02 +00:00
parent f46a6593e2
commit 4a4fe9e6fc
2 changed files with 5 additions and 2 deletions

View File

@ -456,7 +456,7 @@ ttydev_write(struct cdev *dev, struct uio *uio, int ioflag)
} 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 uio *uio, int ioflag)
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, void *sc, struct mtx *mutex)
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);

View File

@ -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. */