+2004-11-07 Paolo Carlini <pcarlini@suse.de>
+ Andrea Arcangeli <andrea@suse.de>
+
+ * 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 <pcarlini@suse.de>
+ Kenneth C. Schalk <ken@xorian.net>
+
+ PR libstdc++/17215
+ * config/io/basic_file_stdio.cc (__basic_file<char>::close()):
+ Check the return value of fclose/sync, loop on EINTR.
+ (__basic_file<char>::sys_open): Likewise, for sync.
+
2004-11-04 Release Manager
* GCC 3.4.3 released.
__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;
}
__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;
}
// 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);
{
// 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())
{