123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #include "stdinc.h"
- #include "dat.h"
- #include "fns.h"
- #include <bio.h>
- Biobuf bout;
- static void
- pie(IEntry *ie)
- {
- Bprint(&bout, "%22lld %V %3d %5d\n",
- ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
- }
- void
- usage(void)
- {
- fprint(2, "usage: printarenas [-B blockcachesize] config [arenaname...]\n");
- threadexitsall(0);
- }
- Config conf;
- int
- shoulddump(char *name, int argc, char **argv)
- {
- int i;
- if(argc == 0)
- return 1;
- for(i=0; i<argc; i++)
- if(strcmp(name, argv[i]) == 0)
- return 1;
- return 0;
- }
- enum
- {
- ClumpChunks = 32*1024,
- };
- void
- dumparena(Arena *arena, u64int a)
- {
- IEntry ie;
- ClumpInfo *ci, *cis;
- u32int clump;
- int i, n, nskip;
- cis = MKN(ClumpInfo, ClumpChunks);
- nskip = 0;
- memset(&ie, 0, sizeof(IEntry));
- for(clump = 0; clump < arena->memstats.clumps; clump += n){
- n = ClumpChunks;
- if(n > arena->memstats.clumps - clump)
- n = arena->memstats.clumps - clump;
- if(readclumpinfos(arena, clump, cis, n) != n){
- fprint(2, "arena directory read failed: %r\n");
- break;
- }
- for(i = 0; i < n; i++){
- ci = &cis[i];
- ie.ia.type = ci->type;
- ie.ia.size = ci->uncsize;
- ie.ia.addr = a;
- a += ci->size + ClumpSize;
- ie.ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
- scorecp(ie.score, ci->score);
- pie(&ie);
- }
- }
- free(cis);
- }
- void
- threadmain(int argc, char *argv[])
- {
- int i;
- Index *ix;
- u32int bcmem;
- bcmem = 0;
- ARGBEGIN{
- case 'B':
- bcmem = unittoull(ARGF());
- break;
- default:
- usage();
- break;
- }ARGEND
- if(argc < 1)
- usage();
- ventifmtinstall();
- if(initventi(argv[0], &conf) < 0)
- sysfatal("can't init venti: %r");
- if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
- bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
- if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
- initdcache(bcmem);
- Binit(&bout, 1, OWRITE);
- ix = mainindex;
- for(i=0; i<ix->narenas; i++)
- if(shoulddump(ix->arenas[i]->name, argc-1, argv+1))
- dumparena(ix->arenas[i], ix->amap[i].start);
- Bterm(&bout);
- threadexitsall(0);
- }
|