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 return nil; 51 } 52 53 return f; 54 } 55 56 Fid* 57 lookupfid(Fidpool *pool, ulong fid) 58 { 59 return lookupkey(pool->map, fid); 60 } 61 62 void 63 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 } 76 77 Fid* 78 removefid(Fidpool *pool, ulong fid) 79 { 80 return deletekey(pool->map, fid); 81 } 82