diff options
Diffstat (limited to 'sys/kern/subr_log.c')
| -rw-r--r-- | sys/kern/subr_log.c | 63 |
1 files changed, 31 insertions, 32 deletions
diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index a6f03d0fd41b..ad65eefd8638 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -50,6 +50,7 @@ #include <sys/kernel.h> #include <sys/poll.h> #include <sys/filedesc.h> +#include <sys/sysctl.h> #define LOG_RDPRI (PZERO + 1) @@ -62,6 +63,8 @@ static d_read_t logread; static d_ioctl_t logioctl; static d_poll_t logpoll; +static void logtimeout(void *arg); + #define CDEV_MAJOR 7 static struct cdevsw log_cdevsw = { /* open */ logopen, @@ -84,32 +87,36 @@ static struct logsoftc { int sc_state; /* see above for possibilities */ struct selinfo sc_selp; /* process waiting on select call */ struct sigio *sc_sigio; /* information for async I/O */ + struct callout sc_callout; /* callout to wakeup syslog */ } logsoftc; int log_open; /* also used in log() */ +/* Times per second to check for a pending syslog wakeup. */ +static int log_wakeups_per_second = 5; +SYSCTL_INT(_kern, OID_AUTO, log_wakeups_per_second, CTLFLAG_RW, + &log_wakeups_per_second, 0, ""); + /*ARGSUSED*/ static int -logopen(dev, flags, mode, p) - dev_t dev; - int flags, mode; - struct proc *p; +logopen(dev_t dev, int flags, int mode, struct proc *p) { if (log_open) return (EBUSY); log_open = 1; + callout_init(&logsoftc.sc_callout); fsetown(p->p_pid, &logsoftc.sc_sigio); /* signal process only */ + callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, + logtimeout, NULL); return (0); } /*ARGSUSED*/ static int -logclose(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; +logclose(dev_t dev, int flag, int mode, struct proc *p) { + callout_stop(&logsoftc.sc_callout); log_open = 0; logsoftc.sc_state = 0; funsetown(logsoftc.sc_sigio); @@ -118,14 +125,11 @@ logclose(dev, flag, mode, p) /*ARGSUSED*/ static int -logread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; +logread(dev_t dev, struct uio *uio, int flag) { - register struct msgbuf *mbp = msgbufp; - register long l; - register int s; + struct msgbuf *mbp = msgbufp; + long l; + int s; int error = 0; s = splhigh(); @@ -164,10 +168,7 @@ logread(dev, uio, flag) /*ARGSUSED*/ static int -logpoll(dev, events, p) - dev_t dev; - int events; - struct proc *p; +logpoll(dev_t dev, int events, struct proc *p) { int s; int revents = 0; @@ -184,9 +185,13 @@ logpoll(dev, events, p) return (revents); } -void -logwakeup() +static void +logtimeout(void *arg) { + + if (msgbuftrigger == 0) + return; + msgbuftrigger = 0; if (!log_open) return; selwakeup(&logsoftc.sc_selp); @@ -196,16 +201,13 @@ logwakeup() wakeup((caddr_t)msgbufp); logsoftc.sc_state &= ~LOG_RDWAIT; } + callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, + logtimeout, NULL); } /*ARGSUSED*/ static int -logioctl(dev, com, data, flag, p) - dev_t dev; - u_long com; - caddr_t data; - int flag; - struct proc *p; +logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct proc *p) { long l; int s; @@ -254,13 +256,10 @@ logioctl(dev, com, data, flag, p) return (0); } - -static void log_drvinit __P((void *unused)); - static void -log_drvinit(unused) - void *unused; +log_drvinit(void *unused) { + make_dev(&log_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); } |
