diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-04-05 18:05:56 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-04-05 18:05:56 +0200 |
commit | a2671839daddfaaec63f43132854c606c556558a (patch) | |
tree | cfe9997248e7ef40c9223243358642e5f602167a /deimos | |
parent | f46b019cb0a2f451234fdb4f20620b7e443da136 (diff) |
Add virtual memory API
Diffstat (limited to 'deimos')
-rw-r--r-- | deimos/core/os.h | 18 | ||||
-rw-r--r-- | deimos/core/os_win32.cpp | 36 |
2 files changed, 47 insertions, 7 deletions
diff --git a/deimos/core/os.h b/deimos/core/os.h index fa1762a..9aea509 100644 --- a/deimos/core/os.h +++ b/deimos/core/os.h @@ -36,13 +36,27 @@ public: virtual void* GetSymbol(OsDll*, gsl::czstring) = 0;
};
+class OsVirtualMemoryApi
+{
+public:
+ OsVirtualMemoryApi() = default;
+ deimos_NO_COPY_MOVE(OsVirtualMemoryApi);
+ virtual ~OsVirtualMemoryApi() = default;
+
+ virtual gsl::owner<void*> Map(int64_t size) = 0;
+ virtual void Unmap(gsl::owner<void*>) = 0;
+ virtual gsl::owner<void*> Reserve(int64_t size) = 0;
+ virtual void Commit(void* ptr, int64_t size) = 0;
+};
+
class OsApi
{
public:
static constexpr IdName kApiName{"deimos::OsApi"};
- OsConsoleApi* console{};
- OsDllApi* dll{};
+ OsConsoleApi* console{};
+ OsDllApi* dll{};
+ OsVirtualMemoryApi* virtual_memory{};
};
class OsConsoleWriter : public IWriter
diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp index 1c6b664..d848530 100644 --- a/deimos/core/os_win32.cpp +++ b/deimos/core/os_win32.cpp @@ -8,7 +8,7 @@ namespace deimos
{
-class Win32OsConsoleApiImpl : public OsConsoleApi
+class Win32ConsoleApiImpl : public OsConsoleApi
{
HANDLE m_stdout;
HANDLE m_stderr;
@@ -24,7 +24,7 @@ class Win32OsConsoleApiImpl : public OsConsoleApi }
public:
- Win32OsConsoleApiImpl() :
+ Win32ConsoleApiImpl() :
m_stdout{::GetStdHandle(STD_OUTPUT_HANDLE)},
m_stderr{::GetStdHandle(STD_ERROR_HANDLE)}
{}
@@ -35,7 +35,7 @@ public: }
};
-class Win32OsDllApiImpl : public OsDllApi
+class Win32DllApiImpl : public OsDllApi
{
public:
OsDll* Open(gsl::czstring name) override
@@ -49,16 +49,42 @@ public: }
};
+class Win32VirtualMemoryApiImpl : public OsVirtualMemoryApi
+{
+public:
+ gsl::owner<void*> Map(int64_t size) override
+ {
+ return ::VirtualAlloc(nullptr, (SIZE_T)size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+ }
+
+ void Unmap(gsl::owner<void*> ptr) override
+ {
+ ::VirtualFree(ptr, 0, MEM_RELEASE);
+ }
+
+ gsl::owner<void*> Reserve(int64_t size) override
+ {
+ return ::VirtualAlloc(nullptr, (SIZE_T)size, MEM_RESERVE, PAGE_READWRITE);
+ }
+
+ void Commit(void* ptr, int64_t size) override
+ {
+ ::VirtualAlloc(ptr, (SIZE_T)size, MEM_COMMIT, PAGE_READWRITE);
+ }
+};
+
class Win32OsApiImpl : public OsApi
{
- Win32OsConsoleApiImpl m_console_api;
- Win32OsDllApiImpl m_dll_api;
+ Win32ConsoleApiImpl m_console_api;
+ Win32DllApiImpl m_dll_api;
+ Win32VirtualMemoryApiImpl m_virtual_memory_api;
public:
Win32OsApiImpl()
{
console = &m_console_api;
dll = &m_dll_api;
+ virtual_memory = &m_virtual_memory_api;
}
};
|