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> 6*9a747e4fSDavid du Colombier #include <9p.h> 77dd7cddfSDavid du Colombier 87dd7cddfSDavid du Colombier static void 97dd7cddfSDavid du Colombier increqref(void *v) 107dd7cddfSDavid du Colombier { 117dd7cddfSDavid du Colombier Req *r; 127dd7cddfSDavid du Colombier 137dd7cddfSDavid du Colombier r = v; 14*9a747e4fSDavid du Colombier if(r){ 15*9a747e4fSDavid du Colombier if(chatty9p > 1) 16*9a747e4fSDavid du Colombier fprint(2, "increfreq %p %ld\n", r, r->ref.ref); 177dd7cddfSDavid du Colombier incref(&r->ref); 187dd7cddfSDavid du Colombier } 19*9a747e4fSDavid du Colombier } 20*9a747e4fSDavid du Colombier 21*9a747e4fSDavid du Colombier Reqpool* 22*9a747e4fSDavid du Colombier allocreqpool(void (*destroy)(Req*)) 23*9a747e4fSDavid du Colombier { 24*9a747e4fSDavid du Colombier Reqpool *f; 25*9a747e4fSDavid du Colombier 26*9a747e4fSDavid du Colombier f = emalloc9p(sizeof *f); 27*9a747e4fSDavid du Colombier f->map = allocmap(increqref); 28*9a747e4fSDavid du Colombier f->destroy = destroy; 29*9a747e4fSDavid du Colombier return f; 30*9a747e4fSDavid du Colombier } 31*9a747e4fSDavid du Colombier 32*9a747e4fSDavid du Colombier void 33*9a747e4fSDavid du Colombier freereqpool(Reqpool *p) 34*9a747e4fSDavid du Colombier { 35*9a747e4fSDavid du Colombier freemap(p->map, (void(*)(void*))p->destroy); 36*9a747e4fSDavid du Colombier free(p); 37*9a747e4fSDavid du Colombier } 387dd7cddfSDavid du Colombier 397dd7cddfSDavid du Colombier Req* 407dd7cddfSDavid du Colombier allocreq(Reqpool *pool, ulong tag) 417dd7cddfSDavid du Colombier { 427dd7cddfSDavid du Colombier Req *r; 437dd7cddfSDavid du Colombier 44*9a747e4fSDavid du Colombier r = emalloc9p(sizeof *r); 457dd7cddfSDavid du Colombier r->tag = tag; 467dd7cddfSDavid du Colombier r->pool = pool; 477dd7cddfSDavid du Colombier 48*9a747e4fSDavid du Colombier increqref(r); 49*9a747e4fSDavid du Colombier increqref(r); 507dd7cddfSDavid du Colombier if(caninsertkey(pool->map, tag, r) == 0){ 517dd7cddfSDavid du Colombier closereq(r); 527dd7cddfSDavid du Colombier return nil; 537dd7cddfSDavid du Colombier } 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier return r; 567dd7cddfSDavid du Colombier } 577dd7cddfSDavid du Colombier 58*9a747e4fSDavid du Colombier Req* 59*9a747e4fSDavid du Colombier lookupreq(Reqpool *pool, ulong tag) 60*9a747e4fSDavid du Colombier { 61*9a747e4fSDavid du Colombier if(chatty9p > 1) 62*9a747e4fSDavid du Colombier fprint(2, "lookupreq %lud\n", tag); 63*9a747e4fSDavid du Colombier return lookupkey(pool->map, tag); 64*9a747e4fSDavid du Colombier } 65*9a747e4fSDavid du Colombier 66*9a747e4fSDavid du Colombier void 677dd7cddfSDavid du Colombier closereq(Req *r) 687dd7cddfSDavid du Colombier { 69*9a747e4fSDavid du Colombier if(r == nil) 70*9a747e4fSDavid du Colombier return; 717dd7cddfSDavid du Colombier 72*9a747e4fSDavid du Colombier if(chatty9p > 1) 73*9a747e4fSDavid du Colombier fprint(2, "closereq %p %ld\n", r, r->ref.ref); 74*9a747e4fSDavid du Colombier 75*9a747e4fSDavid du Colombier if(decref(&r->ref) == 0){ 76*9a747e4fSDavid du Colombier if(r->fid) 77*9a747e4fSDavid du Colombier closefid(r->fid); 78*9a747e4fSDavid du Colombier if(r->newfid) 79*9a747e4fSDavid du Colombier closefid(r->newfid); 80*9a747e4fSDavid du Colombier if(r->oldreq) 81*9a747e4fSDavid du Colombier closereq(r->oldreq); 82*9a747e4fSDavid du Colombier switch(r->ifcall.type){ 83*9a747e4fSDavid du Colombier case Tstat: 84*9a747e4fSDavid du Colombier free(r->ofcall.stat); 85*9a747e4fSDavid du Colombier free(r->d.name); 86*9a747e4fSDavid du Colombier free(r->d.uid); 87*9a747e4fSDavid du Colombier free(r->d.gid); 88*9a747e4fSDavid du Colombier free(r->d.muid); 89*9a747e4fSDavid du Colombier break; 90*9a747e4fSDavid du Colombier } 91*9a747e4fSDavid du Colombier if(r->pool->destroy) 92*9a747e4fSDavid du Colombier r->pool->destroy(r); 937dd7cddfSDavid du Colombier free(r->buf); 9459cc4ca5SDavid du Colombier free(r->rbuf); 957dd7cddfSDavid du Colombier free(r); 967dd7cddfSDavid du Colombier } 977dd7cddfSDavid du Colombier } 987dd7cddfSDavid du Colombier 997dd7cddfSDavid du Colombier Req* 100*9a747e4fSDavid du Colombier removereq(Reqpool *pool, ulong tag) 1017dd7cddfSDavid du Colombier { 102*9a747e4fSDavid du Colombier if(chatty9p > 1) 103*9a747e4fSDavid du Colombier fprint(2, "removereq %lud\n", tag); 104*9a747e4fSDavid du Colombier return deletekey(pool->map, tag); 1057dd7cddfSDavid du Colombier } 106