printarenas.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 }