[PATCH 11/11] Remove __sglue member for one configuration

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

Removed __sglue member of struct reent when
_REENT_GLOBAL_STDIO_STREAMS is defined.
---
 newlib/libc/include/sys/reent.h | 8 ++++----
 newlib/libc/reent/reent.c       | 6 +++++-
 newlib/libc/stdio/fcloseall.c   | 5 +++++
 newlib/libc/stdio/findfp.c      | 9 ++++++++-
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 708ec16e2..a738ce3a6 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -696,19 +696,19 @@ struct _reent
   /* These are here last so that __FILE can grow without changing the offsets
      of the above members (on the off chance that future binary compatibility
      would be broken otherwise).  */
-  struct _glue __sglue;		/* root of glue chain */
 # ifndef _REENT_GLOBAL_STDIO_STREAMS
+  struct _glue __sglue;		/* root of glue chain */
   __FILE __sf[3];  		/* first three file descriptors */
 # endif
 };
 
 #ifdef _REENT_GLOBAL_STDIO_STREAMS
 #define _REENT_STDIO_STREAM(var, index) &__sf[index]
-#define _REENT_INIT_SGLUE(_ptr) { _NULL, 0, _NULL }
+#define _REENT_INIT_SGLUE(_ptr) /* nothing to initialize */
 #define _REENT_INIT_SGLUE_ZEROED(_ptr) /* nothing to set */
 #else
 #define _REENT_STDIO_STREAM(var, index) &(var)->__sf[index]
-#define _REENT_INIT_SGLUE(_ptr) { _NULL, 3, &(_ptr)->__sf[0] }
+#define _REENT_INIT_SGLUE(_ptr) , { _NULL, 3, &(_ptr)->__sf[0] }
 #define _REENT_INIT_SGLUE_ZEROED(_ptr) \
   (_ptr)->__sglue._niobs = 3; \
   (_ptr)->__sglue._iobs = &(_ptr)->__sf[0];
@@ -758,7 +758,7 @@ struct _reent
       } \
     }, \
     _REENT_INIT_ATEXIT \
-    _NULL, \
+    _NULL \
     _REENT_INIT_SGLUE(&(var)) \
   }
 
diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c
index 5a04fcf62..70f1c5f45 100644
--- a/newlib/libc/reent/reent.c
+++ b/newlib/libc/reent/reent.c
@@ -27,9 +27,10 @@ int errno;
 
 #endif
 
+#ifndef _REENT_GLOBAL_STDIO_STREAMS
 /* Interim cleanup code */
 
-void
+static void
 cleanup_glue (struct _reent *ptr,
      struct _glue *glue)
 {
@@ -39,6 +40,7 @@ cleanup_glue (struct _reent *ptr,
 
   _free_r (ptr, glue);
 }
+#endif
 
 void
 _reclaim_reent (struct _reent *ptr)
@@ -124,8 +126,10 @@ _reclaim_reent (struct _reent *ptr)
 	     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. */
diff --git a/newlib/libc/stdio/fcloseall.c b/newlib/libc/stdio/fcloseall.c
index f14c28d34..642dc7d94 100644
--- a/newlib/libc/stdio/fcloseall.c
+++ b/newlib/libc/stdio/fcloseall.c
@@ -59,7 +59,12 @@ Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
 int
 _fcloseall_r (struct _reent *ptr)
 {
+#ifdef _REENT_GLOBAL_STDIO_STREAMS
+  /* There are no thread-specific FILE objects */
+  return 0;
+#else
   return _fwalk_sglue (ptr, _fclose_r, &ptr->__sglue);
+#endif
 }
 
 #ifndef _REENT_ONLY
diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c
index 453103e77..e1ffa12b9 100644
--- a/newlib/libc/stdio/findfp.c
+++ b/newlib/libc/stdio/findfp.c
@@ -242,8 +242,9 @@ cleanup_stdio (struct _reent *ptr)
     CLEANUP_FILE (ptr, ptr->_stdout);
   if (ptr->_stderr != &__sf[2])
     CLEANUP_FILE (ptr, ptr->_stderr);
-#endif
+#else
   (void) _fwalk_sglue (ptr, CLEANUP_FILE, &ptr->__sglue);
+#endif
 }
 
 /*
@@ -326,21 +327,27 @@ __fp_unlock (struct _reent * ptr __unused, FILE * fp)
 void
 __fp_lock_all (void)
 {
+#ifndef _REENT_GLOBAL_STDIO_STREAMS
   struct _reent *ptr;
+#endif
 
   __sfp_lock_acquire ();
 
+#ifndef _REENT_GLOBAL_STDIO_STREAMS
   ptr = _REENT;
   (void) _fwalk_sglue (ptr, __fp_lock, &ptr->__sglue);
+#endif
 }
 
 void
 __fp_unlock_all (void)
 {
+#ifndef _REENT_GLOBAL_STDIO_STREAMS
   struct _reent *ptr;
 
   ptr = _REENT;
   (void) _fwalk_sglue (ptr, __fp_unlock, &ptr->__sglue);
+#endif
 
   __sfp_lock_release ();
 }
-- 
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.