]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/lib9p/queue.c
acme: fix border size, autoindent undo: imported from plan9port (thanks jxy)
[plan9front.git] / sys / src / lib9p / queue.c
index d77d4552e748a7724dd07c80a9bcd09bfe7edb62..ff846cfd8ab95802c84d8a5ea8c63b67fdfc4a9e 100644 (file)
@@ -4,24 +4,27 @@
 #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);
@@ -32,8 +35,16 @@ _reqqueueproc(void *v)
                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 *
@@ -45,7 +56,7 @@ reqqueuecreate(void)
        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;
 }
 
@@ -67,7 +78,8 @@ reqqueueflush(Reqqueue *q, Req *r)
 {
        qlock(q);
        if(q->cur == r){
-               postnote(PNPROC, q->pid, "flush");
+               threadint(q->pid);
+               q->flush++;
                qunlock(q);
        }else{
                if(r->qu.next != nil){
@@ -79,3 +91,14 @@ reqqueueflush(Reqqueue *q, Req *r)
                respond(r, "interrupted");
        }
 }
+
+void
+reqqueuefree(Reqqueue *q)
+{
+       Req *r;
+
+       if(q == nil)
+               return;
+       r = emalloc9p(sizeof(Req));
+       reqqueuepush(q, r, nil);
+}