summaryrefslogtreecommitdiff
path: root/sys/kern/subr_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_log.c')
-rw-r--r--sys/kern/subr_log.c63
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");
}