diff options
author | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
commit | a0d146edd7a7de6236a0d60baafeeb59f8452aae (patch) | |
tree | b55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/printarenas.c | |
parent | 88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff) | |
download | plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2 plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip |
return of venti
Diffstat (limited to 'src/cmd/venti/srv/printarenas.c')
-rw-r--r-- | src/cmd/venti/srv/printarenas.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/printarenas.c b/src/cmd/venti/srv/printarenas.c new file mode 100644 index 00000000..111db018 --- /dev/null +++ b/src/cmd/venti/srv/printarenas.c @@ -0,0 +1,113 @@ +#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); +} |