diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-08-19 05:18:19 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-08-19 05:18:19 +0200 |
commit | 0c1284f602699f3e2e9d6f6136452cc92fea7e27 (patch) | |
tree | 9b3e7ceb90cd896eda9d5c949edab6b2d17b578b /sys/src/lib9p/srv.c | |
parent | 80c89cfa3221a6d09ffba812c2ba8e9f96bca425 (diff) |
lib9p: add srvacquire/srvrelease
Diffstat (limited to 'sys/src/lib9p/srv.c')
-rw-r--r-- | sys/src/lib9p/srv.c | 61 |
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; |