summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2015-10-12 10:41:40 +0200
committeraiju <aiju@phicode.de>2015-10-12 10:41:40 +0200
commit27d2955ccf58fb1c0631c497c094d793572f980f (patch)
tree5831d775bce9daaaa81e0e6cca3c01df373a7a4d
parent9112daa7641d64bf5b662e9afb391fd267d96ad2 (diff)
lib9p: add reqqueuefree
-rw-r--r--sys/include/9p.h1
-rw-r--r--sys/man/2/9pqueue5
-rw-r--r--sys/src/lib9p/queue.c17
3 files changed, 23 insertions, 0 deletions
diff --git a/sys/include/9p.h b/sys/include/9p.h
index 27bec9b9a..e59962104 100644
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -285,3 +285,4 @@ void srvrelease(Srv *);
Reqqueue* reqqueuecreate(void);
void reqqueuepush(Reqqueue*, Req*, void (*)(Req *));
void reqqueueflush(Reqqueue*, Req*);
+void reqqueuefree(Reqqueue*);
diff --git a/sys/man/2/9pqueue b/sys/man/2/9pqueue
index ff01649e7..54d76a3c0 100644
--- a/sys/man/2/9pqueue
+++ b/sys/man/2/9pqueue
@@ -29,6 +29,7 @@ struct Reqqueue
Reqqueue* reqqueuecreate(void);
void reqqueuepush(Reqqueue *q, Req *r, void (*f)(Req *));
void reqqueueflush(Reqqueue *q, Req *r);
+void reqqueuefree(Reqqueue *q);
.fi
.SH DESCRIPTION
.I Reqqueue
@@ -55,6 +56,10 @@ by
which will remove the request immediately if processing has
not started. If processing has been started, the process
will be interrupted.
+.PP
+.I Reqqueuefree
+frees a queue.
+No new requests should be send to the queue and it will be freed once all requests in it have been processed.
.SH SOURCE
.B /sys/src/lib9p/queue.c
.SH SEE ALSO
diff --git a/sys/src/lib9p/queue.c b/sys/src/lib9p/queue.c
index 971e8a78d..478f40ddd 100644
--- a/sys/src/lib9p/queue.c
+++ b/sys/src/lib9p/queue.c
@@ -35,8 +35,14 @@ _reqqueueproc(void *v)
memset(&r->qu, 0, sizeof(r->qu));
q->cur = r;
qunlock(q);
+ if(f == nil)
+ break;
f(r);
}
+
+ free(r);
+ free(q);
+ threadexits(nil);
}
Reqqueue *
@@ -83,3 +89,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);
+}