2000-02-18 03:39:52 +08:00
|
|
|
/*
|
|
|
|
FUNCTION
|
|
|
|
<<reent>>---definition of impure data.
|
|
|
|
|
|
|
|
INDEX
|
|
|
|
reent
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
This module defines the impure data area used by the
|
2001-03-22 05:47:31 +08:00
|
|
|
non-reentrant functions, such as strtok.
|
2000-02-18 03:39:52 +08:00
|
|
|
*/
|
|
|
|
|
2000-08-25 06:32:38 +08:00
|
|
|
#include <stdlib.h>
|
2000-02-18 03:39:52 +08:00
|
|
|
#include <reent.h>
|
|
|
|
|
2001-03-22 05:47:31 +08:00
|
|
|
#ifdef _REENT_ONLY
|
|
|
|
#ifndef REENTRANT_SYSCALLS_PROVIDED
|
|
|
|
#define REENTRANT_SYSCALLS_PROVIDED
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef REENTRANT_SYSCALLS_PROVIDED
|
|
|
|
|
|
|
|
/* We use the errno variable used by the system dependent layer. */
|
|
|
|
#undef errno
|
|
|
|
int errno;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2000-02-18 03:39:52 +08:00
|
|
|
/* Interim cleanup code */
|
|
|
|
|
|
|
|
void
|
2017-12-04 11:43:30 +08:00
|
|
|
cleanup_glue (struct _reent *ptr,
|
2003-06-04 03:48:08 +08:00
|
|
|
struct _glue *glue)
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
|
|
|
/* Have to reclaim these in reverse order: */
|
|
|
|
if (glue->_next)
|
|
|
|
cleanup_glue (ptr, glue->_next);
|
|
|
|
|
|
|
|
_free_r (ptr, glue);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2017-12-04 11:43:30 +08:00
|
|
|
_reclaim_reent (struct _reent *ptr)
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
|
|
|
if (ptr != _impure_ptr)
|
|
|
|
{
|
|
|
|
/* used by mprec routines. */
|
2002-02-03 17:24:18 +08:00
|
|
|
#ifdef _REENT_SMALL
|
|
|
|
if (ptr->_mp) /* don't bother allocating it! */
|
2009-03-07 01:11:20 +08:00
|
|
|
{
|
2002-02-03 17:24:18 +08:00
|
|
|
#endif
|
|
|
|
if (_REENT_MP_FREELIST(ptr))
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
|
|
|
int i;
|
2009-11-24 01:02:20 +08:00
|
|
|
for (i = 0; i < _Kmax; i++)
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
|
|
|
struct _Bigint *thisone, *nextone;
|
|
|
|
|
2002-02-03 17:24:18 +08:00
|
|
|
nextone = _REENT_MP_FREELIST(ptr)[i];
|
2000-02-18 03:39:52 +08:00
|
|
|
while (nextone)
|
|
|
|
{
|
|
|
|
thisone = nextone;
|
|
|
|
nextone = nextone->_next;
|
|
|
|
_free_r (ptr, thisone);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-02-03 17:24:18 +08:00
|
|
|
_free_r (ptr, _REENT_MP_FREELIST(ptr));
|
2000-02-18 03:39:52 +08:00
|
|
|
}
|
2006-10-11 16:04:50 +08:00
|
|
|
if (_REENT_MP_RESULT(ptr))
|
|
|
|
_free_r (ptr, _REENT_MP_RESULT(ptr));
|
2009-03-07 01:11:20 +08:00
|
|
|
#ifdef _REENT_SMALL
|
|
|
|
}
|
|
|
|
#endif
|
2000-02-18 03:39:52 +08:00
|
|
|
|
2002-02-03 17:24:18 +08:00
|
|
|
#ifdef _REENT_SMALL
|
|
|
|
if (ptr->_emergency)
|
|
|
|
_free_r (ptr, ptr->_emergency);
|
|
|
|
if (ptr->_mp)
|
|
|
|
_free_r (ptr, ptr->_mp);
|
|
|
|
if (ptr->_r48)
|
|
|
|
_free_r (ptr, ptr->_r48);
|
|
|
|
if (ptr->_localtime_buf)
|
|
|
|
_free_r (ptr, ptr->_localtime_buf);
|
|
|
|
if (ptr->_asctime_buf)
|
|
|
|
_free_r (ptr, ptr->_asctime_buf);
|
2013-06-24 19:34:03 +08:00
|
|
|
if (ptr->_signal_buf)
|
|
|
|
_free_r (ptr, ptr->_signal_buf);
|
|
|
|
if (ptr->_misc)
|
|
|
|
_free_r (ptr, ptr->_misc);
|
2013-05-09 07:13:51 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _REENT_GLOBAL_ATEXIT
|
|
|
|
/* atexit stuff */
|
|
|
|
# ifdef _REENT_SMALL
|
2009-03-07 01:11:20 +08:00
|
|
|
if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr)
|
2004-09-10 03:46:54 +08:00
|
|
|
_free_r (ptr, ptr->_atexit->_on_exit_args_ptr);
|
2013-05-09 07:13:51 +08:00
|
|
|
# else
|
2000-02-18 03:39:52 +08:00
|
|
|
if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
|
|
|
|
{
|
|
|
|
struct _atexit *p, *q;
|
|
|
|
for (p = ptr->_atexit; p != &ptr->_atexit0;)
|
|
|
|
{
|
|
|
|
q = p;
|
|
|
|
p = p->_next;
|
|
|
|
_free_r (ptr, q);
|
|
|
|
}
|
|
|
|
}
|
2013-05-09 07:13:51 +08:00
|
|
|
# endif
|
2002-02-03 17:24:18 +08:00
|
|
|
#endif
|
2000-02-18 03:39:52 +08:00
|
|
|
|
|
|
|
if (ptr->_cvtbuf)
|
|
|
|
_free_r (ptr, ptr->_cvtbuf);
|
2013-06-24 19:34:03 +08:00
|
|
|
/* 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);*/
|
2000-02-18 03:39:52 +08:00
|
|
|
|
2022-02-22 18:18:38 +08:00
|
|
|
if (ptr->__cleanup)
|
2000-02-18 03:39:52 +08:00
|
|
|
{
|
|
|
|
/* cleanup won't reclaim memory 'coz usually it's run
|
|
|
|
before the program exits, and who wants to wait for that? */
|
|
|
|
ptr->__cleanup (ptr);
|
|
|
|
|
|
|
|
if (ptr->__sglue._next)
|
|
|
|
cleanup_glue (ptr, ptr->__sglue._next);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Malloc memory not reclaimed; no good way to return memory anyway. */
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|