SmallNormalHeapBlock.h 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 <class TBlockAttributes>
  9. class SmallNormalHeapBlockT : public SmallHeapBlockT<TBlockAttributes>
  10. {
  11. typedef SmallHeapBlockT<TBlockAttributes> Base;
  12. using Base::SmallNormalBlockType;
  13. using Base::MediumNormalBlockType;
  14. friend class HeapBucketT<SmallNormalHeapBlockT>;
  15. public:
  16. typedef typename Base::HeapBlockType HeapBlockType;
  17. typedef typename Base::SmallHeapBlockBitVector SmallHeapBlockBitVector;
  18. typedef TBlockAttributes HeapBlockAttributes;
  19. static const ObjectInfoBits RequiredAttributes = NoBit;
  20. static SmallNormalHeapBlockT * New(HeapBucketT<SmallNormalHeapBlockT> * bucket);
  21. static void Delete(SmallNormalHeapBlockT * block);
  22. SmallNormalHeapBlockT * GetNextBlock() const
  23. {
  24. HeapBlock* block = Base::GetNextBlock();
  25. return block ? block->template AsNormalBlock<TBlockAttributes>() : nullptr;
  26. }
  27. void SetNextBlock(SmallNormalHeapBlockT * next) { Base::SetNextBlock(next); }
  28. void ScanInitialImplicitRoots(Recycler * recycler);
  29. void ScanNewImplicitRoots(Recycler * recycler);
  30. static uint CalculateMarkCountForPage(SmallHeapBlockBitVector* markBits, uint bucketIndex, uint pageStartBitIndex);
  31. static bool CanRescanFullBlock();
  32. static bool RescanObject(SmallNormalHeapBlockT<TBlockAttributes> * block, __in_ecount(localObjectSize) char * objectAddress, uint localObjectSize, uint objectIndex, Recycler * recycler);
  33. #if ENABLE_PARTIAL_GC || ENABLE_CONCURRENT_GC
  34. void FinishPartialCollect();
  35. #endif
  36. #ifdef RECYCLER_SLOW_CHECK_ENABLED
  37. virtual bool GetFreeObjectListOnAllocator(FreeObject ** freeObjectList) override;
  38. #endif
  39. virtual bool FindHeapObject(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject) override
  40. {
  41. return this->template FindHeapObjectImpl<SmallNormalHeapBlockT<TBlockAttributes>>(objectAddress, recycler, flags, heapObject);
  42. }
  43. protected:
  44. SmallNormalHeapBlockT(HeapBucket * bucket, ushort objectSize, ushort objectCount, HeapBlockType heapBlockType);
  45. private:
  46. SmallNormalHeapBlockT(HeapBucketT<SmallNormalHeapBlockT> * bucket, ushort objectSize, ushort objectCount);
  47. };
  48. #ifdef RECYCLER_WRITE_BARRIER
  49. template <class TBlockAttributes>
  50. class SmallNormalWithBarrierHeapBlockT : public SmallNormalHeapBlockT<TBlockAttributes>
  51. {
  52. typedef SmallNormalHeapBlockT<TBlockAttributes> Base;
  53. typedef typename Base::HeapBlockType HeapBlockType;
  54. friend class HeapBucketT<SmallNormalWithBarrierHeapBlockT>;
  55. public:
  56. typedef TBlockAttributes HeapBlockAttributes;
  57. static const ObjectInfoBits RequiredAttributes = WithBarrierBit;
  58. static SmallNormalWithBarrierHeapBlockT * New(HeapBucketT<SmallNormalWithBarrierHeapBlockT> * bucket);
  59. static void Delete(SmallNormalWithBarrierHeapBlockT * heapBlock);
  60. SmallNormalWithBarrierHeapBlockT * GetNextBlock() const
  61. {
  62. HeapBlock* block = SmallHeapBlockT<TBlockAttributes>::GetNextBlock();
  63. return block ? block->template AsNormalWriteBarrierBlock<TBlockAttributes>() : nullptr;
  64. }
  65. virtual bool FindHeapObject(void* objectAddress, Recycler * recycler, FindHeapObjectFlags flags, RecyclerHeapObjectInfo& heapObject) override sealed
  66. {
  67. return this->template FindHeapObjectImpl<SmallNormalWithBarrierHeapBlockT<TBlockAttributes>>(objectAddress, recycler, flags, heapObject);
  68. }
  69. protected:
  70. SmallNormalWithBarrierHeapBlockT(HeapBucket * bucket, ushort objectSize, ushort objectCount, HeapBlockType heapBlockType) :
  71. SmallNormalHeapBlockT<TBlockAttributes>(bucket, objectSize, objectCount, heapBlockType)
  72. {}
  73. };
  74. #endif
  75. typedef SmallNormalHeapBlockT<SmallAllocationBlockAttributes> SmallNormalHeapBlock;
  76. typedef SmallNormalHeapBlockT<MediumAllocationBlockAttributes> MediumNormalHeapBlock;
  77. #ifdef RECYCLER_WRITE_BARRIER
  78. typedef SmallNormalWithBarrierHeapBlockT<SmallAllocationBlockAttributes> SmallNormalWithBarrierHeapBlock;
  79. typedef SmallNormalWithBarrierHeapBlockT<MediumAllocationBlockAttributes> MediumNormalWithBarrierHeapBlock;
  80. #endif
  81. }