#include <fcall.h>
#include <9p.h>
-static int
-_reqqueuenote(void *, char *note)
-{
- return strcmp(note, "flush") == 0;
-}
-
static void
_reqqueueproc(void *v)
{
Reqqueue *q;
Req *r;
void (*f)(Req *);
-
+ int fd;
+ char *buf;
+
q = v;
rfork(RFNOTEG);
- threadnotify(_reqqueuenote, 1);
+
+ buf = smprint("/proc/%lud/ctl", (ulong)getpid());
+ fd = open(buf, OWRITE|OCEXEC);
+ free(buf);
+
for(;;){
qlock(q);
+ q->flush = 0;
+ if(fd >= 0)
+ write(fd, "nointerrupt", 11);
q->cur = nil;
while(q->next == q)
rsleep(q);
memset(&r->qu, 0, sizeof(r->qu));
q->cur = r;
qunlock(q);
+ if(f == nil)
+ break;
f(r);
}
+
+ if(fd >= 0)
+ close(fd);
+ free(r);
+ free(q);
+ threadexits(nil);
}
Reqqueue *
memset(q, 0, sizeof(*q));
q->l = q;
q->next = q->prev = q;
- q->pid = threadpid(proccreate(_reqqueueproc, q, mainstacksize));
+ q->pid = proccreate(_reqqueueproc, q, mainstacksize);
return q;
}
{
qlock(q);
if(q->cur == r){
- postnote(PNPROC, q->pid, "flush");
+ threadint(q->pid);
+ q->flush++;
qunlock(q);
}else{
if(r->qu.next != nil){
respond(r, "interrupted");
}
}
+
+void
+reqqueuefree(Reqqueue *q)
+{
+ Req *r;
+
+ if(q == nil)
+ return;
+ r = emalloc9p(sizeof(Req));
+ reqqueuepush(q, r, nil);
+}