diff -r 000000000000 -r a41df078684a kernel/eka/euser/epoc/win32/uc_cwhelp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/euser/epoc/win32/uc_cwhelp.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,86 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// e32\euser\epoc\win32\uc_cwhelp.cpp +// This file contains the CodeWarrior specific helper code common to eexe and edll +// +// + +#include +#include + +// Define LAZY_INIT to allow the runtime to construct itself only when necessary. This uses less +// TLS indicies, but is a more fragile approach. +// +#define LAZY_INIT + +extern "C" { + +// +// Dummy versions of CodeWarrior runtime functions. +// +// These are only called when we are linked against the DLL version of the runtime, or if these +// functions aren't present in the static runtime. +// +// The original functions are defined in: +// c:/apps/Metrowerks/OEM3.1/Symbian_Support/MSL/MSL_C/MSL_Win32/Src/ThreadLocalData.c +// c:/apps/Metrowerks/OEM3.1/Symbian_Support/MSL/MSL_C/MSL_Win32/Src/startup.win32.c +// + +#ifdef LAZY_INIT + +extern int _InitializeThreadDataIndex(void); +extern int *__get_MSL_init_count(void); + +__declspec(weak) int *__get_MSL_init_count(void) + { + return NULL; + } + +#else + +extern int _CRTStartup(); + +#endif + +extern void _CleanUpMSL(void); + +} + +TBool InitCWRuntime() + { +#ifdef LAZY_INIT + return ETrue; +#else + return _CRTStartup(); +#endif + } + +TBool CleanupCWRuntime() + { +#ifdef LAZY_INIT + int* init_count_ptr = __get_MSL_init_count(); + if (!init_count_ptr) // if we couldn't link this function, don't attempt cleanup + return ETrue; + if (!_InitializeThreadDataIndex()) // make sure runtime is initialised to known state + return EFalse; + if (++(*init_count_ptr) != 1) // make it look like _CRTStartup was called + return EFalse; +#else + if (*__get_MSL_init_count() < 1) // _CRTStartup should have been called at least once + return EFalse; + *__get_MSL_init_count() = 1; // reset to one so _CleanUpMSL runs +#endif + _CleanUpMSL(); // call into runtime to do cleanup + return ETrue; + }