#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include "9p.h"

static void
incfidref(void *v)
{
	Fid *f;

	f = v;
	if(f)
		incref(&f->ref);
}

Fidpool*
allocfidpool(void (*destroy)(Fid*))
{
	Fidpool *f;

	f = emalloc9p(sizeof *f);
	f->map = allocmap(incfidref);
	f->destroy = destroy;
	return f;
}

void
freefidpool(Fidpool *p)
{
	freemap(p->map, (void(*)(void*))p->destroy);
	free(p);
}

Fid*
allocfid(Fidpool *pool, ulong fid)
{
	Fid *f;

	f = emalloc9p(sizeof *f);
	f->fid = fid;
	f->omode = -1;
	f->pool = pool;

	incfidref(f);
	incfidref(f);
	if(caninsertkey(pool->map, fid, f) == 0){
		closefid(f);
		closefid(f);
		return nil;
	}

	return f;
}

Fid*
lookupfid(Fidpool *pool, ulong fid)
{
	return lookupkey(pool->map, fid);
}

void
closefid(Fid *f)
{
	if(decref(&f->ref) == 0) {
		if(f->rdir)
			closedirfile(f->rdir);
		if(f->pool->destroy)
			f->pool->destroy(f);
		if(f->file)
			closefile(f->file);
		free(f->uid);
		free(f);
	}
}

Fid*
removefid(Fidpool *pool, ulong fid)
{
	return deletekey(pool->map, fid);
}
