aboutsummaryrefslogtreecommitdiff
path: root/zencore
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2022-06-03 10:08:22 +0200
committerStefan Boberg <[email protected]>2022-06-03 10:08:22 +0200
commit91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b (patch)
tree2bf98fe4a1dfa20bace298d0f51b1a2d8b9a7217 /zencore
parentMerge branch 'main' into use-catch2 (diff)
parentmove release job to in-house linux agent (diff)
downloadzen-91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b.tar.xz
zen-91e2573a1fdebc1c3cbbbc5d5f9be3b6f540463b.zip
merge from main
Diffstat (limited to 'zencore')
-rw-r--r--zencore/include/zencore/iobuffer.h1
-rw-r--r--zencore/iobuffer.cpp30
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;