Blob
1 #include <u.h>2 #include <libc.h>3 #include <fcall.h>4 #include <thread.h>5 #include "9p.h"7 static void8 incfidref(void *v)9 {10 Fid *f;12 f = v;13 if(f)14 incref(&f->ref);15 }17 Fidpool*18 allocfidpool(void (*destroy)(Fid*))19 {20 Fidpool *f;22 f = emalloc9p(sizeof *f);23 f->map = allocmap(incfidref);24 f->destroy = destroy;25 return f;26 }28 void29 freefidpool(Fidpool *p)30 {31 freemap(p->map, (void(*)(void*))p->destroy);32 free(p);33 }35 Fid*36 allocfid(Fidpool *pool, ulong fid)37 {38 Fid *f;40 f = emalloc9p(sizeof *f);41 f->fid = fid;42 f->omode = -1;43 f->pool = pool;45 incfidref(f);46 incfidref(f);47 if(caninsertkey(pool->map, fid, f) == 0){48 closefid(f);49 closefid(f);50 return nil;51 }53 return f;54 }56 Fid*57 lookupfid(Fidpool *pool, ulong fid)58 {59 return lookupkey(pool->map, fid);60 }62 void63 closefid(Fid *f)64 {65 if(decref(&f->ref) == 0) {66 if(f->rdir)67 closedirfile(f->rdir);68 if(f->pool->destroy)69 f->pool->destroy(f);70 if(f->file)71 closefile(f->file);72 free(f->uid);73 free(f);74 }75 }77 Fid*78 removefid(Fidpool *pool, ulong fid)79 {80 return deletekey(pool->map, fid);81 }