diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-10-15 13:21:30 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-10-15 13:21:30 +0200 |
commit | a034e629f7611166cae617b08b19667925fc4305 (patch) | |
tree | 18e17fddcecf6a3944ee6b2d7741009edf0da062 /sys/src/lib9p/srv.c | |
parent | 9112daa7641d64bf5b662e9afb391fd267d96ad2 (diff) |
lib9p: do not override Srv.end in listensrv(), simplify srvclose() and recounting
listensrv() used to override Srv.end() with its own handler
to free the malloc'd Srv structure and close the fd. this
makes it impossible to register your own cleanup handler.
instead, we introduce the private Srv.free() handler that
is used by listensrv to register its cleanup code. Srv.free()
is called once all the srv procs have been exited and all
requests on that srv have been responded to while Srv.end()
is called once all the procs exited the srv loop regardless
of the requests still being in flight.
Diffstat (limited to 'sys/src/lib9p/srv.c')
-rw-r--r-- | sys/src/lib9p/srv.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/sys/src/lib9p/srv.c b/sys/src/lib9p/srv.c index f2f3ee2af..ddecfa6e2 100644 --- a/sys/src/lib9p/srv.c +++ b/sys/src/lib9p/srv.c @@ -167,7 +167,7 @@ walkandclone(Req *r, char *(*walk1)(Fid*, char*, void*), char *(*clone)(Fid*, Fi static void sversion(Srv *srv, Req *r) { - if(srv->rref.ref != 2){ + if(srv->rref.ref != 1){ respond(r, Ebotch); return; } @@ -724,8 +724,6 @@ srvwork(void *v) Srv *srv = v; Req *r; - incref(&srv->rref); - incref(&srv->sref); while(r = getreq(srv)){ incref(&srv->rref); if(r->error){ @@ -753,14 +751,17 @@ srvwork(void *v) } qunlock(&srv->slock); } - decref(&srv->sref); - srvclose(srv); + + if(srv->end && srv->sref.ref == 1) + srv->end(srv); + if(decref(&srv->sref) == 0) + srvclose(srv); } static void srvclose(Srv *srv) { - if(decref(&srv->rref)) + if(srv->rref.ref || srv->sref.ref) return; if(chatty9p) @@ -776,8 +777,8 @@ srvclose(Srv *srv) freereqpool(srv->rpool); srv->rpool = nil; - if(srv->end) - srv->end(srv); + if(srv->free) + srv->free(srv); } void @@ -790,8 +791,10 @@ srvacquire(Srv *srv) void srvrelease(Srv *srv) { - if(decref(&srv->sref) == 0) + if(decref(&srv->sref) == 0){ + incref(&srv->sref); _forker(srvwork, srv, 0); + } qunlock(&srv->slock); } @@ -819,6 +822,7 @@ srv(Srv *srv) if(srv->start) srv->start(srv); + incref(&srv->sref); srvwork(srv); } @@ -896,7 +900,8 @@ if(chatty9p) else free(r); - srvclose(srv); + if(decref(&srv->rref) == 0) + srvclose(srv); } void |