From f137ff1ff5d80bac2f36645144986c792d12db2f Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 8 Nov 2004 00:41:15 +0000 Subject: [PATCH] re PR libstdc++/17215 ([3.4 only] __basic_file::close ignores errors) 2004-11-07 Paolo Carlini Andrea Arcangeli * config/io/basic_file_stdio.cc (__basic_file<>::close)): Don't call unnecessarily sync, that is fflush: the library, since 3.4.0 does not use buffered fread/fwrite. * include/bits/fstream.tcc (basic_filebuf<>::overflow): Likewise. 2004-11-07 Paolo Carlini Kenneth C. Schalk PR libstdc++/17215 * config/io/basic_file_stdio.cc (__basic_file::close()): Check the return value of fclose/sync, loop on EINTR. (__basic_file::sys_open): Likewise, for sync. Co-Authored-By: Andrea Arcangeli Co-Authored-By: Kenneth C. Schalk From-SVN: r90251 --- libstdc++-v3/ChangeLog | 16 +++++++++++ libstdc++-v3/config/io/basic_file_stdio.cc | 32 ++++++++++++++++------ libstdc++-v3/include/bits/fstream.tcc | 4 +-- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6e4ddc090ce4..466b7b7bd34c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,19 @@ +2004-11-07 Paolo Carlini + Andrea Arcangeli + + * config/io/basic_file_stdio.cc (__basic_file<>::close)): Don't + call unnecessarily sync, that is fflush: the library, since 3.4.0 + does not use buffered fread/fwrite. + * include/bits/fstream.tcc (basic_filebuf<>::overflow): Likewise. + +2004-11-07 Paolo Carlini + Kenneth C. Schalk + + PR libstdc++/17215 + * config/io/basic_file_stdio.cc (__basic_file::close()): + Check the return value of fclose/sync, loop on EINTR. + (__basic_file::sys_open): Likewise, for sync. + 2004-11-04 Release Manager * GCC 3.4.3 released. diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index a3ed8391bfff..0a4e154ebbc9 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -189,10 +189,17 @@ namespace std __basic_file* __ret = NULL; if (!this->is_open() && __file) { - _M_cfile = __file; - _M_cfile_created = false; - this->sync(); - __ret = this; + int __err; + errno = 0; + do + __err = this->sync(); + while (__err && errno == EINTR); + if (!__err) + { + _M_cfile = __file; + _M_cfile_created = false; + __ret = this; + } } return __ret; } @@ -252,12 +259,21 @@ namespace std __basic_file* __ret = static_cast<__basic_file*>(NULL); if (this->is_open()) { + int __err = 0; if (_M_cfile_created) - fclose(_M_cfile); - else - this->sync(); + { + // In general, no need to zero errno in advance if checking + // for error first. However, C89/C99 (at variance with IEEE + // 1003.1, f.i.) do not mandate that fclose must set errno + // upon error. + errno = 0; + do + __err = fclose(_M_cfile); + while (__err && errno == EINTR); + } _M_cfile = 0; - __ret = this; + if (!__err) + __ret = this; } return __ret; } diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index a1ed485783ef..25a4d48cb720 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -396,8 +396,7 @@ namespace std // Convert pending sequence to external representation, // and output. if (_M_convert_to_external(this->pbase(), - this->pptr() - this->pbase()) - && (!__testeof || !_M_file.sync())) + this->pptr() - this->pbase())) { _M_set_buffer(0); __ret = traits_type::not_eof(__c); @@ -792,7 +791,6 @@ namespace std { // Make sure that the internal buffer resyncs its idea of // the file position with the external file. - // NB: _M_file.sync() will be called within. int __ret = 0; if (this->pbase() < this->pptr()) { -- 2.47.2