mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 10:49:00 +00:00
b68351fbc3
TEST=build Change-Id: Ie3be570c274b0275a995a0f54b5e6ccdfc77ccd3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/292287 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Brian Quinlan <bquinlan@google.com>
73 lines
2.1 KiB
C++
73 lines
2.1 KiB
C++
// 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_
|