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:
parent
3941c8a88a
commit
8b96542ed1
|
@ -304,6 +304,8 @@ struct _glue
|
||||||
__FILE *_iobs;
|
__FILE *_iobs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct _glue __sglue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rand48 family support
|
* rand48 family support
|
||||||
*
|
*
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue