Blob
1 #include <u.h>2 #include <libc.h>3 #include <fcall.h>4 #include <thread.h>5 #include <9p.h>7 static void8 increqref(void *v)9 {10 Req *r;12 r = v;13 if(r){14 if(chatty9p > 1)15 fprint(2, "increfreq %p %ld\n", r, r->ref.ref);16 incref(&r->ref);17 }18 }20 Reqpool*21 allocreqpool(void (*destroy)(Req*))22 {23 Reqpool *f;25 f = emalloc9p(sizeof *f);26 f->map = allocmap(increqref);27 f->destroy = destroy;28 return f;29 }31 void32 freereqpool(Reqpool *p)33 {34 freemap(p->map, (void(*)(void*))p->destroy);35 free(p);36 }38 Req*39 allocreq(Reqpool *pool, ulong tag)40 {41 Req *r;43 r = emalloc9p(sizeof *r);44 r->tag = tag;45 r->pool = pool;47 increqref(r);48 increqref(r);49 if(caninsertkey(pool->map, tag, r) == 0){50 closereq(r);51 closereq(r);52 return nil;53 }55 return r;56 }58 Req*59 lookupreq(Reqpool *pool, ulong tag)60 {61 if(chatty9p > 1)62 fprint(2, "lookupreq %lud\n", tag);63 return lookupkey(pool->map, tag);64 }66 void67 closereq(Req *r)68 {69 if(r == nil)70 return;72 if(chatty9p > 1)73 fprint(2, "closereq %p %ld\n", r, r->ref.ref);75 if(decref(&r->ref) == 0){76 if(r->fid)77 closefid(r->fid);78 if(r->newfid)79 closefid(r->newfid);80 if(r->afid)81 closefid(r->afid);82 if(r->oldreq)83 closereq(r->oldreq);84 if(r->nflush)85 fprint(2, "closereq: flushes remaining\n");86 free(r->flush);87 switch(r->ifcall.type){88 case Tstat:89 free(r->ofcall.stat);90 free(r->d.name);91 free(r->d.uid);92 free(r->d.gid);93 free(r->d.muid);94 break;95 }96 if(r->pool->destroy)97 r->pool->destroy(r);98 free(r->buf);99 free(r->rbuf);100 free(r);101 }102 }104 Req*105 removereq(Reqpool *pool, ulong tag)106 {107 if(chatty9p > 1)108 fprint(2, "removereq %lud\n", tag);109 return deletekey(pool->map, tag);110 }