summaryrefslogtreecommitdiff
path: root/sys/src/lib9p
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-08-19 05:18:19 +0200
committercinap_lenrek <cinap_lenrek@localhost>2011-08-19 05:18:19 +0200
commit0c1284f602699f3e2e9d6f6136452cc92fea7e27 (patch)
tree9b3e7ceb90cd896eda9d5c949edab6b2d17b578b /sys/src/lib9p
parent80c89cfa3221a6d09ffba812c2ba8e9f96bca425 (diff)
lib9p: add srvacquire/srvrelease
Diffstat (limited to 'sys/src/lib9p')
-rw-r--r--sys/src/lib9p/srv.c61
1 files changed, 44 insertions, 17 deletions
diff --git a/sys/src/lib9p/srv.c b/sys/src/lib9p/srv.c
index 5d2fc6c57..8c4b95389 100644
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -682,31 +682,19 @@ rwstat(Req*, char*)
{
}
-void
-srv(Srv *srv)
+static void
+srvwork(void *v)
{
+ Srv *srv = v;
Req *r;
- fmtinstall('D', dirfmt);
- fmtinstall('F', fcallfmt);
-
- if(srv->fpool == nil)
- srv->fpool = allocfidpool(srv->destroyfid);
- if(srv->rpool == nil)
- srv->rpool = allocreqpool(srv->destroyreq);
- if(srv->msize == 0)
- srv->msize = 8192+IOHDRSZ;
-
- changemsize(srv, srv->msize);
-
- srv->fpool->srv = srv;
- srv->rpool->srv = srv;
-
+ incref(&srv->sref);
while(r = getreq(srv)){
if(r->error){
respond(r, r->error);
continue;
}
+ qlock(&srv->slock);
switch(r->ifcall.type){
default:
respond(r, "unknown message");
@@ -725,7 +713,10 @@ srv(Srv *srv)
case Tstat: sstat(srv, r); break;
case Twstat: swstat(srv, r); break;
}
+ qunlock(&srv->slock);
}
+ if(decref(&srv->sref))
+ return;
free(srv->rbuf);
srv->rbuf = nil;
@@ -742,6 +733,42 @@ srv(Srv *srv)
}
void
+srvacquire(Srv *srv)
+{
+ incref(&srv->sref);
+ qlock(&srv->slock);
+}
+
+void
+srvrelease(Srv *srv)
+{
+ if(decref(&srv->sref) == 0)
+ _forker(srvwork, srv, 0);
+ qunlock(&srv->slock);
+}
+
+void
+srv(Srv *srv)
+{
+ fmtinstall('D', dirfmt);
+ fmtinstall('F', fcallfmt);
+
+ if(srv->fpool == nil)
+ srv->fpool = allocfidpool(srv->destroyfid);
+ if(srv->rpool == nil)
+ srv->rpool = allocreqpool(srv->destroyreq);
+ if(srv->msize == 0)
+ srv->msize = 8192+IOHDRSZ;
+
+ changemsize(srv, srv->msize);
+
+ srv->fpool->srv = srv;
+ srv->rpool->srv = srv;
+
+ srvwork(srv);
+}
+
+void
respond(Req *r, char *error)
{
int i, m, n;