[PATCH v2 10/11] Add global __sglue object for all configurations

Matthew Joyce <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
From: Matt Joyce <[email protected]>

Added a new global __sglue object for all configurations.
Decouples the global file object list from the _GLOBAL_REENT
structure by using this new object instead of the __sglue member
of _GLOBAL_REENT in __sfp() and _fwalk_sglue().
---
 newlib/libc/include/sys/reent.h |  2 ++
 newlib/libc/stdio/fcloseall.c   |  2 +-
 newlib/libc/stdio/fflush.c      |  2 +-
 newlib/libc/stdio/findfp.c      | 15 +++++++++------
 newlib/libc/stdio/refill.c      |  2 +-
 winsup/cygwin/syscalls.cc       |  2 +-
 6 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 6e420d0c8..2c0598a5d 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -304,6 +304,8 @@ struct _glue
   __FILE *_iobs;
 };
 
+extern struct _glue __sglue;
+
 /*
  * rand48 family support
  *
diff --git a/newlib/libc/stdio/fcloseall.c b/newlib/libc/stdio/fcloseall.c
index 4d4e3554b..f14c28d34 100644
--- a/newlib/libc/stdio/fcloseall.c
+++ b/newlib/libc/stdio/fcloseall.c
@@ -67,7 +67,7 @@ _fcloseall_r (struct _reent *ptr)
 int
 fcloseall (void)
 {
-  return _fcloseall_r (_GLOBAL_REENT);
+  return _fwalk_sglue (_GLOBAL_REENT, _fclose_r, &__sglue);
 }
 
 #endif
diff --git a/newlib/libc/stdio/fflush.c b/newlib/libc/stdio/fflush.c
index 6e946da7b..bbec4a19b 100644
--- a/newlib/libc/stdio/fflush.c
+++ b/newlib/libc/stdio/fflush.c
@@ -286,7 +286,7 @@ int
 fflush (register FILE * fp)
 {
   if (fp == NULL)
-    return _fwalk_sglue (_GLOBAL_REENT, _fflush_r, &_GLOBAL_REENT->__sglue);
+    return _fwalk_sglue (_GLOBAL_REENT, _fflush_r, &__sglue);
 
   return _fflush_r (_REENT, fp);
 }
diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c
index 1627032a3..bf471369c 100644
--- a/newlib/libc/stdio/findfp.c
+++ b/newlib/libc/stdio/findfp.c
@@ -39,6 +39,13 @@ const struct __sFILE_fake __sf_fake_stderr =
 
 #ifdef _REENT_GLOBAL_STDIO_STREAMS
 __FILE __sf[3];
+struct _glue __sglue = {NULL, 3, &__sf[0]};
+#else
+#ifndef _REENT_SMALL
+struct _glue __sglue = {NULL, 3, &_GLOBAL_REENT->__sf[0]};
+#else
+struct _glue __sglue = {NULL, 0, NULL};
+#endif
 #endif
 
 #ifdef _STDIO_BSD_SEMANTICS
@@ -158,7 +165,7 @@ sfmoreglue (struct _reent *d, int n)
 static void
 stdio_exit_handler (void)
 {
-  (void) _fwalk_sglue (_GLOBAL_REENT, CLEANUP_FILE, &_GLOBAL_REENT->__sglue);
+  (void) _fwalk_sglue (_GLOBAL_REENT, CLEANUP_FILE, &__sglue);
 }
 
 /*
@@ -175,15 +182,11 @@ __sfp (struct _reent *d)
   _newlib_sfp_lock_start ();
 
   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)
+  for (g = &__sglue;; g = g->_next)
     {
       for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++)
 	if (fp->_flags == 0)
diff --git a/newlib/libc/stdio/refill.c b/newlib/libc/stdio/refill.c
index 4084d7250..8516d8576 100644
--- a/newlib/libc/stdio/refill.c
+++ b/newlib/libc/stdio/refill.c
@@ -105,7 +105,7 @@ __srefill_r (struct _reent * ptr,
       /* Ignore this file in _fwalk_sglue to avoid potential deadlock. */
       short orig_flags = fp->_flags;
       fp->_flags = 1;
-      (void) _fwalk_sglue (_GLOBAL_REENT, lflush, &_GLOBAL_REENT->__sglue);
+      (void) _fwalk_sglue (_GLOBAL_REENT, lflush, &__sglue);
       fp->_flags = orig_flags;
 
       /* Now flush this file without locking it. */
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index fb994ac41..bb9df76cf 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -3135,7 +3135,7 @@ cygwin_setmode (int fd, int mode)
 	_my_tls.locals.setmode_mode = O_TEXT;
       else
 	_my_tls.locals.setmode_mode = O_BINARY;
-      _fwalk_sglue (_GLOBAL_REENT, setmode_helper, &_GLOBAL_REENT->__sglue);
+      _fwalk_sglue (_GLOBAL_REENT, setmode_helper, &__sglue);
     }
   return res;
 }
-- 
2.31.1
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.