xref: /plan9/sys/src/lib9p/req.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <auth.h>
47dd7cddfSDavid du Colombier #include <fcall.h>
57dd7cddfSDavid du Colombier #include <thread.h>
6*9a747e4fSDavid du Colombier #include <9p.h>
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier static void
97dd7cddfSDavid du Colombier increqref(void *v)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	Req *r;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	r = v;
14*9a747e4fSDavid du Colombier 	if(r){
15*9a747e4fSDavid du Colombier if(chatty9p > 1)
16*9a747e4fSDavid du Colombier 	fprint(2, "increfreq %p %ld\n", r, r->ref.ref);
177dd7cddfSDavid du Colombier 		incref(&r->ref);
187dd7cddfSDavid du Colombier 	}
19*9a747e4fSDavid du Colombier }
20*9a747e4fSDavid du Colombier 
21*9a747e4fSDavid du Colombier Reqpool*
22*9a747e4fSDavid du Colombier allocreqpool(void (*destroy)(Req*))
23*9a747e4fSDavid du Colombier {
24*9a747e4fSDavid du Colombier 	Reqpool *f;
25*9a747e4fSDavid du Colombier 
26*9a747e4fSDavid du Colombier 	f = emalloc9p(sizeof *f);
27*9a747e4fSDavid du Colombier 	f->map = allocmap(increqref);
28*9a747e4fSDavid du Colombier 	f->destroy = destroy;
29*9a747e4fSDavid du Colombier 	return f;
30*9a747e4fSDavid du Colombier }
31*9a747e4fSDavid du Colombier 
32*9a747e4fSDavid du Colombier void
33*9a747e4fSDavid du Colombier freereqpool(Reqpool *p)
34*9a747e4fSDavid du Colombier {
35*9a747e4fSDavid du Colombier 	freemap(p->map, (void(*)(void*))p->destroy);
36*9a747e4fSDavid du Colombier 	free(p);
37*9a747e4fSDavid du Colombier }
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier Req*
407dd7cddfSDavid du Colombier allocreq(Reqpool *pool, ulong tag)
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier 	Req *r;
437dd7cddfSDavid du Colombier 
44*9a747e4fSDavid du Colombier 	r = emalloc9p(sizeof *r);
457dd7cddfSDavid du Colombier 	r->tag = tag;
467dd7cddfSDavid du Colombier 	r->pool = pool;
477dd7cddfSDavid du Colombier 
48*9a747e4fSDavid du Colombier 	increqref(r);
49*9a747e4fSDavid du Colombier 	increqref(r);
507dd7cddfSDavid du Colombier 	if(caninsertkey(pool->map, tag, r) == 0){
517dd7cddfSDavid du Colombier 		closereq(r);
527dd7cddfSDavid du Colombier 		return nil;
537dd7cddfSDavid du Colombier 	}
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier 	return r;
567dd7cddfSDavid du Colombier }
577dd7cddfSDavid du Colombier 
58*9a747e4fSDavid du Colombier Req*
59*9a747e4fSDavid du Colombier lookupreq(Reqpool *pool, ulong tag)
60*9a747e4fSDavid du Colombier {
61*9a747e4fSDavid du Colombier if(chatty9p > 1)
62*9a747e4fSDavid du Colombier 	fprint(2, "lookupreq %lud\n", tag);
63*9a747e4fSDavid du Colombier 	return lookupkey(pool->map, tag);
64*9a747e4fSDavid du Colombier }
65*9a747e4fSDavid du Colombier 
66*9a747e4fSDavid du Colombier void
677dd7cddfSDavid du Colombier closereq(Req *r)
687dd7cddfSDavid du Colombier {
69*9a747e4fSDavid du Colombier 	if(r == nil)
70*9a747e4fSDavid du Colombier 		return;
717dd7cddfSDavid du Colombier 
72*9a747e4fSDavid du Colombier if(chatty9p > 1)
73*9a747e4fSDavid du Colombier 	fprint(2, "closereq %p %ld\n", r, r->ref.ref);
74*9a747e4fSDavid du Colombier 
75*9a747e4fSDavid du Colombier 	if(decref(&r->ref) == 0){
76*9a747e4fSDavid du Colombier 		if(r->fid)
77*9a747e4fSDavid du Colombier 			closefid(r->fid);
78*9a747e4fSDavid du Colombier 		if(r->newfid)
79*9a747e4fSDavid du Colombier 			closefid(r->newfid);
80*9a747e4fSDavid du Colombier 		if(r->oldreq)
81*9a747e4fSDavid du Colombier 			closereq(r->oldreq);
82*9a747e4fSDavid du Colombier 		switch(r->ifcall.type){
83*9a747e4fSDavid du Colombier 		case Tstat:
84*9a747e4fSDavid du Colombier 			free(r->ofcall.stat);
85*9a747e4fSDavid du Colombier 			free(r->d.name);
86*9a747e4fSDavid du Colombier 			free(r->d.uid);
87*9a747e4fSDavid du Colombier 			free(r->d.gid);
88*9a747e4fSDavid du Colombier 			free(r->d.muid);
89*9a747e4fSDavid du Colombier 			break;
90*9a747e4fSDavid du Colombier 		}
91*9a747e4fSDavid du Colombier 		if(r->pool->destroy)
92*9a747e4fSDavid du Colombier 			r->pool->destroy(r);
937dd7cddfSDavid du Colombier 		free(r->buf);
9459cc4ca5SDavid du Colombier 		free(r->rbuf);
957dd7cddfSDavid du Colombier 		free(r);
967dd7cddfSDavid du Colombier 	}
977dd7cddfSDavid du Colombier }
987dd7cddfSDavid du Colombier 
997dd7cddfSDavid du Colombier Req*
100*9a747e4fSDavid du Colombier removereq(Reqpool *pool, ulong tag)
1017dd7cddfSDavid du Colombier {
102*9a747e4fSDavid du Colombier if(chatty9p > 1)
103*9a747e4fSDavid du Colombier 	fprint(2, "removereq %lud\n", tag);
104*9a747e4fSDavid du Colombier 	return deletekey(pool->map, tag);
1057dd7cddfSDavid du Colombier }
106