LargeHeapBucket.h 4.9 KB

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