summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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