diff options
author | bunnei <bunneidev@gmail.com> | 2020-04-08 17:35:07 -0400 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2020-04-17 00:59:31 -0400 |
commit | 4ba2428c86d95fdfe9c580dd62e4a94309a4661c (patch) | |
tree | 6f69c0be2baa02bd6d298a4c3dd6ee23cf21b41e /src/common/virtual_buffer.cpp | |
parent | a238d08f71082ae7b4d53f78a30383cf4669583f (diff) |
common: Add VirtualBuffer class, to abstract memory virtualization.
Diffstat (limited to 'src/common/virtual_buffer.cpp')
-rw-r--r-- | src/common/virtual_buffer.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp new file mode 100644 index 0000000000..b426f47477 --- /dev/null +++ b/src/common/virtual_buffer.cpp @@ -0,0 +1,52 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#ifdef _WIN32 +#include <windows.h> +#else +#include <stdio.h> +#include <sys/mman.h> +#include <sys/types.h> +#if defined __APPLE__ || defined __FreeBSD__ || defined __OpenBSD__ +#include <sys/sysctl.h> +#elif defined __HAIKU__ +#include <OS.h> +#else +#include <sys/sysinfo.h> +#endif +#endif + +#include "common/assert.h" +#include "common/virtual_buffer.h" + +namespace Common { + +void* AllocateMemoryPages(std::size_t size) { +#ifdef _WIN32 + void* base{VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE)}; +#else + void* base{mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0)}; + + if (base == MAP_FAILED) { + base = nullptr; + } +#endif + + ASSERT(base); + + return base; +} + +void FreeMemoryPages(void* base, std::size_t size) { + if (!base) { + return; + } +#ifdef _WIN32 + ASSERT(VirtualFree(base, 0, MEM_RELEASE)); +#else + ASSERT(munmap(base, size) == 0); +#endif +} + +} // namespace Common |