]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/lib9p/queue.c
pc: replace duplicated and broken mmu flush code in vunmap()
[plan9front.git] / sys / src / lib9p / queue.c
index 4b4bde15fc6fa343fef3e3fd774d7cd1a66fd300..478f40dddd13d07c1ee3e8929261027ce7c0c34f 100644 (file)
@@ -4,25 +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;
-       *threaddata() = q;
        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);
@@ -30,13 +32,17 @@ _reqqueueproc(void *v)
                r->qu.next->prev = r->qu.prev;
                r->qu.prev->next = r->qu.next;
                f = r->qu.f;
-               qlock(&r->lk);
                memset(&r->qu, 0, sizeof(r->qu));
-               qunlock(&r->lk);
                q->cur = r;
                qunlock(q);
+               if(f == nil)
+                       break;
                f(r);
        }
+
+       free(r);
+       free(q);
+       threadexits(nil);
 }
 
 Reqqueue *
@@ -48,8 +54,7 @@ reqqueuecreate(void)
        memset(q, 0, sizeof(*q));
        q->l = q;
        q->next = q->prev = q;
-       q->pid = threadpid(proccreate(_reqqueueproc, q, mainstacksize));
-       print("%d\n", q->pid);
+       q->pid = proccreate(_reqqueueproc, q, mainstacksize);
        return q;
 }
 
@@ -62,7 +67,7 @@ reqqueuepush(Reqqueue *q, Req *r, void (*f)(Req *))
        r->qu.prev = q->prev;
        q->prev->next = &r->qu;
        q->prev = &r->qu;
-       rwakeupall(q);
+       rwakeup(q);
        qunlock(q);
 }
 
@@ -71,17 +76,27 @@ 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){
                        r->qu.next->prev = r->qu.prev;
                        r->qu.prev->next = r->qu.next;
                }
-               qlock(&r->lk);
                memset(&r->qu, 0, sizeof(r->qu));
-               qunlock(&r->lk);
                qunlock(q);
                respond(r, "interrupted");
        }
 }
+
+void
+reqqueuefree(Reqqueue *q)
+{
+       Req *r;
+
+       if(q == nil)
+               return;
+       r = emalloc9p(sizeof(Req));
+       reqqueuepush(q, r, nil);
+}