ref: 3504122012e3f7ee778efa048e462510619c13b4
dir: /sys/src/lib9p/fid.c/
#include <u.h> #include <libc.h> #include <fcall.h> #include <thread.h> #include <9p.h> static void incfidref(void *v) { Fid *f; f = v; if(f) incref(&f->ref); } Fidpool* allocfidpool(void (*destroy)(Fid*)) { Fidpool *f; f = emalloc9p(sizeof *f); f->map = allocmap(incfidref); f->destroy = destroy; return f; } void freefidpool(Fidpool *p) { freemap(p->map, (void(*)(void*))p->destroy); free(p); } Fid* allocfid(Fidpool *pool, ulong fid) { Fid *f; f = emalloc9p(sizeof *f); f->fid = fid; f->omode = -1; f->pool = pool; incfidref(f); incfidref(f); if(caninsertkey(pool->map, fid, f) == 0){ closefid(f); closefid(f); return nil; } return f; } Fid* lookupfid(Fidpool *pool, ulong fid) { return lookupkey(pool->map, fid); } void closefid(Fid *f) { if(decref(&f->ref) == 0) { if(f->rdir) closedirfile(f->rdir); if(f->pool->destroy) f->pool->destroy(f); if(f->file) closefile(f->file); free(f->uid); free(f); } } Fid* removefid(Fidpool *pool, ulong fid) { return deletekey(pool->map, fid); }