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:
parent
f46a6593e2
commit
4a4fe9e6fc
@ -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);
|
||||
|
@ -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. */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user