File tree Expand file tree Collapse file tree 2 files changed +32
-3
lines changed
Expand file tree Collapse file tree 2 files changed +32
-3
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff line change @@ -540,7 +540,7 @@ TEST(file_test, line_buffering) {
540540
541541 reader.join ();
542542}
543- # endif // _WIN32
543+ # endif // _WIN32
544544
545545TEST (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
You can’t perform that action at this time.
0 commit comments