Blob
1 #include <u.h>2 #include <libc.h>3 #include <auth.h>4 #include <fcall.h>5 #include <thread.h>6 #include "9p.h"8 static void9 incfidref(void *v)10 {11 Fid *f;13 f = v;14 if(f)15 incref(&f->ref);16 }18 Fidpool*19 allocfidpool(void (*destroy)(Fid*))20 {21 Fidpool *f;23 f = emalloc9p(sizeof *f);24 f->map = allocmap(incfidref);25 f->destroy = destroy;26 return f;27 }29 void30 freefidpool(Fidpool *p)31 {32 freemap(p->map, (void(*)(void*))p->destroy);33 free(p);34 }36 Fid*37 allocfid(Fidpool *pool, ulong fid)38 {39 Fid *f;41 f = emalloc9p(sizeof *f);42 f->fid = fid;43 f->omode = -1;44 f->pool = pool;46 incfidref(f);47 incfidref(f);48 if(caninsertkey(pool->map, fid, f) == 0){49 closefid(f);50 closefid(f);51 return nil;52 }54 return f;55 }57 Fid*58 lookupfid(Fidpool *pool, ulong fid)59 {60 return lookupkey(pool->map, fid);61 }63 void64 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 }78 Fid*79 removefid(Fidpool *pool, ulong fid)80 {81 return deletekey(pool->map, fid);82 }