mirror of
https://github.com/openbsd/src.git
synced 2026-04-24 22:26:03 +00:00
Replace ttkqflush() with klist_invalidate() to handle knote list
invalidation in one place. Store struct tty pointer in kn_hook directly to simplify the code. OK mpi@
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: tty.c,v 1.151 2020/01/09 14:35:20 mpi Exp $ */
|
||||
/* $OpenBSD: tty.c,v 1.152 2020/02/08 14:52:07 visa Exp $ */
|
||||
/* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */
|
||||
|
||||
/*-
|
||||
@@ -75,7 +75,6 @@ static void ttyblock(struct tty *);
|
||||
void ttyunblock(struct tty *);
|
||||
static void ttyecho(int, struct tty *);
|
||||
static void ttyrubo(struct tty *, int);
|
||||
void ttkqflush(struct klist *klist);
|
||||
int filt_ttyread(struct knote *kn, long hint);
|
||||
void filt_ttyrdetach(struct knote *kn);
|
||||
int filt_ttywrite(struct knote *kn, long hint);
|
||||
@@ -1124,7 +1123,7 @@ ttkqfilter(dev_t dev, struct knote *kn)
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
kn->kn_hook = (caddr_t)((u_long)dev);
|
||||
kn->kn_hook = tp;
|
||||
|
||||
s = spltty();
|
||||
SLIST_INSERT_HEAD(klist, kn, kn_selnext);
|
||||
@@ -1133,30 +1132,12 @@ ttkqfilter(dev_t dev, struct knote *kn)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
ttkqflush(struct klist *klist)
|
||||
{
|
||||
struct knote *kn, *kn1;
|
||||
|
||||
SLIST_FOREACH_SAFE(kn, klist, kn_selnext, kn1) {
|
||||
SLIST_REMOVE(klist, kn, knote, kn_selnext);
|
||||
kn->kn_hook = (caddr_t)((u_long)NODEV);
|
||||
kn->kn_flags |= EV_EOF;
|
||||
knote_activate(kn);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
filt_ttyrdetach(struct knote *kn)
|
||||
{
|
||||
dev_t dev = (dev_t)((u_long)kn->kn_hook);
|
||||
struct tty *tp;
|
||||
struct tty *tp = kn->kn_hook;
|
||||
int s;
|
||||
|
||||
if (dev == NODEV)
|
||||
return;
|
||||
tp = (*cdevsw[major(dev)].d_tty)(dev);
|
||||
|
||||
s = spltty();
|
||||
SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext);
|
||||
splx(s);
|
||||
@@ -1165,16 +1146,9 @@ filt_ttyrdetach(struct knote *kn)
|
||||
int
|
||||
filt_ttyread(struct knote *kn, long hint)
|
||||
{
|
||||
dev_t dev = (dev_t)((u_long)kn->kn_hook);
|
||||
struct tty *tp;
|
||||
struct tty *tp = kn->kn_hook;
|
||||
int s;
|
||||
|
||||
if (dev == NODEV) {
|
||||
kn->kn_flags |= EV_EOF;
|
||||
return (1);
|
||||
}
|
||||
tp = (*cdevsw[major(dev)].d_tty)(dev);
|
||||
|
||||
s = spltty();
|
||||
kn->kn_data = ttnread(tp);
|
||||
splx(s);
|
||||
@@ -1188,14 +1162,9 @@ filt_ttyread(struct knote *kn, long hint)
|
||||
void
|
||||
filt_ttywdetach(struct knote *kn)
|
||||
{
|
||||
dev_t dev = (dev_t)((u_long)kn->kn_hook);
|
||||
struct tty *tp;
|
||||
struct tty *tp = kn->kn_hook;
|
||||
int s;
|
||||
|
||||
if (dev == NODEV)
|
||||
return;
|
||||
tp = (*cdevsw[major(dev)].d_tty)(dev);
|
||||
|
||||
s = spltty();
|
||||
SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext);
|
||||
splx(s);
|
||||
@@ -1204,16 +1173,9 @@ filt_ttywdetach(struct knote *kn)
|
||||
int
|
||||
filt_ttywrite(struct knote *kn, long hint)
|
||||
{
|
||||
dev_t dev = (dev_t)((u_long)kn->kn_hook);
|
||||
struct tty *tp;
|
||||
struct tty *tp = kn->kn_hook;
|
||||
int canwrite, s;
|
||||
|
||||
if (dev == NODEV) {
|
||||
kn->kn_flags |= EV_EOF;
|
||||
return (1);
|
||||
}
|
||||
tp = (*cdevsw[major(dev)].d_tty)(dev);
|
||||
|
||||
s = spltty();
|
||||
kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc;
|
||||
canwrite = (tp->t_outq.c_cc <= tp->t_lowat);
|
||||
@@ -2378,6 +2340,7 @@ ttymalloc(int baud)
|
||||
void
|
||||
ttyfree(struct tty *tp)
|
||||
{
|
||||
int s;
|
||||
|
||||
--tty_count;
|
||||
#ifdef DIAGNOSTIC
|
||||
@@ -2386,8 +2349,10 @@ ttyfree(struct tty *tp)
|
||||
#endif
|
||||
TAILQ_REMOVE(&ttylist, tp, tty_link);
|
||||
|
||||
ttkqflush(&tp->t_rsel.si_note);
|
||||
ttkqflush(&tp->t_wsel.si_note);
|
||||
s = spltty();
|
||||
klist_invalidate(&tp->t_rsel.si_note);
|
||||
klist_invalidate(&tp->t_wsel.si_note);
|
||||
splx(s);
|
||||
|
||||
clfree(&tp->t_rawq);
|
||||
clfree(&tp->t_canq);
|
||||
|
||||
Reference in New Issue
Block a user