Skip to content

Commit 5199e0f

Browse files
committed
Fix a flush issue on libstdc++
1 parent 2f58430 commit 5199e0f

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

include/fmt/format-inl.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,9 +1526,8 @@ template <typename F> class glibc_file : public file_base<F> {
15261526
}
15271527

15281528
void init_buffer() {
1529-
if (this->file_->_IO_write_ptr) return;
1529+
if (this->file_->_IO_write_ptr < this->file_->_IO_write_end) return;
15301530
// Force buffer initialization by placing and removing a char in a buffer.
1531-
assume(this->file_->_IO_write_ptr >= this->file_->_IO_write_end);
15321531
putc_unlocked(0, this->file_);
15331532
--this->file_->_IO_write_ptr;
15341533
}

test/os-test.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ TEST(file_test, line_buffering) {
540540

541541
reader.join();
542542
}
543-
# endif // _WIN32
543+
# endif // _WIN32
544544

545545
TEST(file_test, buffer_boundary) {
546546
auto pipe = fmt::pipe();
@@ -559,4 +559,34 @@ TEST(file_test, buffer_boundary) {
559559
EXPECT_STREQ(fgets(buf, sizeof(buf), read_end.get()), "1234 567");
560560
}
561561

562+
TEST(file_test, io_putting) {
563+
auto pipe = fmt::pipe();
564+
auto read_end = pipe.read_end.fdopen("r");
565+
auto write_end = pipe.write_end.fdopen("w");
566+
567+
size_t read_size = 0;
568+
auto reader = std::thread([&]() {
569+
size_t n = 0;
570+
do {
571+
char buf[4096] = {};
572+
n = fread(buf, 1, sizeof(buf), read_end.get());
573+
read_size += n;
574+
} while (n != 0);
575+
});
576+
577+
// This initialize buffers but doesn't set _IO_CURRENTLY_PUTTING.
578+
fseek(write_end.get(), 0, SEEK_SET);
579+
580+
size_t write_size = 0;
581+
for (int i = 0; i <= 20000; ++i) {
582+
auto s = fmt::format("{}\n", i);
583+
fmt::print(write_end.get(), "{}", s);
584+
write_size += s.size();
585+
}
586+
587+
write_end.close();
588+
reader.join();
589+
EXPECT_EQ(read_size, write_size);
590+
}
591+
562592
#endif // FMT_USE_FCNTL

0 commit comments

Comments
 (0)