123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #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\n", 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);
- }
|