Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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);
}