diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-07-05 18:32:14 +0200 |
---|---|---|
committer | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-07-06 11:59:47 +0200 |
commit | 14ab50defb2c6b06aec9a1401154fc57e662fc9d (patch) | |
tree | 8fd09e89becca011840721de00e385318d597d96 /src/common/fs | |
parent | common: fs: file: Flush the file in GetSize (diff) | |
download | yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar.gz yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar.bz2 yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar.lz yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar.xz yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.tar.zst yuzu-14ab50defb2c6b06aec9a1401154fc57e662fc9d.zip |
Diffstat (limited to 'src/common/fs')
-rw-r--r-- | src/common/fs/file.cpp | 26 | ||||
-rw-r--r-- | src/common/fs/file.h | 11 |
2 files changed, 34 insertions, 3 deletions
diff --git a/src/common/fs/file.cpp b/src/common/fs/file.cpp index 022780e4e..274f57659 100644 --- a/src/common/fs/file.cpp +++ b/src/common/fs/file.cpp @@ -306,9 +306,9 @@ bool IOFile::Flush() const { errno = 0; #ifdef _WIN32 - const auto flush_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0; + const auto flush_result = std::fflush(file) == 0; #else - const auto flush_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0; + const auto flush_result = std::fflush(file) == 0; #endif if (!flush_result) { @@ -320,6 +320,28 @@ bool IOFile::Flush() const { return flush_result; } +bool IOFile::Commit() const { + if (!IsOpen()) { + return false; + } + + errno = 0; + +#ifdef _WIN32 + const auto commit_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0; +#else + const auto commit_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0; +#endif + + if (!commit_result) { + const auto ec = std::error_code{errno, std::generic_category()}; + LOG_ERROR(Common_Filesystem, "Failed to commit the file at path={}, ec_message={}", + PathToUTF8String(file_path), ec.message()); + } + + return commit_result; +} + bool IOFile::SetSize(u64 size) const { if (!IsOpen()) { return false; diff --git a/src/common/fs/file.h b/src/common/fs/file.h index 588fe619d..2c4ab4332 100644 --- a/src/common/fs/file.h +++ b/src/common/fs/file.h @@ -396,13 +396,22 @@ public: [[nodiscard]] size_t WriteString(std::span<const char> string) const; /** - * Attempts to flush any unwritten buffered data into the file and flush the file into the disk. + * Attempts to flush any unwritten buffered data into the file. * * @returns True if the flush was successful, false otherwise. */ bool Flush() const; /** + * Attempts to commit the file into the disk. + * Note that this is an expensive operation as this forces the operating system to write + * the contents of the file associated with the file descriptor into the disk. + * + * @returns True if the commit was successful, false otherwise. + */ + bool Commit() const; + + /** * Resizes the file to a given size. * If the file is resized to a smaller size, the remainder of the file is discarded. * If the file is resized to a larger size, the new area appears as if zero-filled. |