mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-19 21:09:22 +08:00
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>
|
||||
|
||||
* libc/include/sys/reent.h (_ATEXIT_INIT): Define.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user