diff options
Diffstat (limited to 'newlib/libc/reent/reent.c')
-rw-r--r-- | newlib/libc/reent/reent.c | 47 |
1 files changed, 16 insertions, 31 deletions
diff --git a/newlib/libc/reent/reent.c b/newlib/libc/reent/reent.c index 63812db83..b6c2abf02 100644 --- a/newlib/libc/reent/reent.c +++ b/newlib/libc/reent/reent.c @@ -87,10 +87,18 @@ _DEFUN (_reclaim_reent, (ptr), _free_r (ptr, ptr->_localtime_buf); if (ptr->_asctime_buf) _free_r (ptr, ptr->_asctime_buf); + if (ptr->_signal_buf) + _free_r (ptr, ptr->_signal_buf); + if (ptr->_misc) + _free_r (ptr, ptr->_misc); +#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,10 +109,16 @@ _DEFUN (_reclaim_reent, (ptr), _free_r (ptr, q); } } +# endif #endif if (ptr->_cvtbuf) _free_r (ptr, ptr->_cvtbuf); + /* We should free _sig_func to avoid a memory leak, but how to + do it safely considering that a signal may be delivered immediately + after the free? + if (ptr->_sig_func) + _free_r (ptr, ptr->_sig_func);*/ if (ptr->__sdidinit) { @@ -120,32 +134,3 @@ _DEFUN (_reclaim_reent, (ptr), } } - -/* - * Do atexit() processing and cleanup - * - * NOTE: This is to be executed at task exit. It does not tear anything - * down which is used on a global basis. - */ - -void -_DEFUN (_wrapup_reent, (ptr), struct _reent *ptr) -{ - register struct _atexit *p; - register int n; - - if (ptr == NULL) - ptr = _REENT; - -#ifdef _REENT_SMALL - for (p = ptr->_atexit, n = p ? p->_ind : 0; --n >= 0;) - (*p->_fns[n]) (); -#else - for (p = ptr->_atexit; p; p = p->_next) - for (n = p->_ind; --n >= 0;) - (*p->_fns[n]) (); -#endif - if (ptr->__cleanup) - (*ptr->__cleanup) (ptr); -} - |