Blob


1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
4 #include <bio.h>
6 Biobuf bout;
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 }
15 void
16 usage(void)
17 {
18 fprint(2, "usage: printarenas [-B blockcachesize] config [arenaname...]\n");
19 threadexitsall(0);
20 }
22 Config conf;
24 int
25 shoulddump(char *name, int argc, char **argv)
26 {
27 int i;
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 }
37 enum
38 {
39 ClumpChunks = 32*1024,
40 };
42 void
43 dumparena(Arena *arena, u64int a)
44 {
45 IEntry ie;
46 ClumpInfo *ci, *cis;
47 u32int clump;
48 int i, n, nskip;
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 }
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 }
76 void
77 threadmain(int argc, char *argv[])
78 {
79 int i;
80 Index *ix;
81 u32int bcmem;
83 bcmem = 0;
84 ARGBEGIN{
85 case 'B':
86 bcmem = unittoull(ARGF());
87 break;
88 default:
89 usage();
90 break;
91 }ARGEND
93 if(argc < 1)
94 usage();
96 ventifmtinstall();
98 if(initventi(argv[0], &conf) < 0)
99 sysfatal("can't init venti: %r");
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);
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);