plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

fid.c (1048B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <fcall.h>
      4 #include <thread.h>
      5 #include "9p.h"
      6 
      7 static void
      8 incfidref(void *v)
      9 {
     10 	Fid *f;
     11 
     12 	f = v;
     13 	if(f)
     14 		incref(&f->ref);
     15 }
     16 
     17 Fidpool*
     18 allocfidpool(void (*destroy)(Fid*))
     19 {
     20 	Fidpool *f;
     21 
     22 	f = emalloc9p(sizeof *f);
     23 	f->map = allocmap(incfidref);
     24 	f->destroy = destroy;
     25 	return f;
     26 }
     27 
     28 void
     29 freefidpool(Fidpool *p)
     30 {
     31 	freemap(p->map, (void(*)(void*))p->destroy);
     32 	free(p);
     33 }
     34 
     35 Fid*
     36 allocfid(Fidpool *pool, ulong fid)
     37 {
     38 	Fid *f;
     39 
     40 	f = emalloc9p(sizeof *f);
     41 	f->fid = fid;
     42 	f->omode = -1;
     43 	f->pool = pool;
     44 
     45 	incfidref(f);
     46 	incfidref(f);
     47 	if(caninsertkey(pool->map, fid, f) == 0){
     48 		closefid(f);
     49 		closefid(f);
     50 		return nil;
     51 	}
     52 
     53 	return f;
     54 }
     55 
     56 Fid*
     57 lookupfid(Fidpool *pool, ulong fid)
     58 {
     59 	return lookupkey(pool->map, fid);
     60 }
     61 
     62 void
     63 closefid(Fid *f)
     64 {
     65 	if(decref(&f->ref) == 0) {
     66 		if(f->rdir)
     67 			closedirfile(f->rdir);
     68 		if(f->pool->destroy)
     69 			f->pool->destroy(f);
     70 		if(f->file)
     71 			closefile(f->file);
     72 		free(f->uid);
     73 		free(f);
     74 	}
     75 }
     76 
     77 Fid*
     78 removefid(Fidpool *pool, ulong fid)
     79 {
     80 	return deletekey(pool->map, fid);
     81 }