OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libc/] [reent/] [reent.c] - Diff between revs 148 and 158

Only display areas with differences | Details | Blame | View Log

Rev 148 Rev 158
/*
/*
FUNCTION
FUNCTION
        <<reent>>---definition of impure data.
        <<reent>>---definition of impure data.
 
 
INDEX
INDEX
        reent
        reent
 
 
DESCRIPTION
DESCRIPTION
        This module defines the impure data area used by the
        This module defines the impure data area used by the
        non-reentrant functions, such as strtok.
        non-reentrant functions, such as strtok.
*/
*/
 
 
#include <stdlib.h>
#include <stdlib.h>
#include <reent.h>
#include <reent.h>
 
 
#ifdef _REENT_ONLY
#ifdef _REENT_ONLY
#ifndef REENTRANT_SYSCALLS_PROVIDED
#ifndef REENTRANT_SYSCALLS_PROVIDED
#define REENTRANT_SYSCALLS_PROVIDED
#define REENTRANT_SYSCALLS_PROVIDED
#endif
#endif
#endif
#endif
 
 
#ifndef REENTRANT_SYSCALLS_PROVIDED
#ifndef REENTRANT_SYSCALLS_PROVIDED
 
 
/* We use the errno variable used by the system dependent layer.  */
/* We use the errno variable used by the system dependent layer.  */
#undef errno
#undef errno
int errno;
int errno;
 
 
#endif
#endif
 
 
/* Interim cleanup code */
/* Interim cleanup code */
 
 
void
void
_DEFUN (cleanup_glue, (ptr, glue),
_DEFUN (cleanup_glue, (ptr, glue),
     struct _reent *ptr _AND
     struct _reent *ptr _AND
     struct _glue *glue)
     struct _glue *glue)
{
{
  /* Have to reclaim these in reverse order: */
  /* Have to reclaim these in reverse order: */
  if (glue->_next)
  if (glue->_next)
    cleanup_glue (ptr, glue->_next);
    cleanup_glue (ptr, glue->_next);
 
 
  _free_r (ptr, glue);
  _free_r (ptr, glue);
}
}
 
 
void
void
_DEFUN (_reclaim_reent, (ptr),
_DEFUN (_reclaim_reent, (ptr),
     struct _reent *ptr)
     struct _reent *ptr)
{
{
  if (ptr != _impure_ptr)
  if (ptr != _impure_ptr)
    {
    {
      /* used by mprec routines. */
      /* used by mprec routines. */
#ifdef _REENT_SMALL
#ifdef _REENT_SMALL
      if (ptr->_mp)     /* don't bother allocating it! */
      if (ptr->_mp)     /* don't bother allocating it! */
#endif
#endif
      if (_REENT_MP_FREELIST(ptr))
      if (_REENT_MP_FREELIST(ptr))
        {
        {
          int i;
          int i;
          for (i = 0; i < 15 /* _Kmax */; i++)
          for (i = 0; i < 15 /* _Kmax */; i++)
            {
            {
              struct _Bigint *thisone, *nextone;
              struct _Bigint *thisone, *nextone;
 
 
              nextone = _REENT_MP_FREELIST(ptr)[i];
              nextone = _REENT_MP_FREELIST(ptr)[i];
              while (nextone)
              while (nextone)
                {
                {
                  thisone = nextone;
                  thisone = nextone;
                  nextone = nextone->_next;
                  nextone = nextone->_next;
                  _free_r (ptr, thisone);
                  _free_r (ptr, thisone);
                }
                }
            }
            }
 
 
          _free_r (ptr, _REENT_MP_FREELIST(ptr));
          _free_r (ptr, _REENT_MP_FREELIST(ptr));
        }
        }
      if (_REENT_MP_RESULT(ptr))
      if (_REENT_MP_RESULT(ptr))
        _free_r (ptr, _REENT_MP_RESULT(ptr));
        _free_r (ptr, _REENT_MP_RESULT(ptr));
 
 
#ifdef _REENT_SMALL
#ifdef _REENT_SMALL
      if (ptr->_emergency)
      if (ptr->_emergency)
        _free_r (ptr, ptr->_emergency);
        _free_r (ptr, ptr->_emergency);
      if (ptr->_mp)
      if (ptr->_mp)
        _free_r (ptr, ptr->_mp);
        _free_r (ptr, ptr->_mp);
      if (ptr->_r48)
      if (ptr->_r48)
        _free_r (ptr, ptr->_r48);
        _free_r (ptr, ptr->_r48);
      if (ptr->_localtime_buf)
      if (ptr->_localtime_buf)
        _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);
      if (ptr->_atexit->_on_exit_args_ptr)
      if (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 */
      /* atexit stuff */
      if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
      if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0))
        {
        {
          struct _atexit *p, *q;
          struct _atexit *p, *q;
          for (p = ptr->_atexit; p != &ptr->_atexit0;)
          for (p = ptr->_atexit; p != &ptr->_atexit0;)
            {
            {
              q = p;
              q = p;
              p = p->_next;
              p = p->_next;
              _free_r (ptr, q);
              _free_r (ptr, q);
            }
            }
        }
        }
#endif
#endif
 
 
      if (ptr->_cvtbuf)
      if (ptr->_cvtbuf)
        _free_r (ptr, ptr->_cvtbuf);
        _free_r (ptr, ptr->_cvtbuf);
 
 
      if (ptr->__sdidinit)
      if (ptr->__sdidinit)
        {
        {
          /* cleanup won't reclaim memory 'coz usually it's run
          /* cleanup won't reclaim memory 'coz usually it's run
             before the program exits, and who wants to wait for that? */
             before the program exits, and who wants to wait for that? */
          ptr->__cleanup (ptr);
          ptr->__cleanup (ptr);
 
 
          if (ptr->__sglue._next)
          if (ptr->__sglue._next)
            cleanup_glue (ptr, ptr->__sglue._next);
            cleanup_glue (ptr, ptr->__sglue._next);
        }
        }
 
 
      /* Malloc memory not reclaimed; no good way to return memory anyway. */
      /* Malloc memory not reclaimed; no good way to return memory anyway. */
 
 
    }
    }
}
}
 
 
/*
/*
 *  Do atexit() processing and cleanup
 *  Do atexit() processing and cleanup
 *
 *
 *  NOTE:  This is to be executed at task exit.  It does not tear anything
 *  NOTE:  This is to be executed at task exit.  It does not tear anything
 *         down which is used on a global basis.
 *         down which is used on a global basis.
 */
 */
 
 
void
void
_DEFUN (_wrapup_reent, (ptr), struct _reent *ptr)
_DEFUN (_wrapup_reent, (ptr), struct _reent *ptr)
{
{
  register struct _atexit *p;
  register struct _atexit *p;
  register int n;
  register int n;
 
 
  if (ptr == 0)
  if (ptr == 0)
      ptr = _REENT;
      ptr = _REENT;
 
 
#ifdef _REENT_SMALL
#ifdef _REENT_SMALL
  for (p = &ptr->_atexit, n = p->_ind; --n >= 0;)
  for (p = &ptr->_atexit, n = p->_ind; --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
  if (ptr->__cleanup)
  if (ptr->__cleanup)
    (*ptr->__cleanup) (ptr);
    (*ptr->__cleanup) (ptr);
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.