From b0cb9f85ca3626e0e68fd451c3090d253ceb4300 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 17 May 2022 18:28:52 +0200 Subject: Use global stdio streams for all configurations The _REENT_GLOBAL_STDIO_STREAMS was introduced by commit 668a4c8722090fffd10869dbb15b879651c1370d in 2017. Since then it was enabled by default for RTEMS. Recently, the option was enabled for Cygwin which previously used an alternative implementation to use global stdio streams. In Newlib, the stdio streams are defined to thread-specific pointers _reent::_stdin, _reent::_stdout and _reent::_stderr. If the option is disabled (the default for most systems), then these pointers are initialized to thread-specific FILE objects which use file descriptors 0, 1, and 2, respectively. There are at least three problems with this: (1) The thread-specific FILE objects are closed by _reclaim_reent(). This leads to problems with language run-time libraries that provide wrappers to the C/POSIX stdio streams (for example C++ and Ada), since they use the thread-specific FILE objects of the initialization thread. In case the initialization thread is deleted, then they use freed memory. (2) Since thread-specific FILE objects are used with a common output device via file descriptors 0, 1 and 2, the locking at FILE object level cannot ensure atomicity of the output, e.g. a call to printf(). (3) There are resource managment issues, see: https://sourceware.org/pipermail/newlib/2022/019558.html https://bugs.linaro.org/show_bug.cgi?id=5841 This patch enables the _REENT_GLOBAL_STDIO_STREAMS behaviour for all Newlib configurations and removes the option. This removes a couple of #ifdef blocks. --- newlib/configure.ac | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'newlib/configure.ac') diff --git a/newlib/configure.ac b/newlib/configure.ac index 57f830960..1951aab0c 100644 --- a/newlib/configure.ac +++ b/newlib/configure.ac @@ -174,13 +174,13 @@ AC_ARG_ENABLE(newlib-reent-binary-compat, fi], [newlib_reent_binary_compat=no])dnl dnl Support --enable-newlib-global-stdio-streams +dnl This is no longer optional. It is enabled in all Newlib configurations. AC_ARG_ENABLE(newlib-global-stdio-streams, [ --enable-newlib-global-stdio-streams enable global stdio streams], [case "${enableval}" in yes) newlib_global_stdio_streams=yes;; - no) newlib_global_stdio_streams=no ;; *) AC_MSG_ERROR(bad value ${enableval} for newlib-global-stdio-streams option) ;; - esac], [newlib_global_stdio_streams=])dnl + esac], [newlib_global_stdio_streams=yes])dnl dnl Support --disable-newlib-fvwrite-in-streamio AC_ARG_ENABLE(newlib-fvwrite-in-streamio, @@ -435,12 +435,6 @@ if test "${newlib_reent_binary_compat}" = "yes"; then AC_DEFINE(_WANT_REENT_BACKWARD_BINARY_COMPAT, 1, [Define to enable backward binary compatibility for struct _reent.]) fi -if test "${newlib_global_stdio_streams}" = "yes"; then - AC_DEFINE(_WANT_REENT_GLOBAL_STDIO_STREAMS, 1, - [Define to move the stdio stream FILE objects out of struct _reent and make them global. - The stdio stream pointers of struct _reent are initialized to point to the global stdio FILE stream objects.]) -fi - _mb_len_max=1 if test "${newlib_mb}" = "yes"; then AC_DEFINE(_MB_CAPABLE, 1, [Multibyte supported.]) -- cgit v1.2.3