author | mikek |
Sun, 27 Jun 2010 21:43:55 +0100 | |
branch | GCC_SURGE |
changeset 181 | bd8f1e65581b |
parent 0 | a41df078684a |
permissions | -rw-r--r-- |
// 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\t_ldrtst.h // // #ifndef __T_LDRTST_H__ #define __T_LDRTST_H__ #define __INCLUDE_DEPENDENCY_GRAPH #include <e32svr.h> #include <e32test.h> #include "dlltree.h" #include "dllt.h" #include "exetifc.h" #include <d_ldrtst.h> #include <f32file.h> #include <f32dbg.h> #include <e32rom.h> GLREF_D RTest test; class TModuleList; class TModuleSet { public: TModuleSet(); TModuleSet(const TModuleList&, TInt aMask, TInt aVal); void Add(TInt aModule); void Remove(TInt aModule); void Remove(const TModuleList&); void Display(const TDesC& aTitle) const; inline TBool Present(TInt aModule) const { return iBitMap[aModule>>3]&(1<<(aModule&7)); } public: TInt iCount; TUint8 iBitMap[(KNumModules+7)/8]; }; class TModuleList { public: TModuleList(); void SetCount(); void Display(const TDesC& aTitle) const; TBool IsPresent(TInt aModNum) const; TInt Find(TInt aModNum) const; void Add(const SDllInfo& a); public: TInt iCount; SDllInfo iInfo[KNumModules]; }; class LoaderTest { public: static LoaderTest* New(); void Close(); void Init(); public: void TestOneByOne(); void TestMultipleExeInstances(); void TestOOM(); void TestMultipleLoads(); private: TBool IsRomAddress(TLinAddr a); TBool IsRamCodeAddress(TLinAddr a); TBool CheckDataAddress(TLinAddr a, TInt aDllNum, TInt aExeNum); TInt DetermineDllLoadResult(TInt aDllNum, TInt aExeNum); TInt DetermineDllLoadResult(TInt aDllNum, TInt aExeNum1, TInt aExeNum2); TInt DetermineLoadExe2Result(TInt aExeNum); void DumpModuleList(const TModuleList& aList, TInt aExeNum); void DumpModuleInfo(const SDllInfo& aInfo, TInt aExeNum); void CheckModuleList(TInt aRoot, const TModuleList& aList); public: void TraceOn(); void TraceOff(); private: LoaderTest(); ~LoaderTest(); public: RFs iFs; RLdrTest iDev; TUint32 iMemModelAtt; TInt iCmdLine[8]; }; const TInt KMaxHandlesPerDll=4; const TInt KMaxHandles=KMaxHandlesPerDll*KNumModules; struct SModuleInstance { TInt iAccessCount; TInt iModNum; TLinAddr iEntryPointAddress; TModuleHandle iModuleHandle; TLinAddr iData; TAny* iCodeSeg; }; class CGlobalModuleList; class CPerProcessInfo : public CBase { public: static CPerProcessInfo* New(TInt aExeNum, CGlobalModuleList& aG); virtual ~CPerProcessInfo(); void GetModuleSet(TModuleSet& aSet); void Check(); void Unlink(const SDllInfo& a, TModuleList& aList); TInt Load(TInt aDllNum); TInt AddModules(TInt aDllNum, TModuleList* aCList, TModuleList* aIList); TInt CloseHandle(TInt aHandle); private: CPerProcessInfo(); TInt Init(); public: TInt iExeNum; TRequestStatus iStatus; RProcess iProcess; RLoaderTest iSession; RLdrTest iDev; CGlobalModuleList* iGlobalList; TInt iModuleNum[KMaxHandles]; TInt iHandleCount[KNumModules]; SModuleInstance* iModules[KNumModules]; }; class CGlobalModuleList : public CBase { public: static CGlobalModuleList* New(const LoaderTest&); virtual ~CGlobalModuleList(); void Close(SModuleInstance* a); void Free(SModuleInstance* a); SModuleInstance* GetMI(); TAny* CodeSegFromHandle(TModuleHandle aModHandle); void CheckAll(); TInt Load(TInt aExeNum, TInt aDllNum); TInt CloseHandle(TInt aExeNum, TInt aDllNum); private: CGlobalModuleList(); void Init(); public: TInt iMaxModules; TInt iNumExes; TInt iFixedExes; TInt iParam; RLdrTest iDev; TUint32 iMemModelAtt; CPerProcessInfo* iPPInfo[KNumModules]; RPointerArray<SModuleInstance> iModules; SModuleInstance* iModuleAlloc; SModuleInstance* iFreeModules; }; #endif