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 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* 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 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* 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); 527dd7cddfSDavid du Colombier return nil; 537dd7cddfSDavid du Colombier } 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier return r; 567dd7cddfSDavid du Colombier } 577dd7cddfSDavid du Colombier 589a747e4fSDavid du Colombier Req* 599a747e4fSDavid du Colombier lookupreq(Reqpool *pool, ulong tag) 609a747e4fSDavid du Colombier { 619a747e4fSDavid du Colombier if(chatty9p > 1) 629a747e4fSDavid du Colombier fprint(2, "lookupreq %lud\n", tag); 639a747e4fSDavid du Colombier return lookupkey(pool->map, tag); 649a747e4fSDavid du Colombier } 659a747e4fSDavid du Colombier 669a747e4fSDavid du Colombier void 677dd7cddfSDavid du Colombier closereq(Req *r) 687dd7cddfSDavid du Colombier { 699a747e4fSDavid du Colombier if(r == nil) 709a747e4fSDavid du Colombier return; 717dd7cddfSDavid du Colombier 729a747e4fSDavid du Colombier if(chatty9p > 1) 739a747e4fSDavid du Colombier fprint(2, "closereq %p %ld\n", r, r->ref.ref); 749a747e4fSDavid du Colombier 759a747e4fSDavid du Colombier if(decref(&r->ref) == 0){ 769a747e4fSDavid du Colombier if(r->fid) 779a747e4fSDavid du Colombier closefid(r->fid); 789a747e4fSDavid du Colombier if(r->newfid) 799a747e4fSDavid du Colombier closefid(r->newfid); 80*7fd46167SDavid du Colombier if(r->afid) 81*7fd46167SDavid du Colombier closefid(r->afid); 829a747e4fSDavid du Colombier if(r->oldreq) 839a747e4fSDavid du Colombier closereq(r->oldreq); 849a747e4fSDavid du Colombier switch(r->ifcall.type){ 859a747e4fSDavid du Colombier case Tstat: 869a747e4fSDavid du Colombier free(r->ofcall.stat); 879a747e4fSDavid du Colombier free(r->d.name); 889a747e4fSDavid du Colombier free(r->d.uid); 899a747e4fSDavid du Colombier free(r->d.gid); 909a747e4fSDavid du Colombier free(r->d.muid); 919a747e4fSDavid du Colombier break; 929a747e4fSDavid du Colombier } 939a747e4fSDavid du Colombier if(r->pool->destroy) 949a747e4fSDavid du Colombier r->pool->destroy(r); 957dd7cddfSDavid du Colombier free(r->buf); 9659cc4ca5SDavid du Colombier free(r->rbuf); 977dd7cddfSDavid du Colombier free(r); 987dd7cddfSDavid du Colombier } 997dd7cddfSDavid du Colombier } 1007dd7cddfSDavid du Colombier 1017dd7cddfSDavid du Colombier Req* 1029a747e4fSDavid du Colombier removereq(Reqpool *pool, ulong tag) 1037dd7cddfSDavid du Colombier { 1049a747e4fSDavid du Colombier if(chatty9p > 1) 1059a747e4fSDavid du Colombier fprint(2, "removereq %lud\n", tag); 1069a747e4fSDavid du Colombier return deletekey(pool->map, tag); 1077dd7cddfSDavid du Colombier } 108