diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cstdlib/USTLIB/ESTLIB.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/USTLIB/ESTLIB.CPP Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,214 @@ +// Copyright (c) 1997-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: +// + +#include "POSIXIF.H" + +// Category for the panic. +_LIT(KEstlibInit, "ESTLIB-INIT"); + +// Access for the outside world +extern "C" { + +EXPORT_C void CloseSTDLIB() + { + struct _reent* p=(struct _reent*)Dll::Tls(); + if (p==0) + return; + _reclaim_reent(p); // Reclaiming calls the atexit processing and generally tries to tidy up + User::Free(p); // then we give back the struct _reent itself + Dll::SetTls(0); // ... so we don't free it again when the DLL exits + } + +/** +Allocates memory for the library globals struct and returns a pointer to it. If the +memory has been allocated previously then it simply returns a pointer to the memory. +Panics if any error/failure occurs. + +@return On Success, a pointer to the memory containing the library globals. +*/ +EXPORT_C struct _reent *ImpurePtr(void) + { + struct _reent* p=(struct _reent*)Dll::Tls(); + if (p) + return p; // Memory is already allocated for the library globals. + + // First use, so construct the default struct _reent and the associated SystemInterface + p=(struct _reent*)User::Alloc(sizeof(struct _reent)); + if(p ==0) + { + User::Panic(KEstlibInit,KErrNoMemory); + } + + TInt err= Dll::SetTls(p); + + if (err != KErrNone) + { + delete p; + p = 0; + Dll::FreeTls(); + User::Panic(KEstlibInit, err); + } + + void* sysIf=0; + + CProcessSystemInterface* pSysIf=new CProcessSystemInterface; + if (pSysIf && pSysIf->Connect()==KErrNone) + { + sysIf=pSysIf; + } + else + { + delete pSysIf; + pSysIf = 0; + + CTrapCleanup *cleanup = NULL; + if(User::TrapHandler() == NULL) + { + cleanup = CTrapCleanup::New(); + if(cleanup != NULL) + { + //use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface + TRAP(err, sysIf = static_cast (CLocalSystemInterface::NewL())); + } + else + { + err = KErrNoMemory; + } + delete cleanup; + } + else + { + //use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface + TRAP(err, sysIf = static_cast (CLocalSystemInterface::NewL())); + } + } + + if (err != KErrNone) + { + delete p; + p = 0; + Dll::FreeTls(); + User::Panic(KEstlibInit, err); + } + + Mem::FillZ(p,sizeof(struct _reent)); + _init_reent(p,sysIf); + + return p; + } + +/** +This is a panic free version of ImpurePtr. It allocates memory for the library globals +struct and returns a pointer to it. If the memory has been allocated previously then it +simply returns a pointer to the memory. +If there is not enough memory available to set up the library globals or other error occurs, +a NULL pointer will be returned. + +@return On Success, a pointer to the memory containing the library globals. + On Failure, a NULL pointer. +*/ +EXPORT_C struct _reent * ImpurePtr2(void) + { + struct _reent* p = (struct _reent*)Dll::Tls(); + if (p) + return p; // Memory is already allocated for the library globals. + + // First use, so construct the default struct _reent and the associated SystemInterface + p =(struct _reent*)User::Alloc(sizeof(struct _reent)); + if (p== 0) + return p ; // NULL + + if (Dll::SetTls(p)) + { + delete p; + p = 0; + Dll::FreeTls(); + return p; // NULL + } + + void* sysIf=0; + CProcessSystemInterface* pSysIf=new CProcessSystemInterface; + if (pSysIf && pSysIf->Connect()==KErrNone) + { + sysIf=pSysIf; + } + else + { + TInt err=KErrNone; + delete pSysIf; + pSysIf = 0; + + CTrapCleanup *cleanup = NULL; + if(User::TrapHandler() == NULL) + { + cleanup = CTrapCleanup::New(); + if(cleanup != NULL) + { + //use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface + TRAP(err, sysIf = static_cast (CLocalSystemInterface::NewL())); + } + delete cleanup; + } + else + { + //use static_cast to perform the valid conversion from CLocalSystemInterface to base class MSystemInterface + TRAP(err, sysIf = static_cast (CLocalSystemInterface::NewL())); + } + } + + if (!sysIf) + { + delete p; + p = 0; + Dll::FreeTls(); + return p; // NULL + } + + Mem::FillZ(p,sizeof(struct _reent)); + _init_reent(p,sysIf); + + return p; // Library globals have been set up correctly. + } + + +EXPORT_C int *__errno(void) + { + return &(ImpurePtr()->_errno); + } + +EXPORT_C void _exit (int status) _ATTRIBUTE((noreturn)) + { + struct _reent* p=(struct _reent*)Dll::Tls(); + if (p) + { + MSystemInterface& sysIf=Interface(p); + sysIf.TerminateProcess(status); + } + RProcess().Terminate(status); // just in case + } + +} // extern "C" + +#ifndef EKA2 +GLDEF_C TInt E32Dll(TDllReason) +// +// DLL entry point +// + { + + return KErrNone; + } +#endif +