blob: 1489abb9dea13d0d20c1f76241f9289c38b343cb [file] [log] [blame]
// Copyright 2020 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_HEAP_CPPGC_VIRTUAL_MEMORY_H_
#define V8_HEAP_CPPGC_VIRTUAL_MEMORY_H_
#include <cstdint>
#include "include/cppgc/platform.h"
#include "src/base/macros.h"
namespace cppgc {
namespace internal {
// Represents and controls an area of reserved memory.
class V8_EXPORT_PRIVATE VirtualMemory {
public:
// Empty VirtualMemory object, controlling no reserved memory.
VirtualMemory() = default;
// Reserves virtual memory containing an area of the given size that is
// aligned per |alignment| rounded up to the |page_allocator|'s allocate page
// size. The |size| is aligned with |page_allocator|'s commit page size.
VirtualMemory(PageAllocator*, size_t size, size_t alignment,
void* hint = nullptr);
// Releases the reserved memory, if any, controlled by this VirtualMemory
// object.
~VirtualMemory() V8_NOEXCEPT;
VirtualMemory(VirtualMemory&&) V8_NOEXCEPT;
VirtualMemory& operator=(VirtualMemory&&) V8_NOEXCEPT;
// Returns whether the memory has been reserved.
bool IsReserved() const { return start_ != nullptr; }
void* address() const {
DCHECK(IsReserved());
return start_;
}
size_t size() const {
DCHECK(IsReserved());
return size_;
}
private:
// Resets to the default state.
void Reset();
PageAllocator* page_allocator_ = nullptr;
void* start_ = nullptr;
size_t size_ = 0;
};
} // namespace internal
} // namespace cppgc
#endif // V8_HEAP_CPPGC_VIRTUAL_MEMORY_H_