ref: 99bb321278367a6017f67763c7cabecc75ab4b43
parent: 3bf75c1d9e1923b559d17bf7c3960281435a9cb6
author: cinap_lenrek <cinap_lenrek@localhost>
date: Fri Aug 19 01:18:19 EDT 2011
lib9p: add srvacquire/srvrelease
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -231,6 +231,9 @@
QLock wlock;
char* addr;
+
+ QLock slock;
+ Ref sref;
};
void srv(Srv*);
@@ -274,6 +277,9 @@
int authattach(Req*);
extern void (*_forker)(void (*)(void*), void*, int);
+
+void srvacquire(Srv *);
+void srvrelease(Srv *);
Reqqueue* reqqueuecreate(void);
void reqqueuepush(Reqqueue*, Req*, void (*)(Req *));
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -682,31 +682,19 @@
{}
-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 @@
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;
@@ -739,6 +730,42 @@
if(srv->end)
srv->end(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
--
⑨