--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/loader/dllt.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,238 @@
+// Copyright (c) 1999-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:
+// f32test\loader\dllt.cpp
+//
+//
+
+#include <e32svr.h>
+#include "dllt.h"
+#include <d_ldrtst.h>
+
+#ifdef __VC32__
+#pragma warning(disable:4706)
+#endif
+
+extern "C" TInt _E32Dll(TInt);
+
+extern "C" __MODULE_EXPORT TInt INITFUNC(MDllList&);
+extern "C" __MODULE_EXPORT TInt CHKCFUNC();
+extern "C" __MODULE_EXPORT TInt RBLKIFUNC(TInt, TInt);
+
+extern "C" __MODULE_IMPORT TInt BLKIFUNC(TInt);
+
+#ifdef __DLL_LINK_TO_EXE
+extern "C" IMPORT_C void RegisterConstructorCall(TInt aDllNum);
+extern "C" IMPORT_C void RegisterInitCall(TInt aDllNum);
+extern "C" IMPORT_C void RegisterDestructorCall(TInt aDllNum);
+#endif
+
+void GetDllInfo(SDllInfo& aInfo)
+ {
+ aInfo.iDllNum=DLLNUM;
+ aInfo.iEntryPointAddress=((TInt)&_E32Dll);
+ RLdrTest ldd;
+ ldd.Open();
+ aInfo.iModuleHandle=ldd.ModuleHandleFromAddr((TInt)&_E32Dll);
+ ldd.Close();
+ }
+
+#ifdef __MODULE_HAS_DATA
+class TDllData
+ {
+public:
+ TDllData();
+ ~TDllData();
+public:
+ TTime iStartTime;
+ TTime iInitTime;
+ TInt iTest1;
+ TFileName iFileName;
+ RLibrary iLib;
+ };
+
+class TDllData2
+ {
+public:
+ TDllData2();
+ ~TDllData2();
+public:
+ TInt iTest2;
+ };
+
+TInt Bss[16];
+TInt DllNum=DLLNUM;
+TInt Generation=0;
+TInt InitFlag=0;
+TInt CDFlag=0;
+TFullName StartThread=RThread().FullName();
+TName StartProcess=RProcess().Name();
+TDllData TheDllDataObject;
+TDllData2 TheDllDataObject2;
+
+void AddToCDList()
+ {
+ MDllList* pM=(MDllList*)UserSvr::DllTls(TLS_INDEX);
+ if (pM)
+ {
+ SDllInfo di;
+ GetDllInfo(di);
+ pM->Add(di);
+ }
+ }
+
+TDllData::TDllData()
+ {
+ CDFlag|=1;
+ if (CDFlag==3)
+ AddToCDList();
+#ifndef __DLL_IN_CYCLE
+ TInt r;
+ CHKDEPS(r); // Check our dependencies are initialised
+ if (r!=KErrNone)
+ User::Panic(_L("CHKDEPS"),r);
+#endif
+ iStartTime.HomeTime();
+ iTest1=299792458;
+ Dll::FileName(iFileName);
+#ifdef __DLL_LINK_TO_EXE
+ RegisterConstructorCall(DLLNUM);
+#endif
+ }
+
+TDllData::~TDllData()
+ {
+ CDFlag|=4;
+ if (CDFlag==15)
+ AddToCDList();
+#ifdef __DLL_LINK_TO_EXE
+ RegisterDestructorCall(DLLNUM);
+#endif
+ iLib.Close();
+ }
+
+TDllData2::TDllData2()
+ {
+ CDFlag|=2;
+ if (CDFlag==3)
+ AddToCDList();
+ iTest2=DLLNUM^0x3bb;
+ iTest2*=iTest2;
+ }
+
+TDllData2::~TDllData2()
+ {
+ CDFlag|=8;
+ if (CDFlag==15)
+ AddToCDList();
+ }
+#endif
+
+#ifdef __MODULE_HAS_DATA
+void RecordInitCall()
+ {
+ TheDllDataObject.iInitTime.HomeTime();
+ }
+#endif
+
+extern "C" __MODULE_EXPORT TInt INITFUNC(MDllList& aList)
+ {
+ TInt r=KErrNone;
+ SDllInfo info;
+ GetDllInfo(info);
+ if (!aList.IsPresent(info))
+ {
+ TInt pos=aList.Add(info);
+ INITDEPS(r,aList); // Call Init on our dependencies
+ aList.MoveToEnd(pos);
+#ifdef __MODULE_HAS_DATA
+ if (r==KErrNone)
+ r=CHKCFUNC(); // Check initial values for .data/.bss and check constructors have been called
+ if (r==KErrNone)
+ RecordInitCall();
+#endif
+#ifdef __DLL_LINK_TO_EXE
+ RegisterInitCall(DLLNUM);
+#endif
+ }
+ return r;
+ }
+
+extern "C" __MODULE_EXPORT TInt CHKCFUNC()
+ {
+#ifdef __MODULE_HAS_DATA
+ TInt i;
+ TInt x=0;
+ for (i=0; i<16; ++i) x|=Bss[i];
+ if (x)
+ return 0x425353;
+ if (DllNum!=DLLNUM)
+ return 0x44415441;
+ if (TheDllDataObject.iTest1!=299792458)
+ return 0x54455354;
+ x=DLLNUM^0x3bb;
+ x*=x;
+ if (x!=TheDllDataObject2.iTest2)
+ return 0x54535432;
+ TInt init_mark=~((DLLNUM+DLLNUMOFFSET)*(DLLNUM+DLLNUMOFFSET));
+ if (InitFlag==init_mark)
+ return KErrNone;
+ if (InitFlag!=0)
+ return 0x494e4946;
+ if (Generation!=0)
+ return 0x47454e;
+ if (StartProcess!=RProcess().Name())
+ return 0x535450;
+ TFileName fn;
+ Dll::FileName(fn);
+ if (fn!=TheDllDataObject.iFileName)
+ return 0x464e414d;
+ InitFlag=init_mark;
+ RDebug::Print(_L("ChkC %S OK"),&fn);
+#endif
+ return KErrNone;
+ }
+
+extern "C" __MODULE_EXPORT TInt GetGeneration()
+ {
+#ifdef __MODULE_HAS_DATA
+ return Generation;
+#else
+ return 0;
+#endif
+ }
+
+extern "C" __MODULE_EXPORT TInt RBLKIFUNC(TInt aInput, TInt aGeneration)
+ {
+ (void)aGeneration;
+#ifdef __MODULE_HAS_DATA
+ TInt r=aInput;
+ if (aGeneration!=Generation)
+ {
+ Generation=aGeneration;
+ r=BLKIFUNC(aInput);
+ RBLKIFUNC_DEPS(r,aGeneration);
+ }
+ return r;
+#else
+ return aInput;
+#endif
+ }
+
+extern "C" __MODULE_EXPORT void SetCloseLib(TInt aLibHandle)
+ {
+ (void)aLibHandle;
+#ifdef __MODULE_HAS_DATA
+ TheDllDataObject.iLib.SetHandle(aLibHandle);
+#endif
+ }