SmallNormalHeapBucket.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Memory
  7. {
  8. template <typename TBlockType>
  9. class SmallNormalHeapBucketBase : public HeapBucketT<TBlockType>
  10. {
  11. typedef HeapBucketT<TBlockType> BaseT;
  12. public:
  13. typedef typename TBlockType::HeapBlockAttributes TBlockAttributes;
  14. SmallNormalHeapBucketBase();
  15. CompileAssert(!BaseT::IsLeafBucket);
  16. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  17. friend class ::ScriptMemoryDumper;
  18. #endif
  19. #if ENABLE_MEM_STATS
  20. void AggregateBucketStats();
  21. #endif
  22. protected:
  23. template <class TBlockAttributes>
  24. friend class HeapBucketGroup;
  25. friend class HeapInfo;
  26. friend class HeapBlockMap32;
  27. void ScanInitialImplicitRoots(Recycler * recycler);
  28. void ScanNewImplicitRoots(Recycler * recycler);
  29. static bool RescanObjectsOnPage(TBlockType * block, char * address, char * blockStartAddress, BVStatic<TBlockAttributes::BitVectorCount>* markBits, const uint localObjectSize, uint bucketIndex, __out_opt bool* anyObjectRescanned, Recycler* recycler);
  30. #if ENABLE_CONCURRENT_GC
  31. void SweepPendingObjects(RecyclerSweep& recyclerSweep);
  32. template <SweepMode mode>
  33. TBlockType * SweepPendingObjects(Recycler * recycler, TBlockType * list);
  34. #endif
  35. void Sweep(RecyclerSweep& recyclerSweep);
  36. #if ENABLE_PARTIAL_GC
  37. ~SmallNormalHeapBucketBase();
  38. template <class Fn>
  39. void SweepPartialReusePages(RecyclerSweep& recyclerSweep, TBlockType * heapBlockList,
  40. TBlockType *& reuseBlocklist, TBlockType *&unusedBlockList, bool allocationsAllowedDuringConcurrentSweep, Fn callBack);
  41. void SweepPartialReusePages(RecyclerSweep& recyclerSweep);
  42. void FinishPartialCollect(RecyclerSweep * recyclerSweep);
  43. void EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(void * address, size_t size));
  44. #if DBG
  45. void ResetMarks(ResetMarkFlags flags);
  46. static void SweepVerifyPartialBlocks(Recycler * recycler, TBlockType * heapBlockList);
  47. #endif
  48. #if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED)
  49. size_t GetNonEmptyHeapBlockCount(bool checkCount) const;
  50. #endif
  51. #ifdef RECYCLER_SLOW_CHECK_ENABLED
  52. size_t Check(bool checkCount = true);
  53. friend class HeapBucketT<TBlockType>;
  54. #endif
  55. #ifdef RECYCLER_MEMORY_VERIFY
  56. void Verify();
  57. #endif
  58. #ifdef RECYCLER_VERIFY_MARK
  59. void VerifyMark();
  60. #endif
  61. protected:
  62. TBlockType * partialHeapBlockList; // list of blocks that is partially collected
  63. // This list exists to keep track of heap blocks that
  64. // are not full but don't have a large amount of free space
  65. // where allocating from it causing a write watch to be triggered
  66. // is not worth the effort
  67. #if ENABLE_CONCURRENT_GC
  68. TBlockType * partialSweptHeapBlockList; // list of blocks that is partially swept
  69. #endif
  70. #endif
  71. };
  72. template <typename TBlockAttributes>
  73. class SmallNormalHeapBucketT : public SmallNormalHeapBucketBase<SmallNormalHeapBlockT<TBlockAttributes>> {};
  74. typedef SmallNormalHeapBucketT<SmallAllocationBlockAttributes> SmallNormalHeapBucket;
  75. typedef SmallNormalHeapBucketT<MediumAllocationBlockAttributes> MediumNormalHeapBucket;
  76. #ifdef RECYCLER_WRITE_BARRIER
  77. template <typename TBlockAttributes>
  78. class SmallNormalWithBarrierHeapBucketT : public SmallNormalHeapBucketBase<SmallNormalWithBarrierHeapBlockT<TBlockAttributes>>
  79. {
  80. public:
  81. void Initialize(HeapInfo * heapInfo, uint sizeCat)
  82. {
  83. CompileAssert(SmallNormalWithBarrierHeapBucketT::IsLeafBucket == false);
  84. __super::Initialize(heapInfo, sizeCat);
  85. }
  86. };
  87. typedef SmallNormalWithBarrierHeapBucketT<SmallAllocationBlockAttributes> SmallNormalWithBarrierHeapBucket;
  88. typedef SmallNormalWithBarrierHeapBucketT<MediumAllocationBlockAttributes> MediumNormalWithBarrierHeapBucket;
  89. #endif
  90. extern template class SmallNormalHeapBucketBase<SmallNormalHeapBlock>;
  91. extern template class SmallNormalHeapBucketBase<MediumNormalHeapBlock>;
  92. #ifdef RECYCLER_WRITE_BARRIER
  93. extern template class SmallNormalHeapBucketBase<SmallNormalWithBarrierHeapBlock>;
  94. extern template class SmallNormalHeapBucketBase<MediumNormalWithBarrierHeapBlock>;
  95. #endif
  96. }