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:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user