URI: 
       tprintarenas.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
       ---
       tprintarenas.c (2074B)
       ---
            1 #include "stdinc.h"
            2 #include "dat.h"
            3 #include "fns.h"
            4 #include <bio.h>
            5 
            6 Biobuf bout;
            7 
            8 static void
            9 pie(IEntry *ie)
           10 {
           11         Bprint(&bout, "%22lld %V %3d %5d\n",
           12                 ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
           13 }
           14 
           15 void
           16 usage(void)
           17 {
           18         fprint(2, "usage: printarenas [-B blockcachesize] config [arenaname...]\n");
           19         threadexitsall(0);
           20 }
           21 
           22 Config conf;
           23 
           24 int
           25 shoulddump(char *name, int argc, char **argv)
           26 {
           27         int i;
           28 
           29         if(argc == 0)
           30                 return 1;
           31         for(i=0; i<argc; i++)
           32                 if(strcmp(name, argv[i]) == 0)
           33                         return 1;
           34         return 0;
           35 }
           36 
           37 enum
           38 {
           39         ClumpChunks = 32*1024,
           40 };
           41 
           42 void
           43 dumparena(Arena *arena, u64int a)
           44 {
           45         IEntry ie;
           46         ClumpInfo *ci, *cis;
           47         u32int clump;
           48         int i, n, nskip;
           49 
           50         cis = MKN(ClumpInfo, ClumpChunks);
           51         nskip = 0;
           52         memset(&ie, 0, sizeof(IEntry));
           53         for(clump = 0; clump < arena->memstats.clumps; clump += n){
           54                 n = ClumpChunks;
           55                 if(n > arena->memstats.clumps - clump)
           56                         n = arena->memstats.clumps - clump;
           57                 if(readclumpinfos(arena, clump, cis, n) != n){
           58                         fprint(2, "arena directory read failed: %r\n");
           59                         break;
           60                 }
           61 
           62                 for(i = 0; i < n; i++){
           63                         ci = &cis[i];
           64                         ie.ia.type = ci->type;
           65                         ie.ia.size = ci->uncsize;
           66                         ie.ia.addr = a;
           67                         a += ci->size + ClumpSize;
           68                         ie.ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
           69                         scorecp(ie.score, ci->score);
           70                         pie(&ie);
           71                 }
           72         }
           73         free(cis);
           74 }
           75 
           76 void
           77 threadmain(int argc, char *argv[])
           78 {
           79         int i;
           80         Index *ix;
           81         u32int bcmem;
           82 
           83         bcmem = 0;
           84         ARGBEGIN{
           85         case 'B':
           86                 bcmem = unittoull(ARGF());
           87                 break;
           88         default:
           89                 usage();
           90                 break;
           91         }ARGEND
           92 
           93         if(argc < 1)
           94                 usage();
           95 
           96         ventifmtinstall();
           97 
           98         if(initventi(argv[0], &conf) < 0)
           99                 sysfatal("can't init venti: %r");
          100 
          101         if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
          102                 bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
          103         if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
          104         initdcache(bcmem);
          105 
          106         Binit(&bout, 1, OWRITE);
          107         ix = mainindex;
          108         for(i=0; i<ix->narenas; i++)
          109                 if(shoulddump(ix->arenas[i]->name, argc-1, argv+1))
          110                         dumparena(ix->arenas[i], ix->amap[i].start);
          111         Bterm(&bout);
          112         threadexitsall(0);
          113 }