|  | // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | #ifndef RUNTIME_BIN_VIRTUAL_MEMORY_H_ | 
|  | #define RUNTIME_BIN_VIRTUAL_MEMORY_H_ | 
|  |  | 
|  | #include "platform/allocation.h" | 
|  | #include "platform/globals.h" | 
|  |  | 
|  | namespace dart { | 
|  | namespace bin { | 
|  |  | 
|  | class VirtualMemory { | 
|  | public: | 
|  | enum Protection { | 
|  | kNoAccess, | 
|  | kReadOnly, | 
|  | kReadWrite, | 
|  | kReadExecute, | 
|  | kReadWriteExecute | 
|  | }; | 
|  |  | 
|  | // The reserved memory is unmapped on destruction. | 
|  | ~VirtualMemory(); | 
|  |  | 
|  | void release() { | 
|  | address_ = nullptr; | 
|  | size_ = 0; | 
|  | } | 
|  |  | 
|  | uword start() const { return reinterpret_cast<uword>(address_); } | 
|  | uword end() const { return reinterpret_cast<uword>(address_) + size_; } | 
|  | void* address() const { return address_; } | 
|  | intptr_t size() const { return size_; } | 
|  |  | 
|  | // Changes the protection of the virtual memory area. | 
|  | static void Protect(void* address, intptr_t size, Protection mode); | 
|  | void Protect(Protection mode) { return Protect(address(), size(), mode); } | 
|  |  | 
|  | // Reserves and commits a virtual memory segment with size. If a segment of | 
|  | // the requested size cannot be allocated, nullptr is returned. | 
|  | static VirtualMemory* Allocate(intptr_t size, | 
|  | bool is_executable, | 
|  | const char* name); | 
|  |  | 
|  | static void Init() { page_size_ = CalculatePageSize(); } | 
|  |  | 
|  | // Returns the cached page size. Use only if Init() has been called. | 
|  | static intptr_t PageSize() { | 
|  | ASSERT(page_size_ != 0); | 
|  | return page_size_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | static intptr_t CalculatePageSize(); | 
|  |  | 
|  | // These constructors are only used internally when reserving new virtual | 
|  | // spaces. They do not reserve any virtual address space on their own. | 
|  | VirtualMemory(void* address, size_t size) : address_(address), size_(size) {} | 
|  |  | 
|  | void* address_; | 
|  | size_t size_; | 
|  |  | 
|  | static uword page_size_; | 
|  |  | 
|  | DISALLOW_IMPLICIT_CONSTRUCTORS(VirtualMemory); | 
|  | }; | 
|  |  | 
|  | }  // namespace bin | 
|  | }  // namespace dart | 
|  |  | 
|  | #endif  // RUNTIME_BIN_VIRTUAL_MEMORY_H_ |