xref: /plan9-contrib/sys/src/cmd/venti/srv/findscore.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
1368c31abSDavid du Colombier #include "stdinc.h"
2368c31abSDavid du Colombier #include "dat.h"
3368c31abSDavid du Colombier #include "fns.h"
4368c31abSDavid du Colombier 
5368c31abSDavid du Colombier enum
6368c31abSDavid du Colombier {
7368c31abSDavid du Colombier 	ClumpChunks	= 32*1024
8368c31abSDavid du Colombier };
9368c31abSDavid du Colombier 
10368c31abSDavid du Colombier static int	verbose;
11368c31abSDavid du Colombier 
12368c31abSDavid du Colombier int
clumpinfoeq(ClumpInfo * c,ClumpInfo * d)13368c31abSDavid du Colombier clumpinfoeq(ClumpInfo *c, ClumpInfo *d)
14368c31abSDavid du Colombier {
15368c31abSDavid du Colombier 	return c->type == d->type
16368c31abSDavid du Colombier 		&& c->size == d->size
17368c31abSDavid du Colombier 		&& c->uncsize == d->uncsize
18368c31abSDavid du Colombier 		&& scorecmp(c->score, d->score)==0;
19368c31abSDavid du Colombier }
20368c31abSDavid du Colombier 
21368c31abSDavid du Colombier int
findscore(Arena * arena,uchar * score)22368c31abSDavid du Colombier findscore(Arena *arena, uchar *score)
23368c31abSDavid du Colombier {
24368c31abSDavid du Colombier 	IEntry ie;
25368c31abSDavid du Colombier 	ClumpInfo *ci, *cis;
26368c31abSDavid du Colombier 	u64int a;
27368c31abSDavid du Colombier 	u32int clump;
28368c31abSDavid du Colombier 	int i, n, found;
29368c31abSDavid du Colombier 
30368c31abSDavid du Colombier //ZZZ remove fprint?
31368c31abSDavid du Colombier 	if(arena->memstats.clumps)
32368c31abSDavid du Colombier 		fprint(2, "reading directory for arena=%s with %d entries\n",
33368c31abSDavid du Colombier 			arena->name, arena->memstats.clumps);
34368c31abSDavid du Colombier 
35368c31abSDavid du Colombier 	cis = MKN(ClumpInfo, ClumpChunks);
36368c31abSDavid du Colombier 	found = 0;
37368c31abSDavid du Colombier 	a = 0;
38368c31abSDavid du Colombier 	memset(&ie, 0, sizeof(IEntry));
39368c31abSDavid du Colombier 	for(clump = 0; clump < arena->memstats.clumps; clump += n){
40368c31abSDavid du Colombier 		n = ClumpChunks;
41368c31abSDavid du Colombier 		if(n > arena->memstats.clumps - clump)
42368c31abSDavid du Colombier 			n = arena->memstats.clumps - clump;
43368c31abSDavid du Colombier 		if(readclumpinfos(arena, clump, cis, n) != n){
44368c31abSDavid du Colombier 			seterr(EOk, "arena directory read failed: %r");
45368c31abSDavid du Colombier 			break;
46368c31abSDavid du Colombier 		}
47368c31abSDavid du Colombier 
48368c31abSDavid du Colombier 		for(i = 0; i < n; i++){
49368c31abSDavid du Colombier 			ci = &cis[i];
50368c31abSDavid du Colombier 			if(scorecmp(score, ci->score)==0){
51368c31abSDavid du Colombier 				fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",
52368c31abSDavid du Colombier 					clump + i, ci->type, ci->uncsize, ci->size, a);
53368c31abSDavid du Colombier 				found++;
54368c31abSDavid du Colombier 			}
55368c31abSDavid du Colombier 			a += ci->size + ClumpSize;
56368c31abSDavid du Colombier 		}
57368c31abSDavid du Colombier 	}
58368c31abSDavid du Colombier 	free(cis);
59368c31abSDavid du Colombier 	return found;
60368c31abSDavid du Colombier }
61368c31abSDavid du Colombier 
62368c31abSDavid du Colombier void
usage(void)63368c31abSDavid du Colombier usage(void)
64368c31abSDavid du Colombier {
65368c31abSDavid du Colombier 	fprint(2, "usage: findscore [-v] arenafile score\n");
66368c31abSDavid du Colombier 	threadexitsall(0);
67368c31abSDavid du Colombier }
68368c31abSDavid du Colombier 
69368c31abSDavid du Colombier void
threadmain(int argc,char * argv[])70368c31abSDavid du Colombier threadmain(int argc, char *argv[])
71368c31abSDavid du Colombier {
72368c31abSDavid du Colombier 	ArenaPart *ap;
73368c31abSDavid du Colombier 	Part *part;
74368c31abSDavid du Colombier 	char *file;
75368c31abSDavid du Colombier 	u8int score[VtScoreSize];
76368c31abSDavid du Colombier 	int i, found;
77368c31abSDavid du Colombier 
78368c31abSDavid du Colombier 	ventifmtinstall();
79368c31abSDavid du Colombier 
80368c31abSDavid du Colombier 	ARGBEGIN{
81368c31abSDavid du Colombier 	case 'v':
82368c31abSDavid du Colombier 		verbose++;
83368c31abSDavid du Colombier 		break;
84368c31abSDavid du Colombier 	default:
85368c31abSDavid du Colombier 		usage();
86368c31abSDavid du Colombier 		break;
87368c31abSDavid du Colombier 	}ARGEND
88368c31abSDavid du Colombier 
89368c31abSDavid du Colombier 	readonly = 1;
90368c31abSDavid du Colombier 
91368c31abSDavid du Colombier 	if(argc != 2)
92368c31abSDavid du Colombier 		usage();
93368c31abSDavid du Colombier 
94368c31abSDavid du Colombier 	file = argv[0];
95368c31abSDavid du Colombier 	if(strscore(argv[1], score) < 0)
96*14cc0f53SDavid du Colombier 		sysfatal("bad score %s", argv[1]);
97368c31abSDavid du Colombier 
98368c31abSDavid du Colombier 	part = initpart(file, OREAD|ODIRECT);
99368c31abSDavid du Colombier 	if(part == nil)
100368c31abSDavid du Colombier 		sysfatal("can't open partition %s: %r", file);
101368c31abSDavid du Colombier 
102368c31abSDavid du Colombier 	ap = initarenapart(part);
103368c31abSDavid du Colombier 	if(ap == nil)
104368c31abSDavid du Colombier 		sysfatal("can't initialize arena partition in %s: %r", file);
105368c31abSDavid du Colombier 
106368c31abSDavid du Colombier 	if(verbose > 1){
107368c31abSDavid du Colombier 		printarenapart(2, ap);
108368c31abSDavid du Colombier 		fprint(2, "\n");
109368c31abSDavid du Colombier 	}
110368c31abSDavid du Colombier 
111368c31abSDavid du Colombier 	initdcache(8 * MaxDiskBlock);
112368c31abSDavid du Colombier 
113368c31abSDavid du Colombier 	found = 0;
114368c31abSDavid du Colombier 	for(i = 0; i < ap->narenas; i++)
115368c31abSDavid du Colombier 		found += findscore(ap->arenas[i], score);
116368c31abSDavid du Colombier 
117368c31abSDavid du Colombier 	print("found %d occurrences of %V\n", found, score);
118368c31abSDavid du Colombier 
119368c31abSDavid du Colombier 	if(verbose > 1)
120368c31abSDavid du Colombier 		printstats();
121368c31abSDavid du Colombier 	threadexitsall(0);
122368c31abSDavid du Colombier }
123