Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4 #include <thread.h>
5 #include "9p.h"
7 static void
8 incfidref(void *v)
9 {
10 Fid *f;
12 f = v;
13 if(f)
14 incref(&f->ref);
15 }
17 Fidpool*
18 allocfidpool(void (*destroy)(Fid*))
19 {
20 Fidpool *f;
22 f = emalloc9p(sizeof *f);
23 f->map = allocmap(incfidref);
24 f->destroy = destroy;
25 return f;
26 }
28 void
29 freefidpool(Fidpool *p)
30 {
31 freemap(p->map, (void(*)(void*))p->destroy);
32 free(p);
33 }
35 Fid*
36 allocfid(Fidpool *pool, ulong fid)
37 {
38 Fid *f;
40 f = emalloc9p(sizeof *f);
41 f->fid = fid;
42 f->omode = -1;
43 f->pool = pool;
45 incfidref(f);
46 incfidref(f);
47 if(caninsertkey(pool->map, fid, f) == 0){
48 closefid(f);
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 void
63 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 }