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:
parent
ad48b1b79c
commit
1b7ad41e50
|
@ -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>
|
2013-05-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* libc/include/sys/reent.h (_ATEXIT_INIT): Define.
|
* libc/include/sys/reent.h (_ATEXIT_INIT): Define.
|
||||||
|
|
|
@ -217,6 +217,7 @@
|
||||||
#if defined(__rtems__)
|
#if defined(__rtems__)
|
||||||
#define __FILENAME_MAX__ 255
|
#define __FILENAME_MAX__ 255
|
||||||
#define _READ_WRITE_RETURN_TYPE _ssize_t
|
#define _READ_WRITE_RETURN_TYPE _ssize_t
|
||||||
|
#define _REENT_GLOBAL_ATEXIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __EXPORT
|
#ifndef __EXPORT
|
||||||
|
|
|
@ -108,10 +108,15 @@ struct _atexit {
|
||||||
(var)->_on_exit_args._fnargs[0] = _NULL
|
(var)->_on_exit_args._fnargs[0] = _NULL
|
||||||
#endif
|
#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,
|
_NULL, _ATEXIT_INIT,
|
||||||
#define _REENT_INIT_ATEXIT_PTR(var, var0) \
|
# define _REENT_INIT_ATEXIT_PTR(var, var0) \
|
||||||
(var)->_atexit = _NULL; _ATEXIT_INIT_PTR(var0);
|
(var)->_atexit = _NULL; _ATEXIT_INIT_PTR(var0);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stdio buffers.
|
* Stdio buffers.
|
||||||
|
@ -410,9 +415,11 @@ struct _reent
|
||||||
/* signal info */
|
/* signal info */
|
||||||
void (**(_sig_func))(int);
|
void (**(_sig_func))(int);
|
||||||
|
|
||||||
|
# ifndef _REENT_GLOBAL_ATEXIT
|
||||||
/* atexit stuff */
|
/* atexit stuff */
|
||||||
struct _atexit *_atexit;
|
struct _atexit *_atexit;
|
||||||
struct _atexit _atexit0;
|
struct _atexit _atexit0;
|
||||||
|
# endif
|
||||||
|
|
||||||
struct _glue __sglue; /* root of glue chain */
|
struct _glue __sglue; /* root of glue chain */
|
||||||
__FILE *__sf; /* file descriptors */
|
__FILE *__sf; /* file descriptors */
|
||||||
|
@ -654,9 +661,11 @@ struct _reent
|
||||||
} _unused;
|
} _unused;
|
||||||
} _new;
|
} _new;
|
||||||
|
|
||||||
|
# ifndef _REENT_GLOBAL_ATEXIT
|
||||||
/* atexit stuff */
|
/* atexit stuff */
|
||||||
struct _atexit *_atexit; /* points to head of LIFO stack */
|
struct _atexit *_atexit; /* points to head of LIFO stack */
|
||||||
struct _atexit _atexit0; /* one guaranteed table, required by ANSI */
|
struct _atexit _atexit0; /* one guaranteed table, required by ANSI */
|
||||||
|
# endif
|
||||||
|
|
||||||
/* signal info */
|
/* signal info */
|
||||||
void (**(_sig_func))(int);
|
void (**(_sig_func))(int);
|
||||||
|
@ -803,7 +812,12 @@ void _reclaim_reent _PARAMS ((struct _reent *));
|
||||||
|
|
||||||
#define _GLOBAL_REENT _global_impure_ptr
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,10 +87,14 @@ _DEFUN (_reclaim_reent, (ptr),
|
||||||
_free_r (ptr, ptr->_localtime_buf);
|
_free_r (ptr, ptr->_localtime_buf);
|
||||||
if (ptr->_asctime_buf)
|
if (ptr->_asctime_buf)
|
||||||
_free_r (ptr, 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)
|
if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr)
|
||||||
_free_r (ptr, ptr->_atexit->_on_exit_args_ptr);
|
_free_r (ptr, ptr->_atexit->_on_exit_args_ptr);
|
||||||
#else
|
# else
|
||||||
/* atexit stuff */
|
|
||||||
if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
|
if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
|
||||||
{
|
{
|
||||||
struct _atexit *p, *q;
|
struct _atexit *p, *q;
|
||||||
|
@ -101,6 +105,7 @@ _DEFUN (_reclaim_reent, (ptr),
|
||||||
_free_r (ptr, q);
|
_free_r (ptr, q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ptr->_cvtbuf)
|
if (ptr->_cvtbuf)
|
||||||
|
@ -131,19 +136,23 @@ _DEFUN (_reclaim_reent, (ptr),
|
||||||
void
|
void
|
||||||
_DEFUN (_wrapup_reent, (ptr), struct _reent *ptr)
|
_DEFUN (_wrapup_reent, (ptr), struct _reent *ptr)
|
||||||
{
|
{
|
||||||
|
#ifndef _REENT_GLOBAL_ATEXIT
|
||||||
register struct _atexit *p;
|
register struct _atexit *p;
|
||||||
|
#endif
|
||||||
register int n;
|
register int n;
|
||||||
|
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
ptr = _REENT;
|
ptr = _REENT;
|
||||||
|
|
||||||
#ifdef _REENT_SMALL
|
#ifndef _REENT_GLOBAL_ATEXIT
|
||||||
|
# ifdef _REENT_SMALL
|
||||||
for (p = ptr->_atexit, n = p ? p->_ind : 0; --n >= 0;)
|
for (p = ptr->_atexit, n = p ? p->_ind : 0; --n >= 0;)
|
||||||
(*p->_fns[n]) ();
|
(*p->_fns[n]) ();
|
||||||
#else
|
# else
|
||||||
for (p = ptr->_atexit; p; p = p->_next)
|
for (p = ptr->_atexit; p; p = p->_next)
|
||||||
for (n = p->_ind; --n >= 0;)
|
for (n = p->_ind; --n >= 0;)
|
||||||
(*p->_fns[n]) ();
|
(*p->_fns[n]) ();
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
if (ptr->__cleanup)
|
if (ptr->__cleanup)
|
||||||
(*ptr->__cleanup) (ptr);
|
(*ptr->__cleanup) (ptr);
|
||||||
|
|
|
@ -15,7 +15,12 @@ void * malloc(size_t) _ATTRIBUTE((__weak__));
|
||||||
extern _LOCK_RECURSIVE_T __atexit_lock;
|
extern _LOCK_RECURSIVE_T __atexit_lock;
|
||||||
#endif
|
#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.
|
* Register a function to be performed at exit or on shared library unload.
|
||||||
|
|
|
@ -13,6 +13,10 @@ void free(void *) _ATTRIBUTE((__weak__));
|
||||||
|
|
||||||
__LOCK_INIT_RECURSIVE(, __atexit_lock);
|
__LOCK_INIT_RECURSIVE(, __atexit_lock);
|
||||||
|
|
||||||
|
#ifdef _REENT_GLOBAL_ATEXIT
|
||||||
|
struct _atexit *_global_atexit = _NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WANT_REGISTER_FINI
|
#ifdef _WANT_REGISTER_FINI
|
||||||
|
|
||||||
/* If "__libc_fini" is defined, finalizers (either
|
/* If "__libc_fini" is defined, finalizers (either
|
||||||
|
|
Loading…
Reference in New Issue