diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-09-03 20:55:30 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-09-03 20:55:30 +0000 |
commit | 7ce6c6c15ad0a4ae329e52cd49c832804ac2bd6c (patch) | |
tree | a9e728ebd0fcb58e1560a56f7e0bfa523b65642a | |
parent | c2d82ee48f06bdd997e99e5903a7d279737aaf9e (diff) |
fix cua/tty locking
-rw-r--r-- | sys/arch/i386/isa/pccom.c | 12 | ||||
-rw-r--r-- | sys/dev/ic/com.c | 12 |
2 files changed, 16 insertions, 8 deletions
diff --git a/sys/arch/i386/isa/pccom.c b/sys/arch/i386/isa/pccom.c index 07c14f2e873..b09e7790196 100644 --- a/sys/arch/i386/isa/pccom.c +++ b/sys/arch/i386/isa/pccom.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pccom.c,v 1.11 1997/07/07 17:08:04 niklas Exp $ */ +/* $OpenBSD: pccom.c,v 1.12 1997/09/03 20:55:29 deraadt Exp $ */ /* $NetBSD: com.c,v 1.82.4.1 1996/06/02 09:08:00 mrg Exp $ */ /*- @@ -838,12 +838,14 @@ comopen(dev, flag, mode, p) return EBUSY; } } else { - while (!(DEVCUA(dev) && sc->sc_cua) && - !ISSET(tp->t_cflag, CLOCAL) && - !ISSET(tp->t_state, TS_CARR_ON)) { + while (sc->sc_cua || + (!ISSET(tp->t_cflag, CLOCAL) && + !ISSET(tp->t_state, TS_CARR_ON))) { SET(tp->t_state, TS_WOPEN); error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH, ttopen, 0); + if (!DEVCUA(dev) && sc->sc_cua && error == EINTR) + continue; if (error) { /* XXX should turn off chip if we're the only waiter */ @@ -853,6 +855,8 @@ comopen(dev, flag, mode, p) splx(s); return error; } + if (!DEVCUA(dev) && sc->sc_cua) + continue; } } splx(s); diff --git a/sys/dev/ic/com.c b/sys/dev/ic/com.c index e8622f90c1b..2a41167100f 100644 --- a/sys/dev/ic/com.c +++ b/sys/dev/ic/com.c @@ -1,4 +1,4 @@ -/* $OpenBSD: com.c,v 1.35 1997/07/07 16:37:12 niklas Exp $ */ +/* $OpenBSD: com.c,v 1.36 1997/09/03 20:55:28 deraadt Exp $ */ /* $NetBSD: com.c,v 1.82.4.1 1996/06/02 09:08:00 mrg Exp $ */ /*- @@ -654,12 +654,14 @@ comopen(dev, flag, mode, p) return EBUSY; } } else { - while (!(DEVCUA(dev) && sc->sc_cua) && - !ISSET(tp->t_cflag, CLOCAL) && - !ISSET(tp->t_state, TS_CARR_ON)) { + while (sc->sc_cua || + (!ISSET(tp->t_cflag, CLOCAL) && + !ISSET(tp->t_state, TS_CARR_ON))) { SET(tp->t_state, TS_WOPEN); error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH, ttopen, 0); + if (!DEVCUA(dev) && sc->sc_cua && error == EINTR) + continue; if (error) { /* XXX should turn off chip if we're the only waiter */ @@ -669,6 +671,8 @@ comopen(dev, flag, mode, p) splx(s); return error; } + if (!DEVCUA(dev) && sc->sc_cua) + continue; } } splx(s); |