Re: [PATCH v2] Use global stdio streams for all configurations

Corinna Vinschen <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
On Jun  8 11:43, Sebastian Huber wrote:
> 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.
> ---
> v2:
> 
> * Add missing ';' to _REENT_INIT_PTR_ZEROED().
> 
> * Rebase to Newlib master.
> 
>  newlib/README                         |   6 --
>  newlib/configure.ac                   |  10 +--
>  newlib/libc/include/sys/config.h      |   7 --
>  newlib/libc/include/sys/reent.h       | 118 +++-----------------------
>  newlib/libc/reent/impure.c            |   6 --
>  newlib/libc/reent/reent.c             |  20 -----
>  newlib/libc/stdio/fcloseall.c         |   4 -
>  newlib/libc/stdio/findfp.c            |  53 +-----------
>  newlib/libc/stdio/local.h             |  17 ----
>  winsup/cygwin/include/cygwin/config.h |   1 -
>  10 files changed, 14 insertions(+), 228 deletions(-)

LGTM together with your "Fix __fp_lock_all() and __fp_unlock_all()" patch.

Thx,
Corinna
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.