printarenas.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. #include <bio.h>
  5. Biobuf bout;
  6. static void
  7. pie(IEntry *ie)
  8. {
  9. Bprint(&bout, "%22lld %V %3d %5d\n",
  10. ie->ia.addr, ie->score, ie->ia.type, ie->ia.size);
  11. }
  12. void
  13. usage(void)
  14. {
  15. fprint(2, "usage: printarenas [-B blockcachesize] config [arenaname...]\n");
  16. threadexitsall(0);
  17. }
  18. Config conf;
  19. int
  20. shoulddump(char *name, int argc, char **argv)
  21. {
  22. int i;
  23. if(argc == 0)
  24. return 1;
  25. for(i=0; i<argc; i++)
  26. if(strcmp(name, argv[i]) == 0)
  27. return 1;
  28. return 0;
  29. }
  30. enum
  31. {
  32. ClumpChunks = 32*1024,
  33. };
  34. void
  35. dumparena(Arena *arena, u64int a)
  36. {
  37. IEntry ie;
  38. ClumpInfo *ci, *cis;
  39. u32int clump;
  40. int i, n, nskip;
  41. cis = MKN(ClumpInfo, ClumpChunks);
  42. nskip = 0;
  43. memset(&ie, 0, sizeof(IEntry));
  44. for(clump = 0; clump < arena->memstats.clumps; clump += n){
  45. n = ClumpChunks;
  46. if(n > arena->memstats.clumps - clump)
  47. n = arena->memstats.clumps - clump;
  48. if(readclumpinfos(arena, clump, cis, n) != n){
  49. fprint(2, "arena directory read failed: %r\n");
  50. break;
  51. }
  52. for(i = 0; i < n; i++){
  53. ci = &cis[i];
  54. ie.ia.type = ci->type;
  55. ie.ia.size = ci->uncsize;
  56. ie.ia.addr = a;
  57. a += ci->size + ClumpSize;
  58. ie.ia.blocks = (ci->size + ClumpSize + (1 << ABlockLog) - 1) >> ABlockLog;
  59. scorecp(ie.score, ci->score);
  60. pie(&ie);
  61. }
  62. }
  63. free(cis);
  64. }
  65. void
  66. threadmain(int argc, char *argv[])
  67. {
  68. int i;
  69. Index *ix;
  70. u32int bcmem;
  71. bcmem = 0;
  72. ARGBEGIN{
  73. case 'B':
  74. bcmem = unittoull(ARGF());
  75. break;
  76. default:
  77. usage();
  78. break;
  79. }ARGEND
  80. if(argc < 1)
  81. usage();
  82. ventifmtinstall();
  83. if(initventi(argv[0], &conf) < 0)
  84. sysfatal("can't init venti: %r");
  85. if(bcmem < maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16))
  86. bcmem = maxblocksize * (mainindex->narenas + mainindex->nsects * 4 + 16);
  87. if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
  88. initdcache(bcmem);
  89. Binit(&bout, 1, OWRITE);
  90. ix = mainindex;
  91. for(i=0; i<ix->narenas; i++)
  92. if(shoulddump(ix->arenas[i]->name, argc-1, argv+1))
  93. dumparena(ix->arenas[i], ix->amap[i].start);
  94. Bterm(&bout);
  95. threadexitsall(0);
  96. }