aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-12-07 12:13:03 +0100
committerStefan Boberg <[email protected]>2023-12-07 12:13:03 +0100
commit7d18b385d2051eebecca401d9921344938398514 (patch)
tree67af7f82078affc53899a2635f668615fbe7c149 /src
parentClangFormat (diff)
downloadzen-7d18b385d2051eebecca401d9921344938398514.tar.xz
zen-7d18b385d2051eebecca401d9921344938398514.zip
implemented FlushDataOnly for MacOS
also added handling of NtFlushBuffersFileEx for certain SDK versions
Diffstat (limited to 'src')
-rw-r--r--src/zenutil/basicfile.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/zenutil/basicfile.cpp b/src/zenutil/basicfile.cpp
index 6e45575f6..df0704fa9 100644
--- a/src/zenutil/basicfile.cpp
+++ b/src/zenutil/basicfile.cpp
@@ -31,6 +31,9 @@ extern "C"
NTSTATUS NTAPI
NtFlushBuffersFileEx(HANDLE FileHandle, ULONG Flags, PVOID Parameters, ULONG ParametersSize, PIO_STATUS_BLOCK IoStatusBlock);
+
+ using Decl_NtFlushBuffersFileEx = decltype(NtFlushBuffersFileEx);
+ Decl_NtFlushBuffersFileEx* Real_NtFlushBuffersFileEx;
}
#else
# include <fcntl.h>
@@ -39,11 +42,33 @@ extern "C"
# include <unistd.h>
#endif
+#if ZEN_PLATFORM_MAC
+# include <fcntl.h>
+#endif
+
#include <fmt/format.h>
#include <gsl/gsl-lite.hpp>
namespace zen {
+NTSTATUS NTAPI
+NtFlushBuffersFileEx(HANDLE FileHandle, ULONG Flags, PVOID Parameters, ULONG ParametersSize, PIO_STATUS_BLOCK IoStatusBlock)
+{
+ if (!Real_NtFlushBuffersFileEx)
+ {
+ Real_NtFlushBuffersFileEx = (Decl_NtFlushBuffersFileEx*)GetProcAddress(GetModuleHandleA("kernelbase.dll"), "NtFlushBuffersFileEx");
+ }
+
+ if (Real_NtFlushBuffersFileEx)
+ {
+ return Real_NtFlushBuffersFileEx(FileHandle, Flags, Parameters, ParametersSize, IoStatusBlock);
+ }
+
+ return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////
+
BasicFile::~BasicFile()
{
Close();
@@ -371,12 +396,15 @@ BasicFile::FlushDataOnly()
{
#if ZEN_PLATFORM_WINDOWS
IO_STATUS_BLOCK Iosb{};
- NTSTATUS Status = NtFlushBuffersFileEx(m_FileHandle, FLUSH_FLAGS_FILE_DATA_ONLY, nullptr, 0, &Iosb);
+ NTSTATUS Status = zen::NtFlushBuffersFileEx(m_FileHandle, FLUSH_FLAGS_FILE_DATA_ONLY, nullptr, 0, &Iosb);
if (Status != STATUS_SUCCESS)
{
// warn?
}
+#elif ZEN_PLATFORM_MAC
+ int Fd = int(uintptr_t(m_FileHandle));
+ fcntl(Fd, F_FULLFSYNC);
#else
int Fd = int(uintptr_t(m_FileHandle));
fdatasync(Fd);