plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }