Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Joyce <matthew.joyce@embedded-brains.de>2022-05-03 07:51:22 +0300
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-05-13 13:35:00 +0300
commit26747c47bc0a1137e02e0377306d721cc3478855 (patch)
tree6e776f95a671c07174316f1889dbfb1c9b23d39b /newlib/libc/stdio
parent4b28f3c125c4a4a17d5084548393962778ab27b2 (diff)
Add stdio_exit_handler()
Add a dedicated stdio exit handler to avoid using _GLOBAL_REENT in exit().
Diffstat (limited to 'newlib/libc/stdio')
-rw-r--r--newlib/libc/stdio/findfp.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c
index 5b0402ac1..719886e27 100644
--- a/newlib/libc/stdio/findfp.c
+++ b/newlib/libc/stdio/findfp.c
@@ -26,6 +26,8 @@
#include <sys/lock.h>
#include "local.h"
+void (*__stdio_exit_handler) (void);
+
#if defined(_REENT_SMALL) && !defined(_REENT_GLOBAL_STDIO_STREAMS)
const struct __sFILE_fake __sf_fake_stdin =
{_NULL, 0, 0, 0, 0, {_NULL, 0}, 0, _NULL};
@@ -153,6 +155,12 @@ sfmoreglue (struct _reent *d, int n)
return &g->glue;
}
+static void
+stdio_exit_handler (void)
+{
+ (void) _fwalk_reent (_GLOBAL_REENT, CLEANUP_FILE);
+}
+
/*
* Find a free FILE for fopen et al.
*/
@@ -166,12 +174,13 @@ __sfp (struct _reent *d)
_newlib_sfp_lock_start ();
- if (_GLOBAL_REENT->__cleanup == NULL) {
+ if (__stdio_exit_handler == NULL) {
#ifdef _REENT_GLOBAL_STDIO_STREAMS
_GLOBAL_REENT->__sglue._niobs = 3;
_GLOBAL_REENT->__sglue._iobs = &__sf[0];
#endif
__sinit (_GLOBAL_REENT);
+ __stdio_exit_handler = stdio_exit_handler;
}
for (g = &_GLOBAL_REENT->__sglue;; g = g->_next)