Add global __sglue object for all configurations

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().
This commit is contained in:
Matt Joyce 2022-05-02 08:58:25 +02:00 committed by Sebastian Huber
parent 3941c8a88a
commit 8b96542ed1
6 changed files with 15 additions and 10 deletions

View File

@ -304,6 +304,8 @@ struct _glue
__FILE *_iobs; __FILE *_iobs;
}; };
extern struct _glue __sglue;
/* /*
* rand48 family support * rand48 family support
* *

View File

@ -67,7 +67,7 @@ _fcloseall_r (struct _reent *ptr)
int int
fcloseall (void) fcloseall (void)
{ {
return _fcloseall_r (_GLOBAL_REENT); return _fwalk_sglue (_GLOBAL_REENT, _fclose_r, &__sglue);
} }
#endif #endif

View File

@ -286,7 +286,7 @@ int
fflush (register FILE * fp) fflush (register FILE * fp)
{ {
if (fp == NULL) 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); return _fflush_r (_REENT, fp);
} }

View File

@ -39,6 +39,13 @@ const struct __sFILE_fake __sf_fake_stderr =
#ifdef _REENT_GLOBAL_STDIO_STREAMS #ifdef _REENT_GLOBAL_STDIO_STREAMS
__FILE __sf[3]; __FILE __sf[3];
struct _glue __sglue = {NULL, 3, &__sf[0]};
#else
#ifdef _REENT_SMALL
struct _glue __sglue = {NULL, 0, NULL};
#else
struct _glue __sglue = {NULL, 3, &_GLOBAL_REENT->__sf[0]};
#endif
#endif #endif
#ifdef _STDIO_BSD_SEMANTICS #ifdef _STDIO_BSD_SEMANTICS
@ -158,7 +165,7 @@ sfmoreglue (struct _reent *d, int n)
static void static void
stdio_exit_handler (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 (); _newlib_sfp_lock_start ();
if (__stdio_exit_handler == 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); __sinit (_GLOBAL_REENT);
__stdio_exit_handler = stdio_exit_handler; __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++) for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++)
if (fp->_flags == 0) if (fp->_flags == 0)

View File

@ -105,7 +105,7 @@ __srefill_r (struct _reent * ptr,
/* Ignore this file in _fwalk_sglue to avoid potential deadlock. */ /* Ignore this file in _fwalk_sglue to avoid potential deadlock. */
short orig_flags = fp->_flags; short orig_flags = fp->_flags;
fp->_flags = 1; fp->_flags = 1;
(void) _fwalk_sglue (_GLOBAL_REENT, lflush, &_GLOBAL_REENT->__sglue); (void) _fwalk_sglue (_GLOBAL_REENT, lflush, &__sglue);
fp->_flags = orig_flags; fp->_flags = orig_flags;
/* Now flush this file without locking it. */ /* Now flush this file without locking it. */

View File

@ -3135,7 +3135,7 @@ cygwin_setmode (int fd, int mode)
_my_tls.locals.setmode_mode = O_TEXT; _my_tls.locals.setmode_mode = O_TEXT;
else else
_my_tls.locals.setmode_mode = O_BINARY; _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; return res;
} }