17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <auth.h>
47dd7cddfSDavid du Colombier #include <fcall.h>
57dd7cddfSDavid du Colombier #include <thread.h>
69a747e4fSDavid du Colombier #include <9p.h>
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier static void
increqref(void * v)97dd7cddfSDavid du Colombier increqref(void *v)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier Req *r;
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier r = v;
149a747e4fSDavid du Colombier if(r){
159a747e4fSDavid du Colombier if(chatty9p > 1)
169a747e4fSDavid du Colombier fprint(2, "increfreq %p %ld\n", r, r->ref.ref);
177dd7cddfSDavid du Colombier incref(&r->ref);
187dd7cddfSDavid du Colombier }
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier Reqpool*
allocreqpool(void (* destroy)(Req *))229a747e4fSDavid du Colombier allocreqpool(void (*destroy)(Req*))
239a747e4fSDavid du Colombier {
249a747e4fSDavid du Colombier Reqpool *f;
259a747e4fSDavid du Colombier
269a747e4fSDavid du Colombier f = emalloc9p(sizeof *f);
279a747e4fSDavid du Colombier f->map = allocmap(increqref);
289a747e4fSDavid du Colombier f->destroy = destroy;
299a747e4fSDavid du Colombier return f;
309a747e4fSDavid du Colombier }
319a747e4fSDavid du Colombier
329a747e4fSDavid du Colombier void
freereqpool(Reqpool * p)339a747e4fSDavid du Colombier freereqpool(Reqpool *p)
349a747e4fSDavid du Colombier {
359a747e4fSDavid du Colombier freemap(p->map, (void(*)(void*))p->destroy);
369a747e4fSDavid du Colombier free(p);
379a747e4fSDavid du Colombier }
387dd7cddfSDavid du Colombier
397dd7cddfSDavid du Colombier Req*
allocreq(Reqpool * pool,ulong tag)407dd7cddfSDavid du Colombier allocreq(Reqpool *pool, ulong tag)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier Req *r;
437dd7cddfSDavid du Colombier
449a747e4fSDavid du Colombier r = emalloc9p(sizeof *r);
457dd7cddfSDavid du Colombier r->tag = tag;
467dd7cddfSDavid du Colombier r->pool = pool;
477dd7cddfSDavid du Colombier
489a747e4fSDavid du Colombier increqref(r);
499a747e4fSDavid du Colombier increqref(r);
507dd7cddfSDavid du Colombier if(caninsertkey(pool->map, tag, r) == 0){
517dd7cddfSDavid du Colombier closereq(r);
52*375daca8SDavid du Colombier closereq(r);
537dd7cddfSDavid du Colombier return nil;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier return r;
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier
599a747e4fSDavid du Colombier Req*
lookupreq(Reqpool * pool,ulong tag)609a747e4fSDavid du Colombier lookupreq(Reqpool *pool, ulong tag)
619a747e4fSDavid du Colombier {
629a747e4fSDavid du Colombier if(chatty9p > 1)
639a747e4fSDavid du Colombier fprint(2, "lookupreq %lud\n", tag);
649a747e4fSDavid du Colombier return lookupkey(pool->map, tag);
659a747e4fSDavid du Colombier }
669a747e4fSDavid du Colombier
679a747e4fSDavid du Colombier void
closereq(Req * r)687dd7cddfSDavid du Colombier closereq(Req *r)
697dd7cddfSDavid du Colombier {
7067031067SDavid du Colombier int i;
7167031067SDavid du Colombier
729a747e4fSDavid du Colombier if(r == nil)
739a747e4fSDavid du Colombier return;
747dd7cddfSDavid du Colombier
759a747e4fSDavid du Colombier if(chatty9p > 1)
769a747e4fSDavid du Colombier fprint(2, "closereq %p %ld\n", r, r->ref.ref);
779a747e4fSDavid du Colombier
789a747e4fSDavid du Colombier if(decref(&r->ref) == 0){
799a747e4fSDavid du Colombier if(r->fid)
809a747e4fSDavid du Colombier closefid(r->fid);
819a747e4fSDavid du Colombier if(r->newfid)
829a747e4fSDavid du Colombier closefid(r->newfid);
837fd46167SDavid du Colombier if(r->afid)
847fd46167SDavid du Colombier closefid(r->afid);
859a747e4fSDavid du Colombier if(r->oldreq)
869a747e4fSDavid du Colombier closereq(r->oldreq);
8767031067SDavid du Colombier for(i=0; i<r->nflush; i++)
8867031067SDavid du Colombier respond(r->flush[i], nil);
8967031067SDavid du Colombier free(r->flush);
909a747e4fSDavid du Colombier switch(r->ifcall.type){
919a747e4fSDavid du Colombier case Tstat:
929a747e4fSDavid du Colombier free(r->ofcall.stat);
939a747e4fSDavid du Colombier free(r->d.name);
949a747e4fSDavid du Colombier free(r->d.uid);
959a747e4fSDavid du Colombier free(r->d.gid);
969a747e4fSDavid du Colombier free(r->d.muid);
979a747e4fSDavid du Colombier break;
989a747e4fSDavid du Colombier }
999a747e4fSDavid du Colombier if(r->pool->destroy)
1009a747e4fSDavid du Colombier r->pool->destroy(r);
1017dd7cddfSDavid du Colombier free(r->buf);
10259cc4ca5SDavid du Colombier free(r->rbuf);
1037dd7cddfSDavid du Colombier free(r);
1047dd7cddfSDavid du Colombier }
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier
1077dd7cddfSDavid du Colombier Req*
removereq(Reqpool * pool,ulong tag)1089a747e4fSDavid du Colombier removereq(Reqpool *pool, ulong tag)
1097dd7cddfSDavid du Colombier {
1109a747e4fSDavid du Colombier if(chatty9p > 1)
1119a747e4fSDavid du Colombier fprint(2, "removereq %lud\n", tag);
1129a747e4fSDavid du Colombier return deletekey(pool->map, tag);
1137dd7cddfSDavid du Colombier }
114