diff -r e20de85af2ee -r ce057bb09d0b genericopenlibs/cstdlib/LSTDLIB/REENT.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/LSTDLIB/REENT.CPP Fri Jun 04 16:20:51 2010 +0100 @@ -0,0 +1,109 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// FUNCTION +// <>---definition of impure data. +// INDEX +// reent +// This module defines the impure data area used by the +// non-rentrant functions, such as strtok. +// +// + +#include "SYSIF.H" +#include +#include + +/* Interim cleanup code */ + +static void cleanup_glue (struct _glue *glue) + { + /* Have to reclaim these in reverse order: */ + if (glue->_next) + cleanup_glue (glue->_next); + free (glue); + } + +extern "C" { + +/** +The struct _reent is managed on a per-thread basis by EPOC32, so there is no +global variable _impure_pointer and everyone has to use _REENT (panics in the +event of an error) or REENT2 (which returns a NULL pointer in the event of an +error). + +@return +@param ptr +*/ +EXPORT_C void +_reclaim_reent (struct _reent *ptr) + { + /* atexit stuff */ + if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0)) + { + struct _atexit *p, *q; + for (p = ptr->_atexit; p != &ptr->_atexit0;) + { + q = p; + p = p->_next; + free(q); + } + } + + if (ptr->environ) + free(ptr->environ); + + if (ptr->_netdb) + free(ptr->_netdb); + + if (ptr->__sdidinit) + { + /* 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->__sglue._next); + } + + // narrow environment buffer + if (ptr->_pNarrowEnvBuffer) + { + free(ptr->_pNarrowEnvBuffer); + ptr->_pNarrowEnvBuffer = 0; + } + + MSystemInterface& sysIf=Interface(ptr); + sysIf.Release(); + + ptr->_system=0; + } + +EXPORT_C void _REENT_INIT(struct _reent *ptr) + { + MSystemInterface& sysIf=Interface(ImpurePtr()); + _init_reent(ptr,&sysIf.Clone()); + } + +extern "C" void __sinit(struct _reent*); // LSTDIO/LOCAL.H + +EXPORT_C void _init_reent(struct _reent *ptr, void* _system) + { + ptr->_system=_system; + __sinit(ptr); + ptr->_next[0]=1; + ptr->_next[1]=1; + + ptr->_pNarrowEnvBuffer = 0; + } + +} // extern "C"