Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_unix/sys/src/lib9p/req.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | 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
increqref(void *v)
10
{
11
	Req *r;
12
 
13
	r = v;
14
	if(r){
15
if(chatty9p > 1)
16
	fprint(2, "increfreq %p %ld\n", r, r->ref.ref);
17
		incref(&r->ref);
18
	}
19
}
20
 
21
Reqpool*
22
allocreqpool(void (*destroy)(Req*))
23
{
24
	Reqpool *f;
25
 
26
	f = emalloc9p(sizeof *f);
27
	f->map = allocmap(increqref);
28
	f->destroy = destroy;
29
	return f;
30
}
31
 
32
void
33
freereqpool(Reqpool *p)
34
{
35
	freemap(p->map, (void(*)(void*))p->destroy);
36
	free(p);
37
}	
38
 
39
Req*
40
allocreq(Reqpool *pool, ulong tag)
41
{
42
	Req *r;
43
 
44
	r = emalloc9p(sizeof *r);
45
	r->tag = tag;
46
	r->pool = pool;
47
 
48
	increqref(r);
49
	increqref(r);
50
	if(caninsertkey(pool->map, tag, r) == 0){
51
		closereq(r);
52
		closereq(r);
53
		return nil;
54
	}
55
 
56
	return r;
57
}
58
 
59
Req*
60
lookupreq(Reqpool *pool, ulong tag)
61
{
62
if(chatty9p > 1)
63
	fprint(2, "lookupreq %lud\n", tag);
64
	return lookupkey(pool->map, tag);
65
}
66
 
67
void
68
closereq(Req *r)
69
{
70
	int i;
71
 
72
	if(r == nil)
73
		return;
74
 
75
if(chatty9p > 1)
76
	fprint(2, "closereq %p %ld\n", r, r->ref.ref);
77
 
78
	if(decref(&r->ref) == 0){
79
		if(r->fid)
80
			closefid(r->fid);
81
		if(r->newfid)
82
			closefid(r->newfid);
83
		if(r->afid)
84
			closefid(r->afid);
85
		if(r->oldreq)
86
			closereq(r->oldreq);
87
		for(i=0; i<r->nflush; i++)
88
			respond(r->flush[i], nil);
89
		free(r->flush);
90
		switch(r->ifcall.type){
91
		case Tstat:
92
			free(r->ofcall.stat);
93
			free(r->d.name);
94
			free(r->d.uid);
95
			free(r->d.gid);
96
			free(r->d.muid);
97
			break;
98
		}
99
		if(r->pool->destroy)
100
			r->pool->destroy(r);
101
		free(r->buf);
102
		free(r->rbuf);
103
		free(r);
104
	}
105
}
106
 
107
Req*
108
removereq(Reqpool *pool, ulong tag)
109
{
110
if(chatty9p > 1)
111
	fprint(2, "removereq %lud\n", tag);
112
	return deletekey(pool->map, tag);
113
}