Remove __sglue member for one configuration

Remove __sglue member of struct reent when _REENT_GLOBAL_STDIO_STREAMS is
defined.
This commit is contained in:
Matt Joyce 2022-05-02 09:00:12 +02:00 committed by Sebastian Huber
parent 8b96542ed1
commit 0a862d1319
4 changed files with 21 additions and 5 deletions

View File

@ -696,19 +696,19 @@ struct _reent
/* These are here last so that __FILE can grow without changing the offsets /* 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 of the above members (on the off chance that future binary compatibility
would be broken otherwise). */ would be broken otherwise). */
struct _glue __sglue; /* root of glue chain */
# ifndef _REENT_GLOBAL_STDIO_STREAMS # ifndef _REENT_GLOBAL_STDIO_STREAMS
struct _glue __sglue; /* root of glue chain */
__FILE __sf[3]; /* first three file descriptors */ __FILE __sf[3]; /* first three file descriptors */
# endif # endif
}; };
#ifdef _REENT_GLOBAL_STDIO_STREAMS #ifdef _REENT_GLOBAL_STDIO_STREAMS
#define _REENT_STDIO_STREAM(var, index) &__sf[index] #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 */ #define _REENT_INIT_SGLUE_ZEROED(_ptr) /* nothing to set */
#else #else
#define _REENT_STDIO_STREAM(var, index) &(var)->__sf[index] #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) \ #define _REENT_INIT_SGLUE_ZEROED(_ptr) \
(_ptr)->__sglue._niobs = 3; \ (_ptr)->__sglue._niobs = 3; \
(_ptr)->__sglue._iobs = &(_ptr)->__sf[0]; (_ptr)->__sglue._iobs = &(_ptr)->__sf[0];
@ -758,7 +758,7 @@ struct _reent
} \ } \
}, \ }, \
_REENT_INIT_ATEXIT \ _REENT_INIT_ATEXIT \
_NULL, \ _NULL \
_REENT_INIT_SGLUE(&(var)) \ _REENT_INIT_SGLUE(&(var)) \
} }

View File

@ -27,6 +27,7 @@ int errno;
#endif #endif
#ifndef _REENT_GLOBAL_STDIO_STREAMS
/* Interim cleanup code */ /* Interim cleanup code */
void void
@ -39,6 +40,7 @@ cleanup_glue (struct _reent *ptr,
_free_r (ptr, glue); _free_r (ptr, glue);
} }
#endif
void void
_reclaim_reent (struct _reent *ptr) _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? */ before the program exits, and who wants to wait for that? */
ptr->__cleanup (ptr); ptr->__cleanup (ptr);
#ifndef _REENT_GLOBAL_STDIO_STREAMS
if (ptr->__sglue._next) if (ptr->__sglue._next)
cleanup_glue (ptr, ptr->__sglue._next); cleanup_glue (ptr, ptr->__sglue._next);
#endif
} }
/* Malloc memory not reclaimed; no good way to return memory anyway. */ /* Malloc memory not reclaimed; no good way to return memory anyway. */

View File

@ -59,7 +59,12 @@ Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
int int
_fcloseall_r (struct _reent *ptr) _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); return _fwalk_sglue (ptr, _fclose_r, &ptr->__sglue);
#endif
} }
#ifndef _REENT_ONLY #ifndef _REENT_ONLY

View File

@ -242,8 +242,9 @@ cleanup_stdio (struct _reent *ptr)
CLEANUP_FILE (ptr, ptr->_stdout); CLEANUP_FILE (ptr, ptr->_stdout);
if (ptr->_stderr != &__sf[2]) if (ptr->_stderr != &__sf[2])
CLEANUP_FILE (ptr, ptr->_stderr); CLEANUP_FILE (ptr, ptr->_stderr);
#endif #else
(void) _fwalk_sglue (ptr, CLEANUP_FILE, &ptr->__sglue); (void) _fwalk_sglue (ptr, CLEANUP_FILE, &ptr->__sglue);
#endif
} }
/* /*
@ -326,21 +327,27 @@ __fp_unlock (struct _reent * ptr __unused, FILE * fp)
void void
__fp_lock_all (void) __fp_lock_all (void)
{ {
#ifndef _REENT_GLOBAL_STDIO_STREAMS
struct _reent *ptr; struct _reent *ptr;
#endif
__sfp_lock_acquire (); __sfp_lock_acquire ();
#ifndef _REENT_GLOBAL_STDIO_STREAMS
ptr = _REENT; ptr = _REENT;
(void) _fwalk_sglue (ptr, __fp_lock, &ptr->__sglue); (void) _fwalk_sglue (ptr, __fp_lock, &ptr->__sglue);
#endif
} }
void void
__fp_unlock_all (void) __fp_unlock_all (void)
{ {
#ifndef _REENT_GLOBAL_STDIO_STREAMS
struct _reent *ptr; struct _reent *ptr;
ptr = _REENT; ptr = _REENT;
(void) _fwalk_sglue (ptr, __fp_unlock, &ptr->__sglue); (void) _fwalk_sglue (ptr, __fp_unlock, &ptr->__sglue);
#endif
__sfp_lock_release (); __sfp_lock_release ();
} }