libstdc++: Override BUFSIZ for Windows targets [PR 94268]

This replaces uses of BUFSIZ with a new _GLIBCXX_BUFSIZ macro that can
be overridden in target-specific config headers.

That allows the mingw and mingw-w64 targets to override it, because
BUFSIZ is apparently defined to 512, resulting in poor performance. The
MSVCRT stdio apparently uses 4096, so we use that too.

libstdc++-v3/ChangeLog:

	PR libstdc++/94268
	* config/os/mingw32-w64/os_defines.h (_GLIBCXX_BUFSIZ):
	Define.
	* config/os/mingw32/os_defines.h (_GLIBCXX_BUFSIZ):
	Define.
	* include/bits/fstream.tcc: Use _GLIBCXX_BUFSIZ instead
	of BUFSIZ.
	* include/ext/stdio_filebuf.h: Likewise.
	* include/std/fstream (_GLIBCXX_BUFSIZ): Define.
This commit is contained in:
Jonathan Wakely 2020-10-28 13:19:21 +00:00
parent 2acb33103c
commit 0bc199fc5d
5 changed files with 14 additions and 3 deletions

View File

@ -90,4 +90,7 @@
#define _GLIBCXX_USE_CRT_RAND_S 1
// See libstdc++/94268
#define _GLIBCXX_BUFSIZ 4096
#endif

View File

@ -78,4 +78,7 @@
// See libstdc++/59807
#define _GTHREAD_USE_MUTEX_INIT_FUNC 1
// See libstdc++/94268
#define _GLIBCXX_BUFSIZ 4096
#endif

View File

@ -80,7 +80,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
basic_filebuf<_CharT, _Traits>::
basic_filebuf() : __streambuf_type(), _M_lock(), _M_file(&_M_lock),
_M_mode(ios_base::openmode(0)), _M_state_beg(), _M_state_cur(),
_M_state_last(), _M_buf(0), _M_buf_size(BUFSIZ),
_M_state_last(), _M_buf(0), _M_buf_size(_GLIBCXX_BUFSIZ),
_M_buf_allocated(false), _M_reading(false), _M_writing(false), _M_pback(),
_M_pback_cur_save(0), _M_pback_end_save(0), _M_pback_init(false),
_M_codecvt(0), _M_ext_buf(0), _M_ext_buf_size(0), _M_ext_next(0),

View File

@ -75,7 +75,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* closed when the stdio_filebuf is closed/destroyed.
*/
stdio_filebuf(int __fd, std::ios_base::openmode __mode,
size_t __size = static_cast<size_t>(BUFSIZ));
size_t __size = static_cast<size_t>(_GLIBCXX_BUFSIZ));
/**
* @param __f An open @c FILE*.
@ -88,7 +88,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* stdio_filebuf is closed/destroyed.
*/
stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
size_t __size = static_cast<size_t>(BUFSIZ));
size_t __size = static_cast<size_t>(_GLIBCXX_BUFSIZ));
/**
* Closes the external data stream if the file descriptor constructor

View File

@ -44,6 +44,11 @@
#include <string> // For std::string overloads.
#endif
// This can be overridden by the target's os_defines.h
#ifndef _GLIBCXX_BUFSIZ
# define _GLIBCXX_BUFSIZ BUFSIZ
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION