summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrChat <arkolbed@gmail.com>2017-12-19 19:25:58 -0600
committerDrChat <arkolbed@gmail.com>2017-12-19 19:26:26 -0600
commitcd2e07f680d06425b73d8ecb1476adba97ceadaf (patch)
treed0d3ffbea98482c009a5d4cbc152c01643e09419
parent0efb08ad7462c09b7002e5571b058cb5f757d580 (diff)
[Base] First-pass memory file mapping support
-rw-r--r--src/xenia/base/memory_posix.cc36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/xenia/base/memory_posix.cc b/src/xenia/base/memory_posix.cc
index ea97ff900..085d5b2ff 100644
--- a/src/xenia/base/memory_posix.cc
+++ b/src/xenia/base/memory_posix.cc
@@ -8,7 +8,9 @@
*/
#include "xenia/base/memory.h"
+#include "xenia/base/string.h"
+#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
@@ -61,19 +63,45 @@ bool QueryProtect(void* base_address, size_t& length, PageAccess& access_out) {
FileMappingHandle CreateFileMappingHandle(std::wstring path, size_t length,
PageAccess access, bool commit) {
- return nullptr;
+ int oflag;
+ switch (access) {
+ case PageAccess::kNoAccess:
+ oflag = 0;
+ break;
+ case PageAccess::kReadOnly:
+ oflag = O_RDONLY;
+ break;
+ case PageAccess::kReadWrite:
+ oflag = O_RDWR;
+ break;
+ default:
+ assert_always();
+ return nullptr;
+ }
+
+ oflag |= O_CREAT;
+ int ret = shm_open(xe::to_string(path).c_str(), oflag, 0777);
+ if (ret > 0) {
+ ftruncate64(ret, length);
+ }
+
+ return ret <= 0 ? nullptr : reinterpret_cast<FileMappingHandle>(ret);
}
-void CloseFileMappingHandle(FileMappingHandle handle) {}
+void CloseFileMappingHandle(FileMappingHandle handle) {
+ close((intptr_t)handle);
+}
void* MapFileView(FileMappingHandle handle, void* base_address, size_t length,
PageAccess access, size_t file_offset) {
- return nullptr;
+ uint32_t prot = ToPosixProtectFlags(access);
+ return mmap64(base_address, length, prot, MAP_PRIVATE | MAP_ANONYMOUS,
+ reinterpret_cast<intptr_t>(handle), file_offset);
}
bool UnmapFileView(FileMappingHandle handle, void* base_address,
size_t length) {
- return false;
+ return munmap(base_address, length) == 0;
}
} // namespace memory