lib9p: add srvacquire/srvrelease
This commit is contained in:
parent
80c89cfa32
commit
0c1284f602
2 changed files with 50 additions and 17 deletions
|
@ -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*);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue