diff options
| -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. | 
