fid.c (1048B)
1 #include <u.h> 2 #include <libc.h> 3 #include <fcall.h> 4 #include <thread.h> 5 #include "9p.h" 6 7 static void 8 incfidref(void *v) 9 { 10 Fid *f; 11 12 f = v; 13 if(f) 14 incref(&f->ref); 15 } 16 17 Fidpool* 18 allocfidpool(void (*destroy)(Fid*)) 19 { 20 Fidpool *f; 21 22 f = emalloc9p(sizeof *f); 23 f->map = allocmap(incfidref); 24 f->destroy = destroy; 25 return f; 26 } 27 28 void 29 freefidpool(Fidpool *p) 30 { 31 freemap(p->map, (void(*)(void*))p->destroy); 32 free(p); 33 } 34 35 Fid* 36 allocfid(Fidpool *pool, ulong fid) 37 { 38 Fid *f; 39 40 f = emalloc9p(sizeof *f); 41 f->fid = fid; 42 f->omode = -1; 43 f->pool = pool; 44 45 incfidref(f); 46 incfidref(f); 47 if(caninsertkey(pool->map, fid, f) == 0){ 48 closefid(f); 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 }