Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "all.h"
2
 
3
static Xfile *	xflfree;
4
static Xfid *	xfdfree;
5
 
6
#define	FIDMOD	127	/* prime */
7
 
8
static Xfile	*xfiles[FIDMOD];
9
static Lock	xlocks[FIDMOD];
10
 
11
Xfile *
12
xfile(Qid *qid, void *s, int new)
13
{
14
	int k;
15
	Xfile **hp, *f, *pf;
16
 
17
	k = ((ulong)qid->path ^ (((u32int)(uintptr)s)<<24))%FIDMOD;
18
	hp = &xfiles[k];
19
 
20
	lock(&xlocks[k]);
21
	for(f=*hp, pf=0; f; pf=f, f=f->next)
22
		if(f->qid.path == qid->path 
23
		&& (u32int)(uintptr)f->s == (u32int)(uintptr)s)
24
			break;
25
	if(f && pf){
26
		pf->next = f->next;
27
		f->next = *hp;
28
		*hp = f;
29
	}
30
	if(new < 0 && f){
31
		*hp = f->next;
32
		f->next = xflfree;
33
		xflfree = f;
34
		f = 0;
35
	}
36
	if(new > 0 && !f){
37
		if(!(f = xflfree))	/* assign = */
38
			f = listalloc(1024/sizeof(Xfile), sizeof(Xfile));
39
		xflfree = f->next;
40
		memset(f, 0, sizeof(Xfile));
41
		f->next = *hp;
42
		*hp = f;
43
		f->qid = *qid;
44
		f->s = s;
45
	}
46
	unlock(&xlocks[k]);
47
	return f;
48
}
49
 
50
Xfid *
51
xfid(char *uid, Xfile *xp, int new)
52
{
53
	Xfid *f, *pf;
54
 
55
	for(f=xp->users, pf=0; f; pf=f, f=f->next)
56
		if(f->uid[0] == uid[0] && strcmp(f->uid, uid) == 0)
57
			break;
58
	if(f && pf){
59
		pf->next = f->next;
60
		f->next = xp->users;
61
		xp->users = f;
62
	}
63
	if(new < 0 && f){
64
		if(f->urfid)
65
			clunkfid(xp->s, f->urfid);
66
		if(f->opfid)
67
			clunkfid(xp->s, f->opfid);
68
		xp->users = f->next;
69
		f->next = xfdfree;
70
		xfdfree = f;
71
		f = 0;
72
	}
73
	if(new > 0 && !f){
74
		if(!(f = xfdfree))	/* assign = */
75
			f = listalloc(1024/sizeof(Xfid), sizeof(Xfid));
76
		xfdfree = f->next;
77
		memset(f, 0, sizeof(Xfid));
78
		f->next = xp->users;
79
		xp->users = f;
80
		f->xp = xp;
81
		f->uid = strstore(uid);
82
		f->urfid = 0;
83
		f->opfid = 0;
84
	}
85
	return f;
86
}
87
 
88
int
89
xfpurgeuid(Session *s, char *uid)
90
{
91
	Xfile **hp, *f;
92
	Xfid *xf;
93
	int k, count=0;
94
 
95
	for(k=0; k<FIDMOD; k++){
96
		lock(&xlocks[k]);
97
		hp=&xfiles[k];
98
		for(f=*hp; f; f=f->next)
99
			if(f->s == s && (xf = xfid(uid, f, 0))){ /* assign = */
100
				xfclear(xf);
101
				++count;
102
			}
103
		unlock(&xlocks[k]);
104
	}
105
	return count;
106
}