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 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 }