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 void
9 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 void
30 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 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 }