From 1b7ad41e50ce327c3258d5a33e2cb86f2c855192 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Wed, 8 May 2013 23:13:51 +0000 Subject: 2013-05-07 Sebastian Huber * libc/include/sys/config.h (_REENT_GLOBAL_ATEXIT): Define for RTEMS. * libc/include/sys/reent.h (_reent): Use _REENT_GLOBAL_ATEXIT. (_global_atexit): Declare if _REENT_GLOBAL_ATEXIT is defined. * libc/reent/reent.c (_reclaim_reent): Remove atexit cleanup if _REENT_GLOBAL_ATEXIT is defined. (_wrapup_reent): Remove atexit handling if _REENT_GLOBAL_ATEXIT is defined. * libc/stdlib/__atexit.c (_global_atexit0): Define if _REENT_GLOBAL_ATEXIT is defined. * libc/stdlib/__call_atexit.c (_global_atexit): Define if _REENT_GLOBAL_ATEXIT is defined. --- newlib/libc/include/sys/config.h | 1 + newlib/libc/include/sys/reent.h | 20 +++++++++++++++++--- newlib/libc/reent/reent.c | 17 +++++++++++++---- newlib/libc/stdlib/__atexit.c | 7 ++++++- newlib/libc/stdlib/__call_atexit.c | 4 ++++ 5 files changed, 41 insertions(+), 8 deletions(-) (limited to 'newlib/libc') diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h index a6528b832..b26017b99 100644 --- a/newlib/libc/include/sys/config.h +++ b/newlib/libc/include/sys/config.h @@ -217,6 +217,7 @@ #if defined(__rtems__) #define __FILENAME_MAX__ 255 #define _READ_WRITE_RETURN_TYPE _ssize_t +#define _REENT_GLOBAL_ATEXIT #endif #ifndef __EXPORT diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h index 8b78f5bc8..21f02cc61 100644 --- a/newlib/libc/include/sys/reent.h +++ b/newlib/libc/include/sys/reent.h @@ -108,10 +108,15 @@ struct _atexit { (var)->_on_exit_args._fnargs[0] = _NULL #endif -#define _REENT_INIT_ATEXIT \ +#ifdef _REENT_GLOBAL_ATEXIT +# define _REENT_INIT_ATEXIT +# define _REENT_INIT_ATEXIT_PTR(var, var0) +#else +# define _REENT_INIT_ATEXIT \ _NULL, _ATEXIT_INIT, -#define _REENT_INIT_ATEXIT_PTR(var, var0) \ +# define _REENT_INIT_ATEXIT_PTR(var, var0) \ (var)->_atexit = _NULL; _ATEXIT_INIT_PTR(var0); +#endif /* * Stdio buffers. @@ -410,9 +415,11 @@ struct _reent /* signal info */ void (**(_sig_func))(int); +# ifndef _REENT_GLOBAL_ATEXIT /* atexit stuff */ struct _atexit *_atexit; struct _atexit _atexit0; +# endif struct _glue __sglue; /* root of glue chain */ __FILE *__sf; /* file descriptors */ @@ -654,9 +661,11 @@ struct _reent } _unused; } _new; +# ifndef _REENT_GLOBAL_ATEXIT /* atexit stuff */ struct _atexit *_atexit; /* points to head of LIFO stack */ struct _atexit _atexit0; /* one guaranteed table, required by ANSI */ +# endif /* signal info */ void (**(_sig_func))(int); @@ -803,7 +812,12 @@ void _reclaim_reent _PARAMS ((struct _reent *)); #define _GLOBAL_REENT _global_impure_ptr -#define _GLOBAL_ATEXIT (_GLOBAL_REENT->_atexit) +#ifdef _REENT_GLOBAL_ATEXIT +extern struct _atexit *_global_atexit; /* points to head of LIFO stack */ +# define _GLOBAL_ATEXIT _global_atexit +#else +# define _GLOBAL_ATEXIT (_GLOBAL_REENT->_atexit) +#endif #ifdef __cplusplus } diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c index 63812db83..61da3b2ba 100644 --- a/newlib/libc/reent/reent.c +++ b/newlib/libc/reent/reent.c @@ -87,10 +87,14 @@ _DEFUN (_reclaim_reent, (ptr), _free_r (ptr, ptr->_localtime_buf); if (ptr->_asctime_buf) _free_r (ptr, ptr->_asctime_buf); +#endif + +#ifndef _REENT_GLOBAL_ATEXIT + /* atexit stuff */ +# ifdef _REENT_SMALL if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr) _free_r (ptr, ptr->_atexit->_on_exit_args_ptr); -#else - /* atexit stuff */ +# else if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0)) { struct _atexit *p, *q; @@ -101,6 +105,7 @@ _DEFUN (_reclaim_reent, (ptr), _free_r (ptr, q); } } +# endif #endif if (ptr->_cvtbuf) @@ -131,19 +136,23 @@ _DEFUN (_reclaim_reent, (ptr), void _DEFUN (_wrapup_reent, (ptr), struct _reent *ptr) { +#ifndef _REENT_GLOBAL_ATEXIT register struct _atexit *p; +#endif register int n; if (ptr == NULL) ptr = _REENT; -#ifdef _REENT_SMALL +#ifndef _REENT_GLOBAL_ATEXIT +# ifdef _REENT_SMALL for (p = ptr->_atexit, n = p ? p->_ind : 0; --n >= 0;) (*p->_fns[n]) (); -#else +# else for (p = ptr->_atexit; p; p = p->_next) for (n = p->_ind; --n >= 0;) (*p->_fns[n]) (); +# endif #endif if (ptr->__cleanup) (*ptr->__cleanup) (ptr); diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c index a095313d3..f04f00d8e 100644 --- a/newlib/libc/stdlib/__atexit.c +++ b/newlib/libc/stdlib/__atexit.c @@ -15,7 +15,12 @@ void * malloc(size_t) _ATTRIBUTE((__weak__)); extern _LOCK_RECURSIVE_T __atexit_lock; #endif -#define _GLOBAL_ATEXIT0 (&_GLOBAL_REENT->_atexit0) +#ifdef _REENT_GLOBAL_ATEXIT +static struct _atexit _global_atexit0 = _ATEXIT_INIT; +# define _GLOBAL_ATEXIT0 (&_global_atexit0) +#else +# define _GLOBAL_ATEXIT0 (&_GLOBAL_REENT->_atexit0) +#endif /* * Register a function to be performed at exit or on shared library unload. diff --git a/newlib/libc/stdlib/__call_atexit.c b/newlib/libc/stdlib/__call_atexit.c index 76d3f1223..1e6e71044 100644 --- a/newlib/libc/stdlib/__call_atexit.c +++ b/newlib/libc/stdlib/__call_atexit.c @@ -13,6 +13,10 @@ void free(void *) _ATTRIBUTE((__weak__)); __LOCK_INIT_RECURSIVE(, __atexit_lock); +#ifdef _REENT_GLOBAL_ATEXIT +struct _atexit *_global_atexit = _NULL; +#endif + #ifdef _WANT_REGISTER_FINI /* If "__libc_fini" is defined, finalizers (either -- cgit v1.2.3