aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/stdio/findfp.c
diff options
context:
space:
mode:
authorMatt Joyce <matthew.joyce@embedded-brains.de>2022-05-03 06:51:22 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-05-13 12:35:00 +0200
commit26747c47bc0a1137e02e0377306d721cc3478855 (patch)
tree6e776f95a671c07174316f1889dbfb1c9b23d39b /newlib/libc/stdio/findfp.c
parent4b28f3c125c4a4a17d5084548393962778ab27b2 (diff)
downloadnewlib-26747c47bc0a1137e02e0377306d721cc3478855.zip
newlib-26747c47bc0a1137e02e0377306d721cc3478855.tar.gz
newlib-26747c47bc0a1137e02e0377306d721cc3478855.tar.bz2
Add stdio_exit_handler()
Add a dedicated stdio exit handler to avoid using _GLOBAL_REENT in exit().
Diffstat (limited to 'newlib/libc/stdio/findfp.c')
-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 5b0402a..719886e 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)