kernel/eka/include/win32atx.h
changeset 0 a41df078684a
--- /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