xref: /plan9/sys/src/lib9p/req.c (revision 7fd46167d91ac0c2e35d4b71179b3ebdd8b6621a)
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>
69a747e4fSDavid 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;
149a747e4fSDavid du Colombier 	if(r){
159a747e4fSDavid du Colombier if(chatty9p > 1)
169a747e4fSDavid du Colombier 	fprint(2, "increfreq %p %ld\n", r, r->ref.ref);
177dd7cddfSDavid du Colombier 		incref(&r->ref);
187dd7cddfSDavid du Colombier 	}
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier 
219a747e4fSDavid du Colombier Reqpool*
229a747e4fSDavid du Colombier allocreqpool(void (*destroy)(Req*))
239a747e4fSDavid du Colombier {
249a747e4fSDavid du Colombier 	Reqpool *f;
259a747e4fSDavid du Colombier 
269a747e4fSDavid du Colombier 	f = emalloc9p(sizeof *f);
279a747e4fSDavid du Colombier 	f->map = allocmap(increqref);
289a747e4fSDavid du Colombier 	f->destroy = destroy;
299a747e4fSDavid du Colombier 	return f;
309a747e4fSDavid du Colombier }
319a747e4fSDavid du Colombier 
329a747e4fSDavid du Colombier void
339a747e4fSDavid du Colombier freereqpool(Reqpool *p)
349a747e4fSDavid du Colombier {
359a747e4fSDavid du Colombier 	freemap(p->map, (void(*)(void*))p->destroy);
369a747e4fSDavid du Colombier 	free(p);
379a747e4fSDavid 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 
449a747e4fSDavid du Colombier 	r = emalloc9p(sizeof *r);
457dd7cddfSDavid du Colombier 	r->tag = tag;
467dd7cddfSDavid du Colombier 	r->pool = pool;
477dd7cddfSDavid du Colombier 
489a747e4fSDavid du Colombier 	increqref(r);
499a747e4fSDavid 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 
589a747e4fSDavid du Colombier Req*
599a747e4fSDavid du Colombier lookupreq(Reqpool *pool, ulong tag)
609a747e4fSDavid du Colombier {
619a747e4fSDavid du Colombier if(chatty9p > 1)
629a747e4fSDavid du Colombier 	fprint(2, "lookupreq %lud\n", tag);
639a747e4fSDavid du Colombier 	return lookupkey(pool->map, tag);
649a747e4fSDavid du Colombier }
659a747e4fSDavid du Colombier 
669a747e4fSDavid du Colombier void
677dd7cddfSDavid du Colombier closereq(Req *r)
687dd7cddfSDavid du Colombier {
699a747e4fSDavid du Colombier 	if(r == nil)
709a747e4fSDavid du Colombier 		return;
717dd7cddfSDavid du Colombier 
729a747e4fSDavid du Colombier if(chatty9p > 1)
739a747e4fSDavid du Colombier 	fprint(2, "closereq %p %ld\n", r, r->ref.ref);
749a747e4fSDavid du Colombier 
759a747e4fSDavid du Colombier 	if(decref(&r->ref) == 0){
769a747e4fSDavid du Colombier 		if(r->fid)
779a747e4fSDavid du Colombier 			closefid(r->fid);
789a747e4fSDavid du Colombier 		if(r->newfid)
799a747e4fSDavid du Colombier 			closefid(r->newfid);
80*7fd46167SDavid du Colombier 		if(r->afid)
81*7fd46167SDavid du Colombier 			closefid(r->afid);
829a747e4fSDavid du Colombier 		if(r->oldreq)
839a747e4fSDavid du Colombier 			closereq(r->oldreq);
849a747e4fSDavid du Colombier 		switch(r->ifcall.type){
859a747e4fSDavid du Colombier 		case Tstat:
869a747e4fSDavid du Colombier 			free(r->ofcall.stat);
879a747e4fSDavid du Colombier 			free(r->d.name);
889a747e4fSDavid du Colombier 			free(r->d.uid);
899a747e4fSDavid du Colombier 			free(r->d.gid);
909a747e4fSDavid du Colombier 			free(r->d.muid);
919a747e4fSDavid du Colombier 			break;
929a747e4fSDavid du Colombier 		}
939a747e4fSDavid du Colombier 		if(r->pool->destroy)
949a747e4fSDavid du Colombier 			r->pool->destroy(r);
957dd7cddfSDavid du Colombier 		free(r->buf);
9659cc4ca5SDavid du Colombier 		free(r->rbuf);
977dd7cddfSDavid du Colombier 		free(r);
987dd7cddfSDavid du Colombier 	}
997dd7cddfSDavid du Colombier }
1007dd7cddfSDavid du Colombier 
1017dd7cddfSDavid du Colombier Req*
1029a747e4fSDavid du Colombier removereq(Reqpool *pool, ulong tag)
1037dd7cddfSDavid du Colombier {
1049a747e4fSDavid du Colombier if(chatty9p > 1)
1059a747e4fSDavid du Colombier 	fprint(2, "removereq %lud\n", tag);
1069a747e4fSDavid du Colombier 	return deletekey(pool->map, tag);
1077dd7cddfSDavid du Colombier }
108