12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #include <u.h>
- #include <libc.h>
- #include <auth.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);
- }
|