]> git.lizzy.rs Git - plan9front.git/blob - sys/src/lib9p/fid.c
pc: replace duplicated and broken mmu flush code in vunmap()
[plan9front.git] / sys / src / lib9p / fid.c
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
9 incfidref(void *v)
10 {
11         Fid *f;
12
13         f = v;
14         if(f)
15                 incref(&f->ref);
16 }
17
18 Fidpool*
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
30 freefidpool(Fidpool *p)
31 {
32         freemap(p->map, (void(*)(void*))p->destroy);
33         free(p);
34 }
35
36 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*
58 lookupfid(Fidpool *pool, ulong fid)
59 {
60         return lookupkey(pool->map, fid);
61 }
62
63 void
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*
79 removefid(Fidpool *pool, ulong fid)
80 {
81         return deletekey(pool->map, fid);
82 }