diff options
| author | Stefan Boberg <[email protected]> | 2023-12-07 09:09:06 +0100 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2023-12-07 09:09:06 +0100 |
| commit | e2010b7c0d87ab40aa7216e1842a640007363c29 (patch) | |
| tree | 2df64d302f00532230b50e4d74bcb5d10bbb5f19 /src/zenutil | |
| parent | minor edits (diff) | |
| download | zen-e2010b7c0d87ab40aa7216e1842a640007363c29.tar.xz zen-e2010b7c0d87ab40aa7216e1842a640007363c29.zip | |
added BasicFile::FlushDataOnly
Diffstat (limited to 'src/zenutil')
| -rw-r--r-- | src/zenutil/basicfile.cpp | 38 | ||||
| -rw-r--r-- | src/zenutil/include/zenutil/basicfile.h | 1 |
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); |