TempArenaAllocatorObject.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. #include "RuntimeBasePch.h"
  6. namespace Js
  7. {
  8. template <bool isGuestArena>
  9. TempArenaAllocatorWrapper<isGuestArena>* TempArenaAllocatorWrapper<isGuestArena>::Create(ThreadContext * threadContext)
  10. {
  11. Recycler * recycler = threadContext->GetRecycler();
  12. TempArenaAllocatorWrapper<isGuestArena> * wrapper = RecyclerNewFinalizedLeaf(recycler, Js::TempArenaAllocatorWrapper<isGuestArena>,
  13. _u("temp"), threadContext->GetPageAllocator(), Js::Throw::OutOfMemory);
  14. if (isGuestArena)
  15. {
  16. wrapper->recycler = recycler;
  17. wrapper->AdviseInUse();
  18. }
  19. return wrapper;
  20. }
  21. template <bool isGuestArena>
  22. TempArenaAllocatorWrapper<isGuestArena>::TempArenaAllocatorWrapper(__in LPCWSTR name, PageAllocator * pageAllocator, void (*outOfMemoryFunc)()) :
  23. allocator(name, pageAllocator, outOfMemoryFunc), recycler(nullptr), externalGuestArenaRef(nullptr)
  24. {
  25. }
  26. template <bool isGuestArena>
  27. void TempArenaAllocatorWrapper<isGuestArena>::Dispose(bool isShutdown)
  28. {
  29. allocator.Clear();
  30. if (isGuestArena && externalGuestArenaRef != nullptr)
  31. {
  32. this->recycler->UnregisterExternalGuestArena(externalGuestArenaRef);
  33. externalGuestArenaRef = nullptr;
  34. }
  35. Assert(allocator.AllocatedSize() == 0);
  36. }
  37. template <bool isGuestArena>
  38. void TempArenaAllocatorWrapper<isGuestArena>::AdviseInUse()
  39. {
  40. if (isGuestArena)
  41. {
  42. if (externalGuestArenaRef == nullptr)
  43. {
  44. externalGuestArenaRef = this->recycler->RegisterExternalGuestArena(this->GetAllocator());
  45. if (externalGuestArenaRef == nullptr)
  46. {
  47. Js::Throw::OutOfMemory();
  48. }
  49. }
  50. }
  51. }
  52. template <bool isGuestArena>
  53. void TempArenaAllocatorWrapper<isGuestArena>::AdviseNotInUse()
  54. {
  55. this->allocator.Reset();
  56. if (isGuestArena)
  57. {
  58. Assert(externalGuestArenaRef != nullptr);
  59. this->recycler->UnregisterExternalGuestArena(externalGuestArenaRef);
  60. externalGuestArenaRef = nullptr;
  61. }
  62. }
  63. // Explicit instantiation
  64. template class TempArenaAllocatorWrapper<true>;
  65. template class TempArenaAllocatorWrapper<false>;
  66. } // namespace Js