mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
82 lines
1 KiB
C
82 lines
1 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <auth.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);
|
|
}
|