findscore.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. enum
  5. {
  6. ClumpChunks = 32*1024
  7. };
  8. static int verbose;
  9. int
  10. clumpinfoeq(ClumpInfo *c, ClumpInfo *d)
  11. {
  12. return c->type == d->type
  13. && c->size == d->size
  14. && c->uncsize == d->uncsize
  15. && scorecmp(c->score, d->score)==0;
  16. }
  17. int
  18. findscore(Arena *arena, uchar *score)
  19. {
  20. IEntry ie;
  21. ClumpInfo *ci, *cis;
  22. u64int a;
  23. u32int clump;
  24. int i, n, found;
  25. //ZZZ remove fprint?
  26. if(arena->memstats.clumps)
  27. fprint(2, "reading directory for arena=%s with %d entries\n",
  28. arena->name, arena->memstats.clumps);
  29. cis = MKN(ClumpInfo, ClumpChunks);
  30. found = 0;
  31. a = 0;
  32. memset(&ie, 0, sizeof(IEntry));
  33. for(clump = 0; clump < arena->memstats.clumps; clump += n){
  34. n = ClumpChunks;
  35. if(n > arena->memstats.clumps - clump)
  36. n = arena->memstats.clumps - clump;
  37. if(readclumpinfos(arena, clump, cis, n) != n){
  38. seterr(EOk, "arena directory read failed: %r");
  39. break;
  40. }
  41. for(i = 0; i < n; i++){
  42. ci = &cis[i];
  43. if(scorecmp(score, ci->score)==0){
  44. fprint(2, "found at clump=%d with type=%d size=%d csize=%d position=%lld\n",
  45. clump + i, ci->type, ci->uncsize, ci->size, a);
  46. found++;
  47. }
  48. a += ci->size + ClumpSize;
  49. }
  50. }
  51. free(cis);
  52. return found;
  53. }
  54. void
  55. usage(void)
  56. {
  57. fprint(2, "usage: findscore [-v] arenafile score\n");
  58. threadexitsall(0);
  59. }
  60. void
  61. threadmain(int argc, char *argv[])
  62. {
  63. ArenaPart *ap;
  64. Part *part;
  65. char *file;
  66. u8int score[VtScoreSize];
  67. int i, found;
  68. ventifmtinstall();
  69. ARGBEGIN{
  70. case 'v':
  71. verbose++;
  72. break;
  73. default:
  74. usage();
  75. break;
  76. }ARGEND
  77. readonly = 1;
  78. if(argc != 2)
  79. usage();
  80. file = argv[0];
  81. if(strscore(argv[1], score) < 0)
  82. sysfatal("bad score %s\n", argv[1]);
  83. part = initpart(file, OREAD|ODIRECT);
  84. if(part == nil)
  85. sysfatal("can't open partition %s: %r", file);
  86. ap = initarenapart(part);
  87. if(ap == nil)
  88. sysfatal("can't initialize arena partition in %s: %r", file);
  89. if(verbose > 1){
  90. printarenapart(2, ap);
  91. fprint(2, "\n");
  92. }
  93. initdcache(8 * MaxDiskBlock);
  94. found = 0;
  95. for(i = 0; i < ap->narenas; i++)
  96. found += findscore(ap->arenas[i], score);
  97. print("found %d occurrences of %V\n", found, score);
  98. if(verbose > 1)
  99. printstats();
  100. threadexitsall(0);
  101. }