xref: /plan9/sys/src/lib9p/fid.c (revision 375daca8932d0755549a5f8e4d068a24a49927d4)
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>
67dd7cddfSDavid du Colombier #include "9p.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier static void
incfidref(void * v)97dd7cddfSDavid du Colombier incfidref(void *v)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	Fid *f;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	f = v;
147dd7cddfSDavid du Colombier 	if(f)
157dd7cddfSDavid du Colombier 		incref(&f->ref);
167dd7cddfSDavid du Colombier }
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier Fidpool*
allocfidpool(void (* destroy)(Fid *))199a747e4fSDavid du Colombier allocfidpool(void (*destroy)(Fid*))
207dd7cddfSDavid du Colombier {
217dd7cddfSDavid du Colombier 	Fidpool *f;
227dd7cddfSDavid du Colombier 
239a747e4fSDavid du Colombier 	f = emalloc9p(sizeof *f);
249a747e4fSDavid du Colombier 	f->map = allocmap(incfidref);
259a747e4fSDavid du Colombier 	f->destroy = destroy;
267dd7cddfSDavid du Colombier 	return f;
277dd7cddfSDavid du Colombier }
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier void
freefidpool(Fidpool * p)309a747e4fSDavid du Colombier freefidpool(Fidpool *p)
317dd7cddfSDavid du Colombier {
329a747e4fSDavid du Colombier 	freemap(p->map, (void(*)(void*))p->destroy);
339a747e4fSDavid du Colombier 	free(p);
347dd7cddfSDavid du Colombier }
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier Fid*
allocfid(Fidpool * pool,ulong fid)379a747e4fSDavid du Colombier allocfid(Fidpool *pool, ulong fid)
387dd7cddfSDavid du Colombier {
399a747e4fSDavid du Colombier 	Fid *f;
409a747e4fSDavid du Colombier 
419a747e4fSDavid du Colombier 	f = emalloc9p(sizeof *f);
429a747e4fSDavid du Colombier 	f->fid = fid;
439a747e4fSDavid du Colombier 	f->omode = -1;
449a747e4fSDavid du Colombier 	f->pool = pool;
459a747e4fSDavid du Colombier 
469a747e4fSDavid du Colombier 	incfidref(f);
479a747e4fSDavid du Colombier 	incfidref(f);
489a747e4fSDavid du Colombier 	if(caninsertkey(pool->map, fid, f) == 0){
499a747e4fSDavid du Colombier 		closefid(f);
50*375daca8SDavid du Colombier 		closefid(f);
519a747e4fSDavid du Colombier 		return nil;
529a747e4fSDavid du Colombier 	}
539a747e4fSDavid du Colombier 
549a747e4fSDavid du Colombier 	return f;
559a747e4fSDavid du Colombier }
569a747e4fSDavid du Colombier 
579a747e4fSDavid du Colombier Fid*
lookupfid(Fidpool * pool,ulong fid)589a747e4fSDavid du Colombier lookupfid(Fidpool *pool, ulong fid)
599a747e4fSDavid du Colombier {
609a747e4fSDavid du Colombier 	return lookupkey(pool->map, fid);
619a747e4fSDavid du Colombier }
629a747e4fSDavid du Colombier 
639a747e4fSDavid du Colombier void
closefid(Fid * f)649a747e4fSDavid du Colombier closefid(Fid *f)
659a747e4fSDavid du Colombier {
669a747e4fSDavid du Colombier 	if(decref(&f->ref) == 0) {
679a747e4fSDavid du Colombier 		if(f->rdir)
689a747e4fSDavid du Colombier 			closedirfile(f->rdir);
699a747e4fSDavid du Colombier 		if(f->pool->destroy)
709a747e4fSDavid du Colombier 			f->pool->destroy(f);
719a747e4fSDavid du Colombier 		if(f->file)
729a747e4fSDavid du Colombier 			closefile(f->file);
739a747e4fSDavid du Colombier 		free(f->uid);
749a747e4fSDavid du Colombier 		free(f);
759a747e4fSDavid du Colombier 	}
769a747e4fSDavid du Colombier }
779a747e4fSDavid du Colombier 
789a747e4fSDavid du Colombier Fid*
removefid(Fidpool * pool,ulong fid)799a747e4fSDavid du Colombier removefid(Fidpool *pool, ulong fid)
809a747e4fSDavid du Colombier {
819a747e4fSDavid du Colombier 	return deletekey(pool->map, fid);
827dd7cddfSDavid du Colombier }
83