lib9p: add srvacquire/srvrelease

This commit is contained in:
cinap_lenrek 2011-08-19 05:18:19 +02:00
parent 80c89cfa32
commit 0c1284f602
2 changed files with 50 additions and 17 deletions

View file

@ -231,6 +231,9 @@ struct Srv {
QLock wlock; QLock wlock;
char* addr; char* addr;
QLock slock;
Ref sref;
}; };
void srv(Srv*); void srv(Srv*);
@ -275,6 +278,9 @@ int authattach(Req*);
extern void (*_forker)(void (*)(void*), void*, int); extern void (*_forker)(void (*)(void*), void*, int);
void srvacquire(Srv *);
void srvrelease(Srv *);
Reqqueue* reqqueuecreate(void); Reqqueue* reqqueuecreate(void);
void reqqueuepush(Reqqueue*, Req*, void (*)(Req *)); void reqqueuepush(Reqqueue*, Req*, void (*)(Req *));
void reqqueueflush(Reqqueue*, Req*); void reqqueueflush(Reqqueue*, Req*);

View file

@ -682,31 +682,19 @@ rwstat(Req*, char*)
{ {
} }
void static void
srv(Srv *srv) srvwork(void *v)
{ {
Srv *srv = v;
Req *r; Req *r;
fmtinstall('D', dirfmt); incref(&srv->sref);
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;
while(r = getreq(srv)){ while(r = getreq(srv)){
if(r->error){ if(r->error){
respond(r, r->error); respond(r, r->error);
continue; continue;
} }
qlock(&srv->slock);
switch(r->ifcall.type){ switch(r->ifcall.type){
default: default:
respond(r, "unknown message"); respond(r, "unknown message");
@ -725,7 +713,10 @@ srv(Srv *srv)
case Tstat: sstat(srv, r); break; case Tstat: sstat(srv, r); break;
case Twstat: swstat(srv, r); break; case Twstat: swstat(srv, r); break;
} }
qunlock(&srv->slock);
} }
if(decref(&srv->sref))
return;
free(srv->rbuf); free(srv->rbuf);
srv->rbuf = nil; srv->rbuf = nil;
@ -741,6 +732,42 @@ srv(Srv *srv)
srv->end(srv); 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 void
respond(Req *r, char *error) respond(Req *r, char *error)
{ {