|
|
|
@ -249,9 +249,9 @@ FileType IOFile::GetType() const { |
|
|
|
return file_type; |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef __unix__
|
|
|
|
int PlatformMapReadOnly(IOFile& io, const char* path) { |
|
|
|
io.mmap_fd = open(path., O_RDONLY); |
|
|
|
#if defined(__unix__)
|
|
|
|
static int PlatformMapReadOnly(IOFile& io, const char* path) { |
|
|
|
io.mmap_fd = open(path, O_RDONLY); |
|
|
|
if (io.mmap_fd > 0) { |
|
|
|
struct stat st; |
|
|
|
fstat(io.mmap_fd, &st); |
|
|
|
@ -294,28 +294,30 @@ int PlatformMapReadOnly(IOFile& io, const char* path) { |
|
|
|
close(io.mmap_fd); |
|
|
|
io.mmap_fd = -1; |
|
|
|
} else { |
|
|
|
posix_madvise(mmap_base, io.mmap_size, POSIX_MADV_WILLNEED); |
|
|
|
posix_madvise(io.mmap_base, io.mmap_size, POSIX_MADV_WILLNEED); |
|
|
|
} |
|
|
|
} |
|
|
|
return io.mmap_fd; |
|
|
|
} |
|
|
|
void PlatformUnmap(IOFile& io) { |
|
|
|
static void PlatformUnmap(IOFile& io) { |
|
|
|
if (io.mmap_fd != -1) { |
|
|
|
munmap(io.mmap_base, io.mmap_size); |
|
|
|
close(io.mmap_fd); |
|
|
|
io.mmap_fd = -1; |
|
|
|
} |
|
|
|
} |
|
|
|
#elif defined(__APPLE__)
|
|
|
|
// NO IMPLEMENTATION YET
|
|
|
|
#else
|
|
|
|
int PlatformMapReadOnly(IOFile& io, const char* path) { |
|
|
|
io.file_handle = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, nullptr); |
|
|
|
static int PlatformMapReadOnly(IOFile& io, const wchar_t* path) { |
|
|
|
io.file_handle = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, nullptr); |
|
|
|
if (HANDLE(io.file_handle) != INVALID_HANDLE_VALUE) { |
|
|
|
io.mapping_handle = CreateFileMappingW(file_handle, nullptr, PAGE_READONLY, 0, 0, nullptr); |
|
|
|
io.mapping_handle = CreateFileMappingW(HANDLE(io.file_handle), nullptr, PAGE_READONLY, 0, 0, nullptr); |
|
|
|
if (io.mapping_handle) { |
|
|
|
io.mmap_base = (char const*)MapViewOfFile(HANDLE(io.mapping_handle), FILE_MAP_READ, 0, 0, 0); |
|
|
|
io.mmap_base = (u8*)MapViewOfFile(HANDLE(io.mapping_handle), FILE_MAP_READ, 0, 0, 0); |
|
|
|
if (io.mmap_base) { |
|
|
|
_LARGE_INTEGER pvalue; |
|
|
|
GetFileSizeEx(file_handle, &pvalue); |
|
|
|
GetFileSizeEx(io.file_handle, &pvalue); |
|
|
|
io.mmap_size = uint32_t(pvalue.QuadPart); |
|
|
|
} else { |
|
|
|
CloseHandle(io.mapping_handle); |
|
|
|
@ -329,7 +331,7 @@ int PlatformMapReadOnly(IOFile& io, const char* path) { |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
void PlatformUnmap(IOFile& io) { |
|
|
|
static void PlatformUnmap(IOFile& io) { |
|
|
|
if(io.mapping_handle) { |
|
|
|
if(io.mmap_base) |
|
|
|
UnmapViewOfFile(HANDLE(io.mmap_base)); |
|
|
|
@ -347,10 +349,19 @@ void IOFile::Open(const fs::path& path, FileAccessMode mode, FileType type, File |
|
|
|
file_type = type; |
|
|
|
errno = 0; |
|
|
|
#ifdef _WIN32
|
|
|
|
if (flag != FileShareFlag::ShareNone) { |
|
|
|
file = _wfsopen(path.c_str(), AccessModeToWStr(mode, type), ToWindowsFileShareFlag(flag)); |
|
|
|
} else { |
|
|
|
_wfopen_s(&file, path.c_str(), AccessModeToWStr(mode, type)); |
|
|
|
// TODO: this probably can use better logic but oh well I'm not a windowser
|
|
|
|
file_handle = nullptr; |
|
|
|
if (type == FileType::BinaryFile && mode == FileAccessMode::Read) { |
|
|
|
if (PlatformMapReadOnly(*this, path.c_str()) == -1) { |
|
|
|
LOG_ERROR(Common_Filesystem, "Error mmap'ing file"); //: {}", path.c_str());
|
|
|
|
} |
|
|
|
} |
|
|
|
if (file_handle == nullptr) { |
|
|
|
if (flag != FileShareFlag::ShareNone) { |
|
|
|
file = _wfsopen(path.c_str(), AccessModeToWStr(mode, type), ToWindowsFileShareFlag(flag)); |
|
|
|
} else { |
|
|
|
_wfopen_s(&file, path.c_str(), AccessModeToWStr(mode, type)); |
|
|
|
} |
|
|
|
} |
|
|
|
#elif ANDROID
|
|
|
|
if (Android::IsContentUri(path)) { |
|
|
|
|