aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-12-07 09:09:06 +0100
committerStefan Boberg <[email protected]>2023-12-07 09:09:06 +0100
commite2010b7c0d87ab40aa7216e1842a640007363c29 (patch)
tree2df64d302f00532230b50e4d74bcb5d10bbb5f19 /src/zenutil
parentminor edits (diff)
downloadzen-e2010b7c0d87ab40aa7216e1842a640007363c29.tar.xz
zen-e2010b7c0d87ab40aa7216e1842a640007363c29.zip
added BasicFile::FlushDataOnly
Diffstat (limited to 'src/zenutil')
-rw-r--r--src/zenutil/basicfile.cpp38
-rw-r--r--src/zenutil/include/zenutil/basicfile.h1
2 files changed, 39 insertions, 0 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp
index 7d0edaa5d..7f1712d2b 100644
--- a/src/zenutil/basicfile.cpp
+++ b/src/zenutil/basicfile.cpp
@@ -11,6 +11,27 @@
#if ZEN_PLATFORM_WINDOWS
# include <zencore/windows.h>
+extern "C"
+{
+# define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
+# define NTAPI __stdcall
+
+ typedef DWORD NTSTATUS;
+
+ typedef struct _IO_STATUS_BLOCK
+ {
+ union
+ {
+ NTSTATUS Status;
+ PVOID Pointer;
+ } DUMMYUNIONNAME;
+
+ ULONG_PTR Information;
+ } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+ NTSTATUS NTAPI
+ NtFlushBuffersFileEx(HANDLE FileHandle, ULONG Flags, PVOID Parameters, ULONG ParametersSize, PIO_STATUS_BLOCK IoStatusBlock);
+}
#else
# include <fcntl.h>
# include <sys/file.h>
@@ -345,6 +366,23 @@ BasicFile::Flush()
#endif
}
+void
+BasicFile::FlushDataOnly()
+{
+#if ZEN_PLATFORM_WINDOWS
+ IO_STATUS_BLOCK Iosb{};
+ NTSTATUS Status = NtFlushBuffersFileEx(m_FileHandle, FLUSH_FLAGS_FILE_DATA_ONLY, nullptr, 0, &Iosb);
+
+ if (Status != STATUS_SUCCESS)
+ {
+ // warn?
+ }
+#else
+ int Fd = int(uintptr_t(m_FileHandle));
+ fdatasync(Fd);
+#endif
+}
+
uint64_t
BasicFile::FileSize()
{
diff --git a/src/zenutil/include/zenutil/basicfile.h b/src/zenutil/include/zenutil/basicfile.h
index f25d9f23c..42cea904a 100644
--- a/src/zenutil/include/zenutil/basicfile.h
+++ b/src/zenutil/include/zenutil/basicfile.h
@@ -60,6 +60,7 @@ public:
void Write(const void* Data, uint64_t Size, uint64_t FileOffset);
void Write(const void* Data, uint64_t Size, uint64_t FileOffset, std::error_code& Ec);
void Flush();
+ void FlushDataOnly();
[[nodiscard]] uint64_t FileSize();
[[nodiscard]] uint64_t FileSize(std::error_code& Ec);
void SetFileSize(uint64_t FileSize);