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
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)) \
}

View File

@ -27,6 +27,7 @@ int errno;
#endif
#ifndef _REENT_GLOBAL_STDIO_STREAMS
/* Interim cleanup code */
void
@ -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. */

View File

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

View File

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