git: 9front

Download patch

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
--