2013-05-07 Sebastian Huber <sebastian.huber@embedded-brains.de>

* 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.
This commit is contained in:
Jeff Johnston 2013-05-08 23:13:51 +00:00
parent ad48b1b79c
commit 1b7ad41e50
6 changed files with 56 additions and 8 deletions

View File

@ -1,3 +1,18 @@
2013-05-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
* 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.
2013-05-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libc/include/sys/reent.h (_ATEXIT_INIT): Define.

View File

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

View File

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

View File

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

View File

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

View File

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