| #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); |
| } |