diff options
author | iedowse <iedowse@FreeBSD.org> | 2003-06-22 02:54:33 +0000 |
---|---|---|
committer | iedowse <iedowse@FreeBSD.org> | 2003-06-22 02:54:33 +0000 |
commit | 65000a220ab41d3a7e96a605fef81d386eeca712 (patch) | |
tree | 68d45a057c7fb88626bb480c259807ef2a5bf778 /sys/kern/subr_prf.c | |
parent | 17a394677499453b70b54c9df6978b192d58b581 (diff) | |
download | FreeBSD-src-65000a220ab41d3a7e96a605fef81d386eeca712.zip FreeBSD-src-65000a220ab41d3a7e96a605fef81d386eeca712.tar.gz |
Use a new message buffer `consmsgbuf' to forward messages to a
TIOCCONS console (e.g. xconsole) via a timeout routine instead of
calling into the tty code directly from printf(). This fixes a
number of cases where calling printf() at the wrong time (such as
with locks held) would cause a panic if xconsole is running.
The TIOCCONS message buffer is 8k in size by default, but this can
be changed with the kern.consmsgbuf_size sysctl. By default, messages
are checked for 5 times per second. The timer runs and the buffer
memory remains allocated only at times when a TIOCCONS console is
active.
Discussed on: freebsd-arch
Diffstat (limited to 'sys/kern/subr_prf.c')
-rw-r--r-- | sys/kern/subr_prf.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index d564cf6..e802e00 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -89,9 +89,6 @@ struct snprintf_arg { extern int log_open; -struct tty *constty; /* pointer to console "window" tty */ - -static void (*v_putc)(int) = cnputc; /* routine to putc on virtual console */ static void msglogchar(int c, int pri); static void putchar(int ch, void *arg); static char *ksprintn(char *nbuf, uintmax_t num, int base, int *len); @@ -335,21 +332,24 @@ static void putchar(int c, void *arg) { struct putchar_arg *ap = (struct putchar_arg*) arg; - int flags = ap->flags; struct tty *tp = ap->tty; + int consdirect, flags = ap->flags; + + consdirect = ((flags & TOCONS) && constty == NULL); + /* Don't use the tty code after a panic. */ if (panicstr) - constty = NULL; - if ((flags & TOCONS) && tp == NULL && constty) { - tp = constty; - flags |= TOTTY; + consdirect = 1; + if (consdirect) { + if (c != '\0') + cnputc(c); + } else { + if ((flags & TOTTY) && tp != NULL) + tputchar(c, tp); + if ((flags & TOCONS) && constty != NULL) + msgbuf_addchar(&consmsgbuf, c); } - if ((flags & TOTTY) && tp && tputchar(c, tp) < 0 && - (flags & TOCONS) && tp == constty) - constty = NULL; if ((flags & TOLOG)) msglogchar(c, ap->pri); - if ((flags & TOCONS) && constty == NULL && c != '\0') - (*v_putc)(c); } /* |