diff options
| author | Stefan Boberg <[email protected]> | 2022-06-03 10:08:22 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2022-06-03 10:08:22 +0200 |
| commit | 91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b (patch) | |
| tree | 2bf98fe4a1dfa20bace298d0f51b1a2d8b9a7217 /zencore | |
| parent | Merge branch 'main' into use-catch2 (diff) | |
| parent | move release job to in-house linux agent (diff) | |
| download | zen-91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b.tar.xz zen-91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b.zip | |
merge from main
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/include/zencore/iobuffer.h | 1 | ||||
| -rw-r--r-- | zencore/iobuffer.cpp | 30 |
2 files changed, 27 insertions, 4 deletions
diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h index 5d9daa1c7..bf658922d 100644 --- a/zencore/include/zencore/iobuffer.h +++ b/zencore/include/zencore/iobuffer.h @@ -403,6 +403,7 @@ class IoBufferBuilder { public: ZENCORE_API static IoBuffer MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset = 0, uint64_t Size = ~0ull); + ZENCORE_API static IoBuffer MakeFromFileWithSharedDelete(const std::filesystem::path& FileName); ZENCORE_API static IoBuffer MakeFromTemporaryFile(const std::filesystem::path& FileName); ZENCORE_API static IoBuffer MakeFromFileHandle(void* FileHandle, uint64_t Offset = 0, uint64_t Size = ~0ull); ZENCORE_API static IoBuffer ReadFromFileMaybe(IoBuffer& InBuffer); diff --git a/zencore/iobuffer.cpp b/zencore/iobuffer.cpp index c4b7f7bdf..56b05d86d 100644 --- a/zencore/iobuffer.cpp +++ b/zencore/iobuffer.cpp @@ -469,15 +469,20 @@ IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t return IoBuffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size); } -IoBuffer -IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size) +static IoBuffer +MakeFromFileWithOptions(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size, bool UseShareDelete) { uint64_t FileSize; #if ZEN_PLATFORM_WINDOWS CAtlFile DataFile; - HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING); + DWORD ShareOptions = FILE_SHARE_READ; + if (UseShareDelete) + { + ShareOptions |= FILE_SHARE_DELETE; + } + HRESULT hRes = DataFile.Create(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ | ShareOptions, OPEN_EXISTING); if (FAILED(hRes)) { @@ -486,7 +491,12 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of DataFile.GetSize((ULONGLONG&)FileSize); #else - int Fd = open(FileName.c_str(), O_RDONLY); + int Flags = O_RDONLY; + if (UseShareDelete) + { + Flags |= O_CLOEXEC; + } + int Fd = open(FileName.c_str(), Flags); if (Fd < 0) { return {}; @@ -530,6 +540,18 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of } IoBuffer +IoBufferBuilder::MakeFromFileWithSharedDelete(const std::filesystem::path& FileName) +{ + return MakeFromFileWithOptions(FileName, 0, ~0ull, true); +} + +IoBuffer +IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size) +{ + return MakeFromFileWithOptions(FileName, Offset, Size, false); +} + +IoBuffer IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName) { uint64_t FileSize; |