tfid.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tfid.c (1048B)
---
1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4 #include <thread.h>
5 #include "9p.h"
6
7 static void
8 incfidref(void *v)
9 {
10 Fid *f;
11
12 f = v;
13 if(f)
14 incref(&f->ref);
15 }
16
17 Fidpool*
18 allocfidpool(void (*destroy)(Fid*))
19 {
20 Fidpool *f;
21
22 f = emalloc9p(sizeof *f);
23 f->map = allocmap(incfidref);
24 f->destroy = destroy;
25 return f;
26 }
27
28 void
29 freefidpool(Fidpool *p)
30 {
31 freemap(p->map, (void(*)(void*))p->destroy);
32 free(p);
33 }
34
35 Fid*
36 allocfid(Fidpool *pool, ulong fid)
37 {
38 Fid *f;
39
40 f = emalloc9p(sizeof *f);
41 f->fid = fid;
42 f->omode = -1;
43 f->pool = pool;
44
45 incfidref(f);
46 incfidref(f);
47 if(caninsertkey(pool->map, fid, f) == 0){
48 closefid(f);
49 closefid(f);
50 return nil;
51 }
52
53 return f;
54 }
55
56 Fid*
57 lookupfid(Fidpool *pool, ulong fid)
58 {
59 return lookupkey(pool->map, fid);
60 }
61
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 }
76
77 Fid*
78 removefid(Fidpool *pool, ulong fid)
79 {
80 return deletekey(pool->map, fid);
81 }