diff -r 000000000000 -r a41df078684a kernel/eka/include/win32atx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/win32atx.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,116 @@ +// Copyright (c) 1995-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\include\win32atx.h +// +// + +/** + @file + @internalComponent +*/ + +#ifndef __WIN32ATX_H__ +#define __WIN32ATX_H__ + +#if defined(__VC32__) + +#define MAX_ATEXIT_HANDLERS 255 + +#ifdef __KERNEL_MODE__ +#define PANIC() Kern::Fault("ATEXIT", __LINE__) +#else +_LIT(KLitAtExitPanic,"ATEXIT"); +#define PANIC() User::Panic(KLitAtExitPanic, __LINE__) +#endif + +extern "C" { +typedef void (__cdecl* TAtExit)(void); +static TUint sp=0; +static TAtExit handlers[MAX_ATEXIT_HANDLERS]; + +int atexit(TAtExit aFunc) + { + if (sp>=MAX_ATEXIT_HANDLERS) + PANIC(); + handlers[sp++]=aFunc; + return 0; + } + +void __call_atexit_handlers() + { + while(sp) + (*handlers[--sp])(); + } + +#pragma data_seg(".CRT$XPU") +TAtExit __xp_a[] = { __call_atexit_handlers }; + +} + +#elif defined(__CW32__) + +struct SDestructorEntry + { + SDestructorEntry* iNext; + TAny* iDstrFn; + TAny* iObj; + }; + +SDestructorEntry* DEListHead; + +extern "C" { + +void* __register_global_object(void* obj, void* dfn, void* entry) + { + SDestructorEntry* e = (SDestructorEntry*)entry; + e->iNext = DEListHead; + e->iDstrFn = dfn; + e->iObj = obj; + DEListHead = e; + return obj; + } + +__declspec(naked) void __destroy_global_chain(void) + { + _asm push ebp + _asm mov ebp, esp + _asm push ebx + _asm lea ebx, DEListHead + dgc1: + _asm mov ebx, [ebx] + _asm test ebx, ebx + _asm jz dgc0 + _asm mov ecx, [ebx+8] + _asm call dword ptr [ebx+4] + _asm jmp dgc1 + dgc0: + _asm lea ebx, DEListHead + _asm mov [ebx], 0 + _asm pop ebx + _asm mov esp, ebp + _asm pop ebp + _asm ret + } + +#pragma data_seg(".CRT$XPU") +void (*__xp_a[])(void) = { &__destroy_global_chain }; +} + +#elif defined(__GCC32__) +// todo: figure out what to do here +#else +#error Unknown X86 compiler +#endif + +#endif