diff --git a/include/cinatra/coro_io/coro_file.hpp b/include/cinatra/coro_io/coro_file.hpp index bc99134a..a6cd3cde 100644 --- a/include/cinatra/coro_io/coro_file.hpp +++ b/include/cinatra/coro_io/coro_file.hpp @@ -96,11 +96,16 @@ class coro_file { } #endif - bool is_open() { + bool is_open() { return stream_file_ && stream_file_->is_open(); } + + void flush() { #if defined(ENABLE_FILE_IO_URING) - return stream_file_ && stream_file_->is_open(); + #else - return stream_file_ && stream_file_->is_open(); + if (stream_file_) { + stream_file_->flush(); + stream_file_->sync(); + } #endif } @@ -215,7 +220,6 @@ class coro_file { promise.setValue(std::make_error_code(std::errc::io_error)); } }); - co_return co_await promise.getFuture(); } @@ -234,7 +238,6 @@ class coro_file { async_simple::coro::Lazy async_write_impl(const char* data, size_t size) { stream_file_->write(data, size); - stream_file_->flush(); co_return std::error_code{}; } #endif @@ -250,4 +253,4 @@ class coro_file { std::atomic eof_ = false; }; -} // namespace coro_io \ No newline at end of file +} // namespace coro_io diff --git a/tests/test_corofile.cpp b/tests/test_corofile.cpp index fc3ab63d..a1650f7d 100644 --- a/tests/test_corofile.cpp +++ b/tests/test_corofile.cpp @@ -434,6 +434,8 @@ TEST_CASE("small_file_write_test") { std::cout << ec.message() << "\n"; } + file.flush(); + std::ifstream is(filename, std::ios::binary); if (!is.is_open()) { std::cout << "Failed to open file: " << filename << "\n"; @@ -456,6 +458,7 @@ TEST_CASE("small_file_write_test") { if (ec) { std::cout << ec.message() << "\n"; } + file.flush(); is.open(filename, std::ios::binary); if (!is.is_open()) { std::cout << "Failed to open file: " << filename << "\n"; @@ -507,6 +510,7 @@ TEST_CASE("large_file_write_test") { std::cout << ec.message() << "\n"; } } + file.flush(); CHECK(fs::file_size(filename) == file_size); std::ifstream is(filename, std::ios::binary); if (!is.is_open()) { @@ -551,7 +555,7 @@ TEST_CASE("empty_file_write_test") { if (ec) { std::cout << ec.message() << "\n"; } - + file.flush(); std::ifstream is(filename, std::ios::binary); if (!is.is_open()) { std::cout << "Failed to open file: " << filename << "\n"; @@ -586,6 +590,7 @@ TEST_CASE("small_file_write_with_pool_test") { if (ec) { std::cout << ec.message() << "\n"; } + file.flush(); std::ifstream is(filename, std::ios::binary); if (!is.is_open()) { @@ -609,6 +614,7 @@ TEST_CASE("small_file_write_with_pool_test") { if (ec) { std::cout << ec.message() << "\n"; } + file.flush(); is.open(filename, std::ios::binary); if (!is.is_open()) { std::cout << "Failed to open file: " << filename << "\n"; @@ -659,7 +665,9 @@ TEST_CASE("large_file_write_with_pool_test") { std::cout << ec.message() << "\n"; } } - CHECK(fs::file_size(filename) == file_size); + file.flush(); + size_t sz = fs::file_size(filename); + CHECK(sz == file_size); std::ifstream is(filename, std::ios::binary); if (!is.is_open()) { std::cout << "Failed to open file: " << filename << "\n";