Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}