diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-05-17 19:28:52 +0300 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-06-10 21:13:52 +0300 |
commit | b0cb9f85ca3626e0e68fd451c3090d253ceb4300 (patch) | |
tree | db9ff5315fbc1557040d70bda51787ea2fb5a086 /newlib/libc/reent | |
parent | c4d4439c4208b75454edef0b42d5585de8ac9f47 (diff) |
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.
Diffstat (limited to 'newlib/libc/reent')
-rw-r--r-- | newlib/libc/reent/impure.c | 6 | ||||
-rw-r--r-- | newlib/libc/reent/reent.c | 20 |
2 files changed, 0 insertions, 26 deletions
diff --git a/newlib/libc/reent/impure.c b/newlib/libc/reent/impure.c index 643a511c6..9290c9cd5 100644 --- a/newlib/libc/reent/impure.c +++ b/newlib/libc/reent/impure.c @@ -6,13 +6,7 @@ important to reduce image size for targets with very small amounts of memory. */ #ifdef _REENT_SMALL -#ifdef _REENT_GLOBAL_STDIO_STREAMS extern __FILE __sf[3] _ATTRIBUTE ((weak)); -#else -extern const struct __sFILE_fake __sf_fake_stdin _ATTRIBUTE ((weak)); -extern const struct __sFILE_fake __sf_fake_stdout _ATTRIBUTE ((weak)); -extern const struct __sFILE_fake __sf_fake_stderr _ATTRIBUTE ((weak)); -#endif #endif struct _reent __ATTRIBUTE_IMPURE_DATA__ _impure_data = _REENT_INIT (_impure_data); diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c index 04942ce4d..d61415901 100644 --- a/newlib/libc/reent/reent.c +++ b/newlib/libc/reent/reent.c @@ -27,21 +27,6 @@ int errno; #endif -#ifndef _REENT_GLOBAL_STDIO_STREAMS -/* Interim cleanup code */ - -static void -cleanup_glue (struct _reent *ptr, - struct _glue *glue) -{ - /* Have to reclaim these in reverse order: */ - if (glue->_next) - cleanup_glue (ptr, glue->_next); - - _free_r (ptr, glue); -} -#endif - void _reclaim_reent (struct _reent *ptr) { @@ -106,11 +91,6 @@ _reclaim_reent (struct _reent *ptr) /* cleanup won't reclaim memory 'coz usually it's run before the program exits, and who wants to wait for that? */ ptr->__cleanup (ptr); - -#ifndef _REENT_GLOBAL_STDIO_STREAMS - if (ptr->__sglue._next) - cleanup_glue (ptr, ptr->__sglue._next); -#endif } /* Malloc memory not reclaimed; no good way to return memory anyway. */ |