From 25cc02431b61097b2adfc2fbc493b648b0300c3b Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Mon, 10 Mar 2025 11:05:40 -0400 Subject: [SharedCache] Refactor Shared Cache In absence of a better name, this commit refactors the shared cache code. --- view/sharedcache/core/MappedFile.h | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 view/sharedcache/core/MappedFile.h (limited to 'view/sharedcache/core/MappedFile.h') diff --git a/view/sharedcache/core/MappedFile.h b/view/sharedcache/core/MappedFile.h new file mode 100644 index 00000000..ced79f52 --- /dev/null +++ b/view/sharedcache/core/MappedFile.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include +#include +#include + +// Call this when initializing the plugin so that the process file descriptor limit is raised. +uint64_t AdjustFileDescriptorLimit(); + +enum MapStatus : int +{ + Success, + // TODO: Split this error out into more contextual errors. + Error, +}; + +struct MappedFile +{ + uint8_t* _mmap = nullptr; + size_t len = 0; + +#ifdef _MSC_VER + HANDLE hFile = INVALID_HANDLE_VALUE; +#else + FILE* fd = nullptr; +#endif + + MappedFile() = default; + + ~MappedFile(); + + MappedFile(const MappedFile&) = delete; + + MappedFile& operator=(const MappedFile&) = delete; + + MappedFile(MappedFile&& other) noexcept : _mmap(other._mmap), len(other.len) + { +#ifdef _MSC_VER + hFile = other.hFile; + // Don't close the hFile in the move. + other.hFile = nullptr; +#else + fd = other.fd; + // Don't close the fd in the move. + other.fd = nullptr; +#endif + other._mmap = nullptr; + } + + // I hate C++ + MappedFile& operator=(MappedFile&& other) noexcept + { + if (this != &other) + { + Unmap(); +#ifdef _MSC_VER + if (hFile != nullptr) + { + CloseHandle(hFile); + } + hFile = other.hFile; + // Don't close the hFile in the move. + other.hFile = nullptr; +#else + if (fd != nullptr) + { + fclose(fd); + } + fd = other.fd; + // Don't close the fd in the move. + other.fd = nullptr; +#endif + len = other.len; + _mmap = other._mmap; + other._mmap = nullptr; + } + return *this; + } + + static std::optional OpenFile(const std::string& path); + + MapStatus Map(); + + MapStatus Unmap(); +}; -- cgit v1.3.1