// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_INIT_ISOLATE_ALLOCATOR_H_ #define V8_INIT_ISOLATE_ALLOCATOR_H_ #include #include "src/base/page-allocator.h" #include "src/common/globals.h" #include "src/flags/flags.h" #include "src/utils/allocation.h" namespace v8 { namespace internal { // IsolateAllocator object is responsible for allocating memory for one (!) // Isolate object. Depending on the whether pointer compression is enabled, // the memory can be allocated // // 1) in the C++ heap (when pointer compression is disabled or when multiple // Isolates share a pointer compression cage) // // 2) in a proper part of a properly aligned region of a reserved address space // (when pointer compression is enabled and each Isolate has its own pointer // compression cage). // // Isolate::New() first creates IsolateAllocator object which allocates the // memory and then it constructs Isolate object in this memory. Once it's done // the Isolate object takes ownership of the IsolateAllocator object to keep // the memory alive. // Isolate::Delete() takes care of the proper order of the objects destruction. class V8_EXPORT_PRIVATE IsolateAllocator final { public: IsolateAllocator(); ~IsolateAllocator(); IsolateAllocator(const IsolateAllocator&) = delete; IsolateAllocator& operator=(const IsolateAllocator&) = delete; void* isolate_memory() const { return isolate_memory_; } v8::PageAllocator* page_allocator() const { return page_allocator_; } Address GetPtrComprCageBase() const { return COMPRESS_POINTERS_BOOL ? GetPtrComprCage()->base() : kNullAddress; } // When pointer compression is on, return the pointer compression // cage. Otherwise return nullptr. VirtualMemoryCage* GetPtrComprCage(); const VirtualMemoryCage* GetPtrComprCage() const; static void InitializeOncePerProcess(); private: void CommitPagesForIsolate(); friend class SequentialUnmapperTest; // Only used for testing. static void FreeProcessWidePtrComprCageForTesting(); // The allocated memory for Isolate instance. void* isolate_memory_ = nullptr; v8::PageAllocator* page_allocator_ = nullptr; #ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE VirtualMemoryCage isolate_ptr_compr_cage_; #endif }; } // namespace internal } // namespace v8 #endif // V8_INIT_ISOLATE_ALLOCATOR_H_