LargeHeapBucket.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. class HeapInfo;
  9. class RecyclerSweep;
  10. // CONSIDER: Templatizing this so that we can have separate leaf large allocations
  11. // and finalizable allocations
  12. // CONSIDER: Templatizing this so that we don't have free list support if we don't need it
  13. class LargeHeapBucket: public HeapBucket
  14. {
  15. public:
  16. LargeHeapBucket():
  17. supportFreeList(false),
  18. freeList(nullptr),
  19. explicitFreeList(nullptr),
  20. fullLargeBlockList(nullptr),
  21. largeBlockList(nullptr),
  22. #ifdef RECYCLER_PAGE_HEAP
  23. largePageHeapBlockList(nullptr),
  24. #endif
  25. pendingDisposeLargeBlockList(nullptr)
  26. #if ENABLE_CONCURRENT_GC
  27. , pendingSweepLargeBlockList(nullptr)
  28. #if ENABLE_PARTIAL_GC
  29. , partialSweptLargeBlockList(nullptr)
  30. #endif
  31. #endif
  32. {
  33. }
  34. ~LargeHeapBucket();
  35. void Initialize(HeapInfo * heapInfo, DECLSPEC_GUARD_OVERFLOW uint sizeCat, bool supportFreeList = false);
  36. LargeHeapBlock* AddLargeHeapBlock(DECLSPEC_GUARD_OVERFLOW size_t size, bool nothrow);
  37. bool SupportFreeList() { return supportFreeList; }
  38. template <ObjectInfoBits attributes, bool nothrow>
  39. char* Alloc(Recycler * recycler, size_t sizeCat);
  40. #ifdef RECYCLER_PAGE_HEAP
  41. char *PageHeapAlloc(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, size_t size, ObjectInfoBits attributes, PageHeapMode mode, bool nothrow);
  42. #endif
  43. void ExplicitFree(void * object, size_t sizeCat);
  44. void ResetMarks(ResetMarkFlags flags);
  45. void ScanInitialImplicitRoots(Recycler * recycler);
  46. void ScanNewImplicitRoots(Recycler * recycler);
  47. void Sweep(RecyclerSweep& recyclerSweep);
  48. void ReinsertLargeHeapBlock(LargeHeapBlock * heapBlock);
  49. void RegisterFreeList(LargeHeapBlockFreeList* freeList);
  50. void UnregisterFreeList(LargeHeapBlockFreeList* freeList);
  51. void FinalizeAllObjects();
  52. void Finalize();
  53. void DisposeObjects();
  54. void TransferDisposedObjects();
  55. void EnumerateObjects(ObjectInfoBits infoBits, void (*CallBackFunction)(void * address, size_t size));
  56. void Verify();
  57. void VerifyMark();
  58. void VerifyLargeHeapBlockCount();
  59. size_t Rescan(RescanFlags flags);
  60. #if ENABLE_PARTIAL_GC || ENABLE_CONCURRENT_GC
  61. void SweepPendingObjects(RecyclerSweep& recyclerSweep);
  62. #if ENABLE_PARTIAL_GC
  63. void FinishPartialCollect(RecyclerSweep * recyclerSweep);
  64. #endif
  65. #if ENABLE_CONCURRENT_GC
  66. void ConcurrentTransferSweptObjects(RecyclerSweep& recyclerSweep);
  67. #if ENABLE_PARTIAL_GC
  68. void ConcurrentPartialTransferSweptObjects(RecyclerSweep& recyclerSweep);
  69. #endif
  70. #endif
  71. #endif
  72. #if DBG || defined(RECYCLER_SLOW_CHECK_ENABLED)
  73. size_t GetLargeHeapBlockCount(bool checkCount = false) const;
  74. #ifdef RECYCLER_SLOW_CHECK_ENABLED
  75. size_t Check();
  76. template <typename TBlockType>
  77. size_t Check(bool expectFull, bool expectPending, TBlockType * list, TBlockType * tail = nullptr);
  78. #endif
  79. #endif
  80. #if ENABLE_MEM_STATS
  81. void AggregateBucketStats();
  82. #endif
  83. private:
  84. char * SnailAlloc(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, size_t size, ObjectInfoBits attributes, bool nothrow);
  85. char * TryAlloc(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, ObjectInfoBits attributes);
  86. char * TryAllocFromNewHeapBlock(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, size_t size, ObjectInfoBits attributes, bool nothrow);
  87. char * TryAllocFromFreeList(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, ObjectInfoBits attributes);
  88. char * TryAllocFromExplicitFreeList(Recycler * recycler, DECLSPEC_GUARD_OVERFLOW size_t sizeCat, ObjectInfoBits attributes);
  89. template <class Fn> void ForEachLargeHeapBlock(Fn fn);
  90. template <class Fn> void ForEachEditingLargeHeapBlock(Fn fn);
  91. void Finalize(Recycler* recycler, LargeHeapBlock* heapBlock);
  92. void SweepLargeHeapBlockList(RecyclerSweep& recyclerSweep, LargeHeapBlock * heapBlockList);
  93. void ConstructFreelist(LargeHeapBlock * heapBlock);
  94. size_t Rescan(LargeHeapBlock * list, Recycler * recycler, bool isPartialSwept, RescanFlags flags);
  95. LargeHeapBlock * fullLargeBlockList;
  96. LargeHeapBlock * largeBlockList;
  97. #ifdef RECYCLER_PAGE_HEAP
  98. LargeHeapBlock * largePageHeapBlockList;
  99. #endif
  100. LargeHeapBlock * pendingDisposeLargeBlockList;
  101. #if ENABLE_CONCURRENT_GC
  102. LargeHeapBlock * pendingSweepLargeBlockList;
  103. #if ENABLE_PARTIAL_GC
  104. // Used for concurrent-partial GC
  105. LargeHeapBlock * partialSweptLargeBlockList;
  106. #endif
  107. #endif
  108. bool supportFreeList;
  109. LargeHeapBlockFreeList* freeList;
  110. FreeObject * explicitFreeList;
  111. friend class HeapInfo;
  112. friend class Recycler;
  113. friend class ::ScriptMemoryDumper;
  114. };
  115. }