123 lines
2.1 KiB
C
123 lines
2.1 KiB
C
#include "stdinc.h"
|
|
#include "dat.h"
|
|
#include "fns.h"
|
|
|
|
enum
|
|
{
|
|
ClumpChunks = 32*1024
|
|
};
|
|
|
|
static int verbose;
|
|
|
|
int
|
|
clumpinfoeq(ClumpInfo *c, ClumpInfo *d)
|
|
{
|
|
return c->type == d->type
|
|
&& c->size == d->size
|
|
&& c->uncsize == d->uncsize
|
|
&& scorecmp(c->score, d->score)==0;
|
|
}
|
|
|
|
int
|
|
findscore(Arena *arena, uchar *score)
|
|
{
|
|
IEntry ie;
|
|
ClumpInfo *ci, *cis;
|
|
u64int a;
|
|
u32int clump;
|
|
int i, n, found;
|
|
|
|
//ZZZ remove fprint?
|
|
if(arena->memstats.clumps)
|
|
fprint(2, "reading directory for arena=%s with %d entries\n",
|
|
arena->name, arena->memstats.clumps);
|
|
|
|
cis = MKN(ClumpInfo, ClumpChunks);
|
|
found = 0;
|
|
a = 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){
|
|
seterr(EOk, "arena directory read failed: %r");
|
|
break;
|
|
}
|
|
|
|
for(i = 0; i < n; i++){
|
|
ci = &cis[i];
|
|
if(scorecmp(score, ci->score)==0){
|
|
fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",
|
|
clump + i, ci->type, ci->uncsize, ci->size, a);
|
|
found++;
|
|
}
|
|
a += ci->size + ClumpSize;
|
|
}
|
|
}
|
|
free(cis);
|
|
return found;
|
|
}
|
|
|
|
void
|
|
usage(void)
|
|
{
|
|
fprint(2, "usage: findscore [-v] arenafile score\n");
|
|
threadexitsall(0);
|
|
}
|
|
|
|
void
|
|
threadmain(int argc, char *argv[])
|
|
{
|
|
ArenaPart *ap;
|
|
Part *part;
|
|
char *file;
|
|
u8int score[VtScoreSize];
|
|
int i, found;
|
|
|
|
ventifmtinstall();
|
|
|
|
ARGBEGIN{
|
|
case 'v':
|
|
verbose++;
|
|
break;
|
|
default:
|
|
usage();
|
|
break;
|
|
}ARGEND
|
|
|
|
readonly = 1;
|
|
|
|
if(argc != 2)
|
|
usage();
|
|
|
|
file = argv[0];
|
|
if(strscore(argv[1], score) < 0)
|
|
sysfatal("bad score %s", argv[1]);
|
|
|
|
part = initpart(file, OREAD|ODIRECT);
|
|
if(part == nil)
|
|
sysfatal("can't open partition %s: %r", file);
|
|
|
|
ap = initarenapart(part);
|
|
if(ap == nil)
|
|
sysfatal("can't initialize arena partition in %s: %r", file);
|
|
|
|
if(verbose > 1){
|
|
printarenapart(2, ap);
|
|
fprint(2, "\n");
|
|
}
|
|
|
|
initdcache(8 * MaxDiskBlock);
|
|
|
|
found = 0;
|
|
for(i = 0; i < ap->narenas; i++)
|
|
found += findscore(ap->arenas[i], score);
|
|
|
|
print("found %d occurrences of %V\n", found, score);
|
|
|
|
if(verbose > 1)
|
|
printstats();
|
|
threadexitsall(0);
|
|
}
|