ref: 5a5345100bae3d0af7c7cd4ce685cb85a04584bf
parent: 88a50d9fa62013b67948f17456f030e113652262
author: aiju <aiju@phicode.de>
date: Sat Aug 20 08:30:06 EDT 2011
added interrupt proc ctl message
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -44,7 +44,7 @@
QLock;
Rendez;
Queueelem;
- int pid;
+ int pid, flush;
Req *cur;
};
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -53,6 +53,8 @@
CMwaitstop,
CMwired,
CMtrace,
+ CMinterrupt,
+ CMnointerrupt,
/* real time */
CMperiod,
CMdeadline,
@@ -118,6 +120,8 @@
CMwaitstop, "waitstop", 1,
CMwired, "wired", 2,
CMtrace, "trace", 0,
+ CMinterrupt, "interrupt", 1,
+ CMnointerrupt, "nointerrupt", 1,
CMperiod, "period", 2,
CMdeadline, "deadline", 2,
CMcost, "cost", 2,
@@ -1413,6 +1417,15 @@
default:
error("args");}
+ break;
+ case CMinterrupt:
+ postnote(p, 0, nil, NUser);
+ break;
+ case CMnointerrupt:
+ if(p->nnote == 0)
+ p->notepending = 0;
+ else
+ error("notes pending");break;
/* real time */
case CMperiod:
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -904,11 +904,11 @@
if(dolock)
qlock(&p->debug);
- if(flag != NUser && (p->notify == 0 || p->notified))
+ if(n != nil && flag != NUser && (p->notify == 0 || p->notified))
p->nnote = 0;
ret = 0;
- if(p->nnote < NNOTE) {+ if(p->nnote < NNOTE && n != nil) {strcpy(p->note[p->nnote].msg, n);
p->note[p->nnote++].flag = flag;
ret = 1;
--- a/sys/src/lib9p/queue.c
+++ b/sys/src/lib9p/queue.c
@@ -4,12 +4,6 @@
#include <fcall.h>
#include <9p.h>
-static int
-_reqqueuenote(void *, char *note)
-{- return strcmp(note, "flush") == 0;
-}
-
static void
_reqqueueproc(void *v)
{@@ -16,12 +10,21 @@
Reqqueue *q;
Req *r;
void (*f)(Req *);
+ int fd;
+ char *buf;
q = v;
rfork(RFNOTEG);
- threadnotify(_reqqueuenote, 1);
+
+ buf = smprint("/proc/%d/ctl", getpid());+ fd = open(buf, OWRITE);
+ free(buf);
+
for(;;){qlock(q);
+ q->flush = 0;
+ if(fd >= 0)
+ write(fd, "nointerrupt", 11);
q->cur = nil;
while(q->next == q)
rsleep(q);
@@ -65,9 +68,18 @@
void
reqqueueflush(Reqqueue *q, Req *r)
{+ char buf[128];
+ int fd;
+
qlock(q);
if(q->cur == r){- postnote(PNPROC, q->pid, "flush");
+ sprint(buf, "/proc/%d/ctl", q->pid);
+ fd = open(buf, OWRITE);
+ if(fd >= 0){+ write(fd, "interrupt", 9);
+ close(fd);
+ }
+ q->flush++;
qunlock(q);
}else{ if(r->qu.next != nil){--
⑨