DelayFreeArrayBufferHelper.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. // ArrayBuffer is ref-counted. This helper file encapsulate classes to assist free-ing the buffer
  6. //----------------------------------------------------------------------------
  7. #pragma once
  8. namespace Js
  9. {
  10. class RefCountedBuffer;
  11. class ArrayBufferContentForDelayedFreeBase;
  12. class DelayedFreeArrayBuffer
  13. {
  14. public:
  15. DelayedFreeArrayBuffer()
  16. : listOfBuffers(&HeapAllocator::Instance)
  17. { }
  18. ~DelayedFreeArrayBuffer()
  19. {
  20. Assert(listOfBuffers.Count() == 0);
  21. }
  22. typedef SList<ArrayBufferContentForDelayedFreeBase*, HeapAllocator> DelayedFreeBufferType;
  23. bool HasAnyItem();
  24. // Scan the stack to match with current list of delayed free buffer. For those which are not found on the stack
  25. // will be released (ref-count decremented)
  26. void ScanStack(void ** stackTop, size_t byteCount, void ** registers, size_t registersByteCount);
  27. void ClearAll();
  28. void Push(ArrayBufferContentForDelayedFreeBase* item);
  29. private:
  30. // This array buffer will be added during Detach. They will be released (decrement ref-count)
  31. // a. when not found during stack scan
  32. // b. Or during callrootlevel == 0
  33. DelayedFreeBufferType listOfBuffers;
  34. void ResetToNoMarkObject();
  35. void ReleaseOnlyNonMarkedObject();
  36. void CheckAndMarkObject(void * candidate);
  37. };
  38. typedef void __cdecl FreeFunction(void* ptr);
  39. class ArrayBufferContentForDelayedFreeBase
  40. {
  41. RefCountedBuffer *buffer;
  42. uint32 bufferLength;
  43. Recycler * recycler;
  44. bool markBit; // This bit will be used when Recycler tries to determine to keep the object based on the object on the stack
  45. public:
  46. ArrayBufferContentForDelayedFreeBase(RefCountedBuffer *content, uint32 len, Recycler *r)
  47. : buffer(content), bufferLength(len), recycler(r), markBit(false)
  48. {}
  49. virtual ~ArrayBufferContentForDelayedFreeBase() { }
  50. virtual void Release();
  51. virtual bool IsAddressPartOfBuffer(void *obj);
  52. virtual bool IsEqual(RefCountedBuffer *buffer)
  53. {
  54. return this->buffer == buffer;
  55. }
  56. virtual void SetMarkBit(bool set)
  57. {
  58. markBit = set;
  59. }
  60. virtual bool IsMarked()
  61. {
  62. return markBit;
  63. }
  64. virtual void ClearSelfOnly()
  65. {
  66. Assert(false);
  67. }
  68. virtual void FreeTheBuffer(void *buffer)
  69. {
  70. Assert(false);
  71. }
  72. virtual RefCountedBuffer * GetRefCountedBuffer() { return buffer; }
  73. };
  74. template <typename FreeFN>
  75. class ArrayBufferContentForDelayedFree : public ArrayBufferContentForDelayedFreeBase
  76. {
  77. FreeFN* freeFunction;
  78. public:
  79. ArrayBufferContentForDelayedFree(RefCountedBuffer *content, uint32 len, Recycler *r, FreeFN * freeFunction)
  80. : ArrayBufferContentForDelayedFreeBase( content, len, r), freeFunction(freeFunction)
  81. {}
  82. virtual void FreeTheBuffer(void* buffer) override
  83. {
  84. freeFunction(buffer);
  85. }
  86. virtual void ClearSelfOnly() override
  87. {
  88. HeapDelete(this);
  89. }
  90. };
  91. }