URI:
       tfid.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tfid.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 }