projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
set/get timeouts using timevals
[unix-history]
/
usr
/
src
/
sys
/
kern
/
subr_log.c
diff --git
a/usr/src/sys/kern/subr_log.c
b/usr/src/sys/kern/subr_log.c
index
f5126b3
..
813340d
100644
(file)
--- a/
usr/src/sys/kern/subr_log.c
+++ b/
usr/src/sys/kern/subr_log.c
@@
-3,7
+3,7
@@
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
- * @(#)subr_log.c 7.
3
(Berkeley) %G%
+ * @(#)subr_log.c 7.
8
(Berkeley) %G%
*/
/*
*/
/*
@@
-13,6
+13,7
@@
#include "param.h"
#include "user.h"
#include "proc.h"
#include "param.h"
#include "user.h"
#include "proc.h"
+#include "vnode.h"
#include "ioctl.h"
#include "msgbuf.h"
#include "file.h"
#include "ioctl.h"
#include "msgbuf.h"
#include "file.h"
@@
-20,14
+21,13
@@
#define LOG_RDPRI (PZERO + 1)
#define LOG_RDPRI (PZERO + 1)
-#define LOG_NBIO 0x02
#define LOG_ASYNC 0x04
#define LOG_RDWAIT 0x08
struct logsoftc {
int sc_state; /* see above for possibilities */
struct proc *sc_selp; /* process waiting on select call */
#define LOG_ASYNC 0x04
#define LOG_RDWAIT 0x08
struct logsoftc {
int sc_state; /* see above for possibilities */
struct proc *sc_selp; /* process waiting on select call */
-
pid_t sc_pgid; /* process group id
for async I/O */
+
int sc_pgid; /* process/group
for async I/O */
} logsoftc;
int log_open; /* also used in log() */
} logsoftc;
int log_open; /* also used in log() */
@@
-40,8
+40,7
@@
logopen(dev)
if (log_open)
return (EBUSY);
log_open = 1;
if (log_open)
return (EBUSY);
log_open = 1;
- logsoftc.sc_selp = 0;
- logsoftc.sc_pgid = u.u_procp->p_pgrp->pg_id;
+ logsoftc.sc_pgid = u.u_procp->p_pid; /* signal process only */
/*
* Potential race here with putchar() but since putchar should be
* called by autoconf, msg_magic should be initialized by the time
/*
* Potential race here with putchar() but since putchar should be
* called by autoconf, msg_magic should be initialized by the time
@@
-65,13
+64,13
@@
logclose(dev, flag)
log_open = 0;
logsoftc.sc_state = 0;
logsoftc.sc_selp = 0;
log_open = 0;
logsoftc.sc_state = 0;
logsoftc.sc_selp = 0;
- logsoftc.sc_pgid = 0;
}
/*ARGSUSED*/
}
/*ARGSUSED*/
-logread(dev, uio)
+logread(dev, uio
, flag
)
dev_t dev;
struct uio *uio;
dev_t dev;
struct uio *uio;
+ int flag;
{
register long l;
register int s;
{
register long l;
register int s;
@@
-79,12
+78,16
@@
logread(dev, uio)
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
- if (
logsoftc.sc_state & LOG_NBIO
) {
+ if (
flag & IO_NDELAY
) {
splx(s);
return (EWOULDBLOCK);
}
logsoftc.sc_state |= LOG_RDWAIT;
splx(s);
return (EWOULDBLOCK);
}
logsoftc.sc_state |= LOG_RDWAIT;
- sleep((caddr_t)&msgbuf, LOG_RDPRI);
+ if (error = tsleep((caddr_t)&msgbuf, LOG_RDPRI | PCATCH,
+ "klog", 0)) {
+ splx(s);
+ return (error);
+ }
}
splx(s);
logsoftc.sc_state &= ~LOG_RDWAIT;
}
splx(s);
logsoftc.sc_state &= ~LOG_RDWAIT;
@@
-130,6
+133,7
@@
logselect(dev, rw)
logwakeup()
{
logwakeup()
{
+ struct proc *p;
if (!log_open)
return;
if (!log_open)
return;
@@
-137,8
+141,12
@@
logwakeup()
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
- if (logsoftc.sc_state & LOG_ASYNC)
- gsignal(logsoftc.sc_pgid, SIGIO);
+ if (logsoftc.sc_state & LOG_ASYNC) {
+ if (logsoftc.sc_pgid < 0)
+ gsignal(logsoftc.sc_pgid, SIGIO);
+ else if (p = pfind(logsoftc.sc_pgid))
+ psignal(p, SIGIO);
+ }
if (logsoftc.sc_state & LOG_RDWAIT) {
wakeup((caddr_t)&msgbuf);
logsoftc.sc_state &= ~LOG_RDWAIT;
if (logsoftc.sc_state & LOG_RDWAIT) {
wakeup((caddr_t)&msgbuf);
logsoftc.sc_state &= ~LOG_RDWAIT;
@@
-146,7
+154,7
@@
logwakeup()
}
/*ARGSUSED*/
}
/*ARGSUSED*/
-logioctl(com, data, flag)
+logioctl(
dev,
com, data, flag)
caddr_t data;
{
long l;
caddr_t data;
{
long l;
@@
-165,10
+173,6
@@
logioctl(com, data, flag)
break;
case FIONBIO:
break;
case FIONBIO:
- if (*(int *)data)
- logsoftc.sc_state |= LOG_NBIO;
- else
- logsoftc.sc_state &= ~LOG_NBIO;
break;
case FIOASYNC:
break;
case FIOASYNC:
@@
-178,10
+182,9
@@
logioctl(com, data, flag)
logsoftc.sc_state &= ~LOG_ASYNC;
break;
logsoftc.sc_state &= ~LOG_ASYNC;
break;
- case TIOCSPGRP:
{
+ case TIOCSPGRP:
logsoftc.sc_pgid = *(int *)data;
break;
logsoftc.sc_pgid = *(int *)data;
break;
- }
case TIOCGPGRP:
*(int *)data = logsoftc.sc_pgid;
case TIOCGPGRP:
*(int *)data = logsoftc.sc_pgid;