summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-15 13:21:30 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-15 13:21:30 +0200
commita034e629f7611166cae617b08b19667925fc4305 (patch)
tree18e17fddcecf6a3944ee6b2d7741009edf0da062
parent9112daa7641d64bf5b662e9afb391fd267d96ad2 (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.
-rw-r--r--sys/include/9p.h6
-rw-r--r--sys/src/lib9p/listen.c6
-rw-r--r--sys/src/lib9p/srv.c25
3 files changed, 22 insertions, 15 deletions
diff --git a/sys/include/9p.h b/sys/include/9p.h
index 27bec9b9a..d6a830a15 100644
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -233,8 +233,10 @@ struct Srv {
char* addr;
QLock slock;
- Ref sref;
- Ref rref;
+ Ref sref; /* srvwork procs */
+ Ref rref; /* requests in flight */
+
+ void (*free)(Srv*);
};
void srv(Srv*);
diff --git a/sys/src/lib9p/listen.c b/sys/src/lib9p/listen.c
index 8ba7ecb99..afce4954a 100644
--- a/sys/src/lib9p/listen.c
+++ b/sys/src/lib9p/listen.c
@@ -7,7 +7,7 @@
static void listenproc(void*);
static void srvproc(void*);
-static void srvend(Srv *);
+static void srvfree(Srv *);
static char *getremotesys(char*);
void
@@ -58,7 +58,7 @@ listenproc(void *v)
s->rpool = nil;
s->rbuf = nil;
s->wbuf = nil;
- s->end = srvend;
+ s->free = srvfree;
_forker(srvproc, s, 0);
}
free(os->addr);
@@ -72,7 +72,7 @@ srvproc(void *v)
}
static void
-srvend(Srv *s)
+srvfree(Srv *s)
{
close(s->infd);
free(s->addr);
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