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