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;
};
extern struct _glue __sglue;
/*
* rand48 family support
*

View File

@ -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

View File

@ -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);
}

View File

@ -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
#ifdef _REENT_SMALL
struct _glue __sglue = {NULL, 0, NULL};
#else
struct _glue __sglue = {NULL, 3, &_GLOBAL_REENT->__sf[0]};
#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)

View File

@ -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. */

View File

@ -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;
}