xref: /plan9/sys/src/lib9p/fid.c (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <fcall.h>
5 #include <thread.h>
6 #include "9p.h"
7 
8 static void
incfidref(void * v)9 incfidref(void *v)
10 {
11 	Fid *f;
12 
13 	f = v;
14 	if(f)
15 		incref(&f->ref);
16 }
17 
18 Fidpool*
allocfidpool(void (* destroy)(Fid *))19 allocfidpool(void (*destroy)(Fid*))
20 {
21 	Fidpool *f;
22 
23 	f = emalloc9p(sizeof *f);
24 	f->map = allocmap(incfidref);
25 	f->destroy = destroy;
26 	return f;
27 }
28 
29 void
freefidpool(Fidpool * p)30 freefidpool(Fidpool *p)
31 {
32 	freemap(p->map, (void(*)(void*))p->destroy);
33 	free(p);
34 }
35 
36 Fid*
allocfid(Fidpool * pool,ulong fid)37 allocfid(Fidpool *pool, ulong fid)
38 {
39 	Fid *f;
40 
41 	f = emalloc9p(sizeof *f);
42 	f->fid = fid;
43 	f->omode = -1;
44 	f->pool = pool;
45 
46 	incfidref(f);
47 	incfidref(f);
48 	if(caninsertkey(pool->map, fid, f) == 0){
49 		closefid(f);
50 		closefid(f);
51 		return nil;
52 	}
53 
54 	return f;
55 }
56 
57 Fid*
lookupfid(Fidpool * pool,ulong fid)58 lookupfid(Fidpool *pool, ulong fid)
59 {
60 	return lookupkey(pool->map, fid);
61 }
62 
63 void
closefid(Fid * f)64 closefid(Fid *f)
65 {
66 	if(decref(&f->ref) == 0) {
67 		if(f->rdir)
68 			closedirfile(f->rdir);
69 		if(f->pool->destroy)
70 			f->pool->destroy(f);
71 		if(f->file)
72 			closefile(f->file);
73 		free(f->uid);
74 		free(f);
75 	}
76 }
77 
78 Fid*
removefid(Fidpool * pool,ulong fid)79 removefid(Fidpool *pool, ulong fid)
80 {
81 	return deletekey(pool->map, fid);
82 }
83