blob: 2bf739ec4981eb8e13a3673227a0d39d8b5aed10 [file] [log] [blame]
// 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 <memory>
#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_