os/kernelhwsrv/kerneltest/f32test/demandpaging/loader/t_pageldrtst.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// f32test\demandpaging\loader\t_pageldrtst.cpp
sl@0
    15
// Demand Paging Loader Stress Tests
sl@0
    16
// Demand Paging Loader stress tests attempt to cause as much paging as possible
sl@0
    17
// whilst putting the system various types of load.
sl@0
    18
// t_pageldrtst.exe is the root of the tests, it in turn will start copies of 
sl@0
    19
// itself stored in various types of media (t_pageldrtst_rom.exe for example).
sl@0
    20
// It also loads DLLs from various media, each DLL containing simple functions 
sl@0
    21
// that are aligned on page boundaries, so each function call is likely to 
sl@0
    22
// cause a page fault.
sl@0
    23
// Usage:
sl@0
    24
// t_pageldrtst and t_pageldrtst_rom
sl@0
    25
// Common command lines:
sl@0
    26
// t_pageldrtst - run the auto test suite
sl@0
    27
// t_pageldrtst lowmem - run the low memory tests
sl@0
    28
// t_pageldrtst chunks - run the chunk tests
sl@0
    29
// t_pageldrtst chunks+ - run the chunk tests (same as used in autotest)
sl@0
    30
// t_pageldrtst echunks - run the really stressful chunk tests
sl@0
    31
// t_pageldrtst auto debug - run the autotest but with debug output to the serial port
sl@0
    32
// t_pageldrtst d_exc - run the d_exc tests
sl@0
    33
// Arguments:
sl@0
    34
// single - run the tests in a single thread
sl@0
    35
// multiple <numThreads> - run the tests in multiple threads where <numThreads>
sl@0
    36
// auto - dummy param to trick the tests into running the auto test suite with extra params
sl@0
    37
// fullauto - param to make the tests perform the full automatic stress test
sl@0
    38
// interleave - force thread interleaving
sl@0
    39
// prio - each thread reschedules in between each function call, causes lots of context changes
sl@0
    40
// media - perform media access during the tests, very stressful
sl@0
    41
// mmc - only use the mmc media for media access to test file caching
sl@0
    42
// min - min cache size in pages
sl@0
    43
// max - max cache size in pages
sl@0
    44
// chunks - simple chunk stress tests
sl@0
    45
// chunks+ - the chunk auto tests
sl@0
    46
// echunks - extremem chunks tests
sl@0
    47
// nochunkdata - don't check the integrity of the data in the chunks
sl@0
    48
// lowmem - low memory tests
sl@0
    49
// dll - only load dll's
sl@0
    50
// exe - only start exe's (t_pagestress)
sl@0
    51
// self - only start copies of self (t_pageldrtst from various media)
sl@0
    52
// complete - dll, exe and self.
sl@0
    53
// rom - only load from ROM
sl@0
    54
// base - only load the base DLL and exe's (from code)
sl@0
    55
// mixed - rom and base.
sl@0
    56
// all_media - load dlls and exes from all media
sl@0
    57
// debug - switch on debugging information
sl@0
    58
// silent - no output to the screen or serial port
sl@0
    59
// noclean - don't delete copied files on exit
sl@0
    60
// d_exc - run the d_exc tests
sl@0
    61
// global - load dlls once globally
sl@0
    62
// thread - load dlls once per thread
sl@0
    63
// func - load dlls in the test function (default and most stressful)
sl@0
    64
// forward - patern in which to execute function calls 
sl@0
    65
// backward - patern in which to execute function calls 			
sl@0
    66
// random - patern in which to execute function calls 			
sl@0
    67
// all - patern in which to execute function calls (forward, backward and random)
sl@0
    68
// inst - for debugging a parameter passed to a spawned exe to give it an id.
sl@0
    69
// iters <count> - the number of times to loop (a '-' means run forever)
sl@0
    70
// reaper - test the reaper.
sl@0
    71
// btrace - test the btrace code.
sl@0
    72
// defrag - test the ram defrag code.
sl@0
    73
// stressfree - set the page cache to stress free size and run tests.
sl@0
    74
// t_pageldrtst causes a large ammount of paging by repeatedly calling 
sl@0
    75
// functions from multiple DLLs which include 64 functions which have 
sl@0
    76
// been aligned on page boundaries from multiple threads, whilst causing 
sl@0
    77
// background paging by spawning copies of itself and t_pagestress.
sl@0
    78
// The test also endeavours to stress the loader by loading and unloading
sl@0
    79
// DLLs from multiple threads from various types of media at the same 
sl@0
    80
// time as stressing the media, testing chunks, the reaper and changing
sl@0
    81
// thread priorities.
sl@0
    82
// 002 Load thrashing, test rapid loading and unloading of DLLs from 
sl@0
    83
// multiple threads (DEF100158)
sl@0
    84
// 003 Multiple threads loading DLLs in random pattern
sl@0
    85
// 004 Multiple threads loading EXE, SELF and DLLs in random pattern with
sl@0
    86
// all media, loaded in thread with prio change
sl@0
    87
// 005 Multiple threads loading EXE, SELF and DLLs in random pattern with
sl@0
    88
// all media, loaded globally with prio change
sl@0
    89
// 006 Multiple threads loading EXE, SELF and DLLs in random pattern with
sl@0
    90
// all media, loaded in func with process interleaving
sl@0
    91
// 007 Multiple threads loading EXE, SELF and DLLs in random pattern with
sl@0
    92
// all media, loaded in func with process interleaving, prio change
sl@0
    93
// and media access
sl@0
    94
// 008 Low Memory setup test
sl@0
    95
// 009 Low Memory, Multiple threads loading EXE, SELF and DLLs in random 
sl@0
    96
// pattern, loaded in func.
sl@0
    97
// 010 Low Memory setup test
sl@0
    98
// 011 Low Memory, Multiple threads loading EXE, SELF and DLLs in random 
sl@0
    99
// pattern, loaded in func with process interleaving, 
sl@0
   100
// prio change and media access
sl@0
   101
// 012 Close test driver
sl@0
   102
// 013 Chunk tests, Multiple threads loading EXE, SELF and DLLs in random 
sl@0
   103
// pattern with ROM / ROFS media, loaded in func with prio change 
sl@0
   104
// 014 Reaper tests with Multiple threads loading EXE, SELF and DLLs in random 
sl@0
   105
// pattern with all media 
sl@0
   106
// 015 Reaper tests with Multiple threads loading EXE, SELF and DLLs in random 
sl@0
   107
// pattern with all media, prio change and process interleaving
sl@0
   108
// 016 d_exc check test
sl@0
   109
// 
sl@0
   110
//
sl@0
   111
sl@0
   112
//! @SYMTestCaseID			KBASE-T_PAGELDRTST-0326
sl@0
   113
//! @SYMTestType			UT
sl@0
   114
//! @SYMPREQ				PREQ1110
sl@0
   115
//! @SYMTestCaseDesc		Demand Paging Loader Stress Tests
sl@0
   116
//! @SYMTestActions			001 Demand Paging loader stress tests...
sl@0
   117
//! @SYMTestExpectedResults All tests should pass.
sl@0
   118
//! @SYMTestPriority        High
sl@0
   119
//! @SYMTestStatus          Implemented
sl@0
   120
sl@0
   121
#include <e32test.h>
sl@0
   122
#include <e32rom.h>
sl@0
   123
#include <e32svr.h>
sl@0
   124
#include <u32hal.h>
sl@0
   125
#include <f32file.h>
sl@0
   126
#include <f32dbg.h>
sl@0
   127
#include <e32msgqueue.h>
sl@0
   128
#include <e32math.h>
sl@0
   129
#include <e32btrace.h>
sl@0
   130
#include <d32btrace.h>
sl@0
   131
#include <d32locd.h>
sl@0
   132
#include <hal.h>
sl@0
   133
sl@0
   134
#include "t_hash.h"
sl@0
   135
#include "paging_info.h"
sl@0
   136
sl@0
   137
#ifndef TEST_AUTOTEST
sl@0
   138
#define TEST_RUN_REAPERTEST
sl@0
   139
#define TEST_RUN_LOWMEMTEST
sl@0
   140
#define TEST_RUN_DEFRAGTEST
sl@0
   141
#define TEST_RUN_D_EXCTEST
sl@0
   142
#define TEST_RUN_CHUNKTEST
sl@0
   143
#define TEST_RUN_AUTOTEST
sl@0
   144
RTest test(_L("T_PAGELDRTST"));
sl@0
   145
#else
sl@0
   146
#ifdef TEST_RUN_REAPERTEST
sl@0
   147
RTest test(_L("T_PAGELDRTST_REAPER"));
sl@0
   148
#endif
sl@0
   149
#ifdef TEST_RUN_LOWMEMTEST
sl@0
   150
RTest test(_L("T_PAGELDRTST_LOWMEM"));
sl@0
   151
#endif
sl@0
   152
#ifdef TEST_RUN_DEFRAGTEST
sl@0
   153
RTest test(_L("T_PAGELDRTST_DEFRAG"));
sl@0
   154
#endif
sl@0
   155
#ifdef TEST_RUN_D_EXCTEST
sl@0
   156
RTest test(_L("T_PAGELDRTST_D_EXC"));
sl@0
   157
#endif
sl@0
   158
#ifdef TEST_RUN_CHUNKTEST
sl@0
   159
RTest test(_L("T_PAGELDRTST_CHUNK"));
sl@0
   160
#endif
sl@0
   161
#ifdef TEST_RUN_AUTOTEST
sl@0
   162
RTest test(_L("T_PAGELDRTST_AUTO"));
sl@0
   163
#endif
sl@0
   164
#endif //TEST_AUTOTEST
sl@0
   165
sl@0
   166
const TInt KMessageBufSize = 80;
sl@0
   167
typedef TBuf<KMessageBufSize> TMessageBuf;
sl@0
   168
sl@0
   169
//#define TEST_SHORT_TEST
sl@0
   170
//#define TEST_THRASHING_TEST
sl@0
   171
//#define TEST_ADD_FAT_MEDIA
sl@0
   172
#define TEST_DONT_RESET_STATS
sl@0
   173
#define TEST_MINIMAL_STATS
sl@0
   174
//#define TEST_KERN_HEAP
sl@0
   175
#define TEST_ADD_FRAGD_MEDIA
sl@0
   176
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   177
#endif
sl@0
   178
sl@0
   179
#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
sl@0
   180
//#define WANT_FS_CACHE_STATS 
sl@0
   181
#endif
sl@0
   182
sl@0
   183
#ifdef __X86__
sl@0
   184
#define TEST_ON_UNPAGED
sl@0
   185
#define TEST_NO_DEXC_IN_AUTO
sl@0
   186
#endif
sl@0
   187
sl@0
   188
sl@0
   189
#include "t_pagestress.h"
sl@0
   190
#include "t_pageldrtstdll.h"
sl@0
   191
sl@0
   192
#include "t_ramstress.h"
sl@0
   193
sl@0
   194
TBool		TestDebug					= EFalse;
sl@0
   195
TBool		TestSilent					= EFalse;
sl@0
   196
TBool		TestExit					= EFalse;
sl@0
   197
#define TEST_EXE			0x01
sl@0
   198
#define TEST_DLL			0x02
sl@0
   199
#define TEST_SELF			0x04
sl@0
   200
#define TEST_EXE_SELF		(TEST_EXE | TEST_SELF)
sl@0
   201
#define TEST_EXE_SELF_DLL	(TEST_EXE | TEST_SELF | TEST_DLL)
sl@0
   202
TInt		TestLoading				    = TEST_EXE_SELF_DLL;
sl@0
   203
sl@0
   204
#define TEST_MEDIA_BASE			(1 << KTestMediaBase)
sl@0
   205
#define TEST_MEDIA_ROM			(1 << KTestMediaRom)
sl@0
   206
#define TEST_MEDIA_ROFS			(1 << KTestMediaRofs)
sl@0
   207
#define TEST_MEDIA_EXT			(1 << KTestMediaExt)
sl@0
   208
#define TEST_MEDIA_FAT			(1 << KTestMediaFat)
sl@0
   209
#define TEST_MEDIA_MMC			(1 << KTestMediaMmc)
sl@0
   210
#define TEST_MEDIA_ROM_BASE		(TEST_MEDIA_ROM | TEST_MEDIA_BASE)
sl@0
   211
#define TEST_MEDIA_ALL		(TEST_MEDIA_ROM | TEST_MEDIA_BASE | TEST_MEDIA_ROFS | TEST_MEDIA_EXT | TEST_MEDIA_MMC)
sl@0
   212
sl@0
   213
typedef enum
sl@0
   214
{
sl@0
   215
	KTestMediaBase = 0,
sl@0
   216
	KTestMediaRom,
sl@0
   217
	KTestMediaExt,
sl@0
   218
	KTestMediaRofs,
sl@0
   219
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   220
	KTestMediaFat,  // this is the last one that is always present.
sl@0
   221
#endif
sl@0
   222
	KTestMediaMmc,
sl@0
   223
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   224
	KTestMediaNandFrag,
sl@0
   225
	KTestMediaMmcFrag,
sl@0
   226
#endif
sl@0
   227
	KTestMediaCOUNT,
sl@0
   228
}ETestMediaType;
sl@0
   229
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   230
#define TEST_MEDIA_COUNT_HACK   (KTestMediaFat + 1)
sl@0
   231
#else
sl@0
   232
#define TEST_MEDIA_COUNT_HACK   (KTestMediaRofs + 1)
sl@0
   233
#endif
sl@0
   234
sl@0
   235
typedef enum
sl@0
   236
{
sl@0
   237
	KTestMediaAccessNone = 0,
sl@0
   238
	KTestMediaAccessBasic,
sl@0
   239
	KTestMediaAccessMultipleThreads,
sl@0
   240
	KTestMediaAccessMultiplePattern,
sl@0
   241
	KTestMediaAccessMixed,
sl@0
   242
	KTestMediaAccessCOUNT,
sl@0
   243
}ETestMediaAccess;
sl@0
   244
sl@0
   245
TInt		TestWhichMedia			    = TEST_MEDIA_ROM_BASE;
sl@0
   246
TInt		DriveNumber=-1;   // Parameter - Which drive?  -1 = autodetect.
sl@0
   247
TBool		TestSingle					= EFalse;
sl@0
   248
TBool		TestMultiple				= EFalse;
sl@0
   249
TInt		TestMaxLoops				= 20;
sl@0
   250
#define TEST_2MEDIA_THREADS		20
sl@0
   251
#define TEST_ALLMEDIA_THREADS	20
sl@0
   252
TInt		TestMultipleThreadCount		= TEST_2MEDIA_THREADS;
sl@0
   253
TInt		TestInstanceId				= 0;
sl@0
   254
TBool		TestWeAreTheTestBase        = EFalse;
sl@0
   255
TBool		TestBootedFromMmc			= EFalse;
sl@0
   256
TBool		TestOnlyFromMmc				= EFalse;
sl@0
   257
TBool		TestD_Exc					= EFalse;
sl@0
   258
TBool		TestNoClean					= EFalse;
sl@0
   259
TBool		TestFullAutoTest			= EFalse;
sl@0
   260
#define TEST_DLL_GLOBAL		0x01
sl@0
   261
#define TEST_DLL_THREAD		0x02
sl@0
   262
#define TEST_DLL_FUNC		0x04
sl@0
   263
TInt		TestLoadDllHow				= TEST_DLL_FUNC;
sl@0
   264
TBool		TestIsAutomated				= EFalse;
sl@0
   265
sl@0
   266
#define TEST_INTERLEAVE_PRIO		EPriorityMore//EPriorityRealTime //23 // KNandThreadPriority - 1
sl@0
   267
TBool		TestInterleave				= EFalse;
sl@0
   268
TFileName	TestNameBuffer;
sl@0
   269
TBool		TestPrioChange				= EFalse;
sl@0
   270
sl@0
   271
volatile TBool		TestStopMedia				= EFalse;
sl@0
   272
ETestMediaAccess TestMediaAccess        = KTestMediaAccessNone;
sl@0
   273
#define TEST_NUM_FILES		5
sl@0
   274
sl@0
   275
RSemaphore	TestMultiSem;
sl@0
   276
RMsgQueue<TMessageBuf> TestMsgQueue;
sl@0
   277
sl@0
   278
#define TEST_LM_NUM_FREE	0
sl@0
   279
#define TEST_LM_BLOCKSIZE	1
sl@0
   280
#define TEST_LM_BLOCKS_FREE	4
sl@0
   281
TBool		TestLowMem					= EFalse;
sl@0
   282
TBool		TestingLowMem				= EFalse;
sl@0
   283
RPageStressTestLdd PagestressLdd;
sl@0
   284
RRamStressTestLdd  RamstressLdd;
sl@0
   285
sl@0
   286
TBool		TestBtrace					= EFalse;
sl@0
   287
TBool		TestDefrag					= EFalse;
sl@0
   288
TBool		TestChunks					= EFalse;
sl@0
   289
TBool		TestChunksPlus				= EFalse;
sl@0
   290
TBool		TestExtremeChunks			= EFalse;
sl@0
   291
TBool		TestChunkData				= ETrue;
sl@0
   292
TBool		TestingChunks				= EFalse;
sl@0
   293
volatile TBool		TestDefragTestEnd			= EFalse;
sl@0
   294
TBool		TestingDefrag				= EFalse;
sl@0
   295
volatile TBool		TestThreadsExit				= EFalse;
sl@0
   296
TInt		TestPageSize				= 4096;
sl@0
   297
RChunk		TestChunk;
sl@0
   298
TInt		TestCommitEnd = 0;
sl@0
   299
TUint8*		TestChunkBase = NULL;
sl@0
   300
#define TEST_NUM_PAGES			64
sl@0
   301
#define TEST_NUM_CHUNK_PAGES	(TEST_NUM_PAGES * 2)
sl@0
   302
TBool		TestChunkPageState[TEST_NUM_CHUNK_PAGES];
sl@0
   303
sl@0
   304
TBool		TestReaper					= EFalse;
sl@0
   305
TBool		TestingReaper				= EFalse;
sl@0
   306
TBool		TestingReaperCleaningFiles  = EFalse;
sl@0
   307
#define TEST_REAPER_ITERS			20
sl@0
   308
#define TEST_DOT_PERIOD				30
sl@0
   309
TBool		TestStressFree				= EFalse;
sl@0
   310
TInt		TestMinCacheSize = 64 * 4096;
sl@0
   311
TInt		TestMaxCacheSize = 128 * 4096;
sl@0
   312
TBool		TestIsDemandPaged = ETrue;
sl@0
   313
#define TEST_MAX_ZONE_THREADS		8
sl@0
   314
TUint		TestZoneCount = 0;
sl@0
   315
TInt TickPeriod = 15625;
sl@0
   316
sl@0
   317
#define TEST_NONE		0x0
sl@0
   318
#define TEST_THRASH		0x1
sl@0
   319
#define TEST_FORWARD	0x2
sl@0
   320
#define TEST_BACKWARD	0x4
sl@0
   321
#define TEST_RANDOM		0x8
sl@0
   322
#define TEST_ALL		(TEST_RANDOM | TEST_BACKWARD | TEST_FORWARD)
sl@0
   323
TUint32	TestWhichTests				= TEST_ALL;
sl@0
   324
_LIT(KRomPath, "z:\\sys\\bin\\");
sl@0
   325
_LIT(KMmcDefaultPath, "d:\\sys\\bin\\");
sl@0
   326
sl@0
   327
#define EXISTS(__val) ((__val == KErrNone) ? &KFileExists : &KFileMissing)
sl@0
   328
_LIT(KSysHash,"?:\\Sys\\Hash\\");
sl@0
   329
_LIT(KTestBlank, "");
sl@0
   330
_LIT(KFileExists, "Exists");
sl@0
   331
_LIT(KFileMissing, "Missing");
sl@0
   332
_LIT(KMultipleTest, "Multiple");
sl@0
   333
_LIT(KSingleTest,   "Single  ");
sl@0
   334
_LIT(KTestExe, "Exe ");
sl@0
   335
_LIT(KTestDll, "Dll ");
sl@0
   336
_LIT(KTestSelf, "Self ");
sl@0
   337
_LIT(KTestBase, "Base ");
sl@0
   338
_LIT(KTestRom, "ROM ");
sl@0
   339
_LIT(KTestAll, "All ");
sl@0
   340
_LIT(KTestGlobal, "Global");
sl@0
   341
_LIT(KTestThread, "Thread");
sl@0
   342
_LIT(KTestFunc,  "Func");
sl@0
   343
_LIT(KTestInter, "Interleave ");
sl@0
   344
_LIT(KTestPrio, "Prio ");
sl@0
   345
_LIT(KTestMedia, "Media ");
sl@0
   346
_LIT(KTestLowMem, "LowMem ");
sl@0
   347
_LIT(KTestChunking, "Chunks ");
sl@0
   348
_LIT(KTestEChunking, "EChunks ");
sl@0
   349
_LIT(KTestChunkingPlus, "Chunks+ ");
sl@0
   350
_LIT(KTestReaper, "Reaper ");
sl@0
   351
_LIT(KTestThrash, "Thrash ");
sl@0
   352
_LIT(KTestForward, "Forward ");
sl@0
   353
_LIT(KTestBackward, "Backward ");
sl@0
   354
_LIT(KTestRandom, "Random ");
sl@0
   355
sl@0
   356
typedef struct 
sl@0
   357
	{
sl@0
   358
	TBool				testFullAutoOnly;
sl@0
   359
	TInt				testLoading;
sl@0
   360
	TInt				testWhichMedia;
sl@0
   361
	TBool				testMultiple;
sl@0
   362
	TInt				testMaxLoops;
sl@0
   363
	TInt				testMultipleThreadCount;
sl@0
   364
	TBool				testLoadDllHow;
sl@0
   365
	TBool				testInterleave;
sl@0
   366
	TBool				testPrioChange;
sl@0
   367
	ETestMediaAccess	testMediaAccess;
sl@0
   368
	TUint32				testWhichTests;
sl@0
   369
	TBool				testLowMem;
sl@0
   370
	TInt				testFreeRam;
sl@0
   371
	}TTheTests; 
sl@0
   372
sl@0
   373
typedef struct
sl@0
   374
	{
sl@0
   375
	TInt	ok;
sl@0
   376
	TInt	fail;
sl@0
   377
	}TChunkTestPair;
sl@0
   378
sl@0
   379
typedef struct
sl@0
   380
	{
sl@0
   381
	TChunkTestPair	lock;
sl@0
   382
	TChunkTestPair	unlock;
sl@0
   383
	TChunkTestPair	decommit;
sl@0
   384
	TChunkTestPair	commit;
sl@0
   385
	TChunkTestPair	check;
sl@0
   386
	}
sl@0
   387
TChunkTestStats;
sl@0
   388
sl@0
   389
TChunkTestStats	TestChunkStats[TEST_NUM_CHUNK_PAGES];
sl@0
   390
sl@0
   391
sl@0
   392
TPtrC TestPsExeNames[KTestMediaCOUNT] = {	_L("t_pagestress.exe"), 
sl@0
   393
											_L("t_pagestress_rom.exe"), 
sl@0
   394
											_L("t_pagestress_ext.exe"), 
sl@0
   395
											_L("t_pagestress_rofs.exe"), 
sl@0
   396
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   397
											_L("t_pagestress_fat.exe"),
sl@0
   398
#endif
sl@0
   399
											_L("t_pagestress_mmc.exe"),
sl@0
   400
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   401
											_L("t_pagestress_nfr.exe"),
sl@0
   402
											_L("t_pagestress_mfr.exe"),
sl@0
   403
#endif
sl@0
   404
											};
sl@0
   405
sl@0
   406
TPtrC TestPlExeNames[KTestMediaCOUNT] = {	_L("t_pageldrtst.exe"), 
sl@0
   407
											_L("t_pageldrtst_rom.exe"), 
sl@0
   408
											_L("t_pageldrtst_ext.exe"), 
sl@0
   409
											_L("t_pageldrtst_rofs.exe"), 
sl@0
   410
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   411
											_L("t_pageldrtst_fat.exe"),
sl@0
   412
#endif
sl@0
   413
											_L("t_pageldrtst_mmc.exe"),
sl@0
   414
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   415
											_L("t_pageldrtst_nfr.exe"),
sl@0
   416
											_L("t_pageldrtst_mfr.exe"),
sl@0
   417
#endif
sl@0
   418
											};
sl@0
   419
sl@0
   420
_LIT(KDllBaseName,   "t_pageldrtst");
sl@0
   421
sl@0
   422
TPtrC TestPlExtNames[KTestMediaCOUNT] = {	_L(".dll"),
sl@0
   423
											_L("_rom.dll"),
sl@0
   424
											_L("_ext.dll"),
sl@0
   425
											_L("_rofs.dll"),
sl@0
   426
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   427
											_L("_fat.dll"),
sl@0
   428
#endif
sl@0
   429
											_L("_mmc.dll"),
sl@0
   430
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   431
											_L("_nfr.dll"),
sl@0
   432
											_L("_mfr.dll"),
sl@0
   433
#endif
sl@0
   434
											};
sl@0
   435
sl@0
   436
sl@0
   437
TBool TestDllExesExist[KTestMediaCOUNT] = { EFalse, 
sl@0
   438
											EFalse,
sl@0
   439
											EFalse,
sl@0
   440
											EFalse,
sl@0
   441
#ifdef TEST_ADD_FAT_MEDIA
sl@0
   442
											EFalse,
sl@0
   443
#endif
sl@0
   444
											EFalse,
sl@0
   445
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
   446
											EFalse,
sl@0
   447
											EFalse,
sl@0
   448
#endif
sl@0
   449
											};
sl@0
   450
#define DBGS_PRINT(__args)\
sl@0
   451
	if (!TestSilent) test.Printf __args;
sl@0
   452
sl@0
   453
#define DBGD_PRINT(__args)\
sl@0
   454
	if (TestDebug) test.Printf __args;
sl@0
   455
sl@0
   456
void SendDebugMessage(RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
   457
					  TMessageBuf            *aBuffer = NULL,
sl@0
   458
					  RSemaphore	 		 *aTheSem = NULL)
sl@0
   459
	{
sl@0
   460
	for (;;)
sl@0
   461
		{
sl@0
   462
		aTheSem->Wait();
sl@0
   463
		TInt r = aMsgQueue->Send(*aBuffer);
sl@0
   464
		aTheSem->Signal();
sl@0
   465
		if (r != KErrOverflow)
sl@0
   466
			return;
sl@0
   467
		User::After(0);
sl@0
   468
		}
sl@0
   469
	}
sl@0
   470
sl@0
   471
#define DEBUG_PRINT(__args)\
sl@0
   472
if (!TestSilent) \
sl@0
   473
	{\
sl@0
   474
	if (aMsgQueue && aBuffer && aTheSem)\
sl@0
   475
		{\
sl@0
   476
		aBuffer->Zero();\
sl@0
   477
		aBuffer->Format __args ;\
sl@0
   478
		SendDebugMessage(aMsgQueue, aBuffer, aTheSem);\
sl@0
   479
		}\
sl@0
   480
	else\
sl@0
   481
		{\
sl@0
   482
		test.Printf __args ;\
sl@0
   483
		}\
sl@0
   484
	}
sl@0
   485
sl@0
   486
#define RUNTEST(__test, __error)\
sl@0
   487
	if (!TestSilent)\
sl@0
   488
		test(__test == __error);\
sl@0
   489
	else\
sl@0
   490
		__test;
sl@0
   491
sl@0
   492
#define RUNTEST1(__test)\
sl@0
   493
	if (!TestSilent)\
sl@0
   494
		test(__test);
sl@0
   495
sl@0
   496
sl@0
   497
#define DEBUG_PRINT1(__args)\
sl@0
   498
if (TestDebug)\
sl@0
   499
	{\
sl@0
   500
	DEBUG_PRINT(__args)\
sl@0
   501
	}
sl@0
   502
sl@0
   503
#define DOTEST(__operation, __condition)\
sl@0
   504
	if (aLowMem) \
sl@0
   505
		{\
sl@0
   506
		__operation;\
sl@0
   507
		while (!__condition)\
sl@0
   508
			{\
sl@0
   509
			DBGD_PRINT((_L("Releasing some memory on line %d\n"), __LINE__));\
sl@0
   510
			if (pTheSem)\
sl@0
   511
				pTheSem->Wait();\
sl@0
   512
			PagestressLdd.DoReleaseSomeRam(TEST_LM_BLOCKS_FREE);\
sl@0
   513
			if (pTheSem)\
sl@0
   514
				pTheSem->Signal();\
sl@0
   515
			__operation;\
sl@0
   516
			}\
sl@0
   517
		RUNTEST1(__condition);\
sl@0
   518
		}\
sl@0
   519
	else\
sl@0
   520
		{\
sl@0
   521
		__operation;\
sl@0
   522
		RUNTEST1(__condition);\
sl@0
   523
		}
sl@0
   524
sl@0
   525
#define DOTEST1(__var, __func, __ok, __fail)\
sl@0
   526
	if (aLowMem) \
sl@0
   527
		{\
sl@0
   528
		__var = __func;\
sl@0
   529
		while (__var == __fail)\
sl@0
   530
			{\
sl@0
   531
			DBGD_PRINT((_L("Releasing some memory on line %d\n"), __LINE__));\
sl@0
   532
			if (pTheSem)\
sl@0
   533
				pTheSem->Wait();\
sl@0
   534
			PagestressLdd.DoReleaseSomeRam(TEST_LM_BLOCKS_FREE);\
sl@0
   535
			if (pTheSem)\
sl@0
   536
				pTheSem->Signal();\
sl@0
   537
			__var = __func;\
sl@0
   538
			}\
sl@0
   539
		if (__var != __ok)\
sl@0
   540
			DBGS_PRINT((_L("Failing on line %d with error %d\n"), __LINE__, __var));\
sl@0
   541
		RUNTEST1(__var == __ok);\
sl@0
   542
		}\
sl@0
   543
	else\
sl@0
   544
		{\
sl@0
   545
		__var = __func;\
sl@0
   546
		RUNTEST1(__var == __ok);\
sl@0
   547
		}
sl@0
   548
sl@0
   549
#define DOLOADALLOC(__numDlls, __pTheLibs, __theSem)\
sl@0
   550
	if (TestingLowMem)\
sl@0
   551
		{\
sl@0
   552
		__pTheLibs = (PageLdrRLibrary *)User::AllocZ(sizeof(PageLdrRLibrary) * __numDlls);\
sl@0
   553
		while (__pTheLibs == NULL)\
sl@0
   554
			{\
sl@0
   555
			DEBUG_PRINT1((_L("Releasing some memory for alloc on line %d\n"), __LINE__));\
sl@0
   556
			if (__theSem)\
sl@0
   557
				__theSem->Wait();\
sl@0
   558
			PagestressLdd.DoReleaseSomeRam(TEST_LM_BLOCKS_FREE);\
sl@0
   559
			if (__theSem)\
sl@0
   560
				__theSem->Signal();\
sl@0
   561
			__pTheLibs = (PageLdrRLibrary *)User::AllocZ(sizeof(PageLdrRLibrary) * __numDlls);\
sl@0
   562
			}\
sl@0
   563
		}\
sl@0
   564
	else\
sl@0
   565
		{\
sl@0
   566
		__pTheLibs = (PageLdrRLibrary *)User::AllocZ(sizeof(PageLdrRLibrary) * __numDlls);\
sl@0
   567
		if (__pTheLibs == NULL)\
sl@0
   568
			return KErrGeneral;\
sl@0
   569
		}
sl@0
   570
sl@0
   571
#define TEST_NEXT(__args) \
sl@0
   572
	if (!TestSilent)\
sl@0
   573
		test.Next __args;
sl@0
   574
sl@0
   575
void DoStats();
sl@0
   576
void CheckFilePresence(TBool aDoFileCopy);
sl@0
   577
void CleanupFiles(TBool silent);
sl@0
   578
typedef TInt (*TCallFunction)(TUint32 funcIndex, TInt param1, TInt param2);
sl@0
   579
sl@0
   580
class PageLdrRLibrary : public RLibrary
sl@0
   581
	{
sl@0
   582
public:
sl@0
   583
	TInt TestLoadLibrary(const TDesC& aFileName, TInt aThreadIndex, RMsgQueue<TMessageBuf> *aMsgQueue, TMessageBuf *aBuffer, RSemaphore  *aTheSem);
sl@0
   584
	TInt CloseLibrary();
sl@0
   585
	
sl@0
   586
public:	
sl@0
   587
	TBool				iInUse;
sl@0
   588
	TUint32				iFuncCount;
sl@0
   589
	TLibraryFunction	iInitFunc;
sl@0
   590
	TLibraryFunction	iFunctionCountFunc;
sl@0
   591
	TCallFunction       iCallFunctionFunc;
sl@0
   592
	TLibraryFunction	iSetCloseFunc;
sl@0
   593
	};
sl@0
   594
sl@0
   595
TInt PageLdrRLibrary::CloseLibrary()
sl@0
   596
	{
sl@0
   597
	if (iInUse)
sl@0
   598
		{
sl@0
   599
		if (iSetCloseFunc)
sl@0
   600
			(iSetCloseFunc)();
sl@0
   601
		Close();
sl@0
   602
		iFuncCount = 0;
sl@0
   603
		iInitFunc = NULL;
sl@0
   604
		iFunctionCountFunc = NULL;
sl@0
   605
		iCallFunctionFunc = NULL;
sl@0
   606
		iSetCloseFunc = NULL;
sl@0
   607
		iInUse = EFalse;
sl@0
   608
		}
sl@0
   609
	return KErrNone;
sl@0
   610
	}
sl@0
   611
sl@0
   612
PageLdrRLibrary		theGlobalLibs[PAGELDRTST_MAX_DLLS * KTestMediaCOUNT];
sl@0
   613
sl@0
   614
////////////////////////////////////////////////////////////
sl@0
   615
// Template functions encapsulating ControlIo magic
sl@0
   616
//
sl@0
   617
GLDEF_D template <class C>
sl@0
   618
GLDEF_C TInt controlIo(RFs &fs, TInt drv, TInt fkn, C &c)
sl@0
   619
{
sl@0
   620
    TPtr8 ptrC((TUint8 *)&c, sizeof(C), sizeof(C));
sl@0
   621
sl@0
   622
    TInt r = fs.ControlIo(drv, fkn, ptrC);
sl@0
   623
sl@0
   624
    return r;
sl@0
   625
}
sl@0
   626
sl@0
   627
//
sl@0
   628
// FreeRam
sl@0
   629
//
sl@0
   630
// Get available free ram.
sl@0
   631
//
sl@0
   632
sl@0
   633
TInt FreeRam()
sl@0
   634
	{
sl@0
   635
	// wait for any async cleanup in the supervisor to finish first...
sl@0
   636
	UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0);
sl@0
   637
sl@0
   638
	TMemoryInfoV1Buf meminfo;
sl@0
   639
	TInt r=UserHal::MemoryInfo(meminfo);
sl@0
   640
	test (r==KErrNone);
sl@0
   641
	return meminfo().iFreeRamInBytes;
sl@0
   642
	}
sl@0
   643
sl@0
   644
//
sl@0
   645
// FindFsNANDDrive
sl@0
   646
//
sl@0
   647
// Find the NAND drive
sl@0
   648
//
sl@0
   649
sl@0
   650
static TInt FindFsNANDDrive(RFs& aFs)
sl@0
   651
	{
sl@0
   652
	TDriveList driveList;
sl@0
   653
	TDriveInfo driveInfo;
sl@0
   654
	TInt r=aFs.DriveList(driveList);
sl@0
   655
    if (r == KErrNone)
sl@0
   656
		{
sl@0
   657
		for (TInt drvNum= (DriveNumber<0)?0:DriveNumber; drvNum<KMaxDrives; ++drvNum)
sl@0
   658
			{
sl@0
   659
			if(!driveList[drvNum])
sl@0
   660
				continue;   //-- skip unexisting drive
sl@0
   661
sl@0
   662
			if (aFs.Drive(driveInfo, drvNum) == KErrNone)
sl@0
   663
				{
sl@0
   664
				if(driveInfo.iMediaAtt&KMediaAttPageable)
sl@0
   665
					{
sl@0
   666
					TBool readOnly = driveInfo.iMediaAtt & KMediaAttWriteProtected;		// skip ROFS partitions
sl@0
   667
					if(!readOnly && (driveInfo.iType != EMediaHardDisk))
sl@0
   668
						{
sl@0
   669
						if ((drvNum==DriveNumber) || (DriveNumber<0))		// only test if running on this drive
sl@0
   670
							{
sl@0
   671
							return (drvNum);
sl@0
   672
							}
sl@0
   673
						}
sl@0
   674
					}
sl@0
   675
				}
sl@0
   676
			}
sl@0
   677
		}
sl@0
   678
	return (-1);
sl@0
   679
	}
sl@0
   680
sl@0
   681
//
sl@0
   682
// FindMMCDriveNumber
sl@0
   683
// 
sl@0
   684
// Find the first read write drive.
sl@0
   685
//
sl@0
   686
sl@0
   687
TInt FindMMCDriveNumber(RFs& aFs)
sl@0
   688
	{
sl@0
   689
	TDriveInfo driveInfo;
sl@0
   690
	for (TInt drvNum=0; drvNum<KMaxDrives; ++drvNum)
sl@0
   691
		{
sl@0
   692
		TInt r = aFs.Drive(driveInfo, drvNum);
sl@0
   693
		if (r >= 0)
sl@0
   694
			{
sl@0
   695
			if (driveInfo.iType == EMediaHardDisk)
sl@0
   696
				return (drvNum);
sl@0
   697
			}
sl@0
   698
		}
sl@0
   699
	return -1;
sl@0
   700
	}
sl@0
   701
sl@0
   702
sl@0
   703
//
sl@0
   704
// PageLdrRLibrary::TestLoadLibrary
sl@0
   705
//
sl@0
   706
// Load a library and initialise information about that library
sl@0
   707
//
sl@0
   708
sl@0
   709
TInt PageLdrRLibrary::TestLoadLibrary(const TDesC&           aFileName,
sl@0
   710
									  TInt					 aThreadIndex,
sl@0
   711
									  RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
   712
									  TMessageBuf           *aBuffer = NULL,
sl@0
   713
									  RSemaphore			*aTheSem = NULL)
sl@0
   714
	{
sl@0
   715
	TInt retVal = KErrNone;
sl@0
   716
	if (TestingLowMem)
sl@0
   717
		{
sl@0
   718
		TBool whinged = EFalse;
sl@0
   719
		TInt initialFreeRam = 0;
sl@0
   720
		TInt freeRam = 0;
sl@0
   721
sl@0
   722
		while (1)
sl@0
   723
			{
sl@0
   724
			initialFreeRam = FreeRam();
sl@0
   725
			retVal = Load(aFileName);
sl@0
   726
			freeRam = FreeRam();
sl@0
   727
			if (retVal == KErrNoMemory)
sl@0
   728
				{
sl@0
   729
				if (!whinged && (freeRam > (4 * TestPageSize)))
sl@0
   730
					{
sl@0
   731
					whinged = ETrue;
sl@0
   732
					DEBUG_PRINT1((_L("Load() %d pages %S\n"), (freeRam / TestPageSize), &aFileName));
sl@0
   733
					if (TestIsDemandPaged)
sl@0
   734
						{
sl@0
   735
						SVMCacheInfo  tempPages;
sl@0
   736
						UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
   737
sl@0
   738
						DEBUG_PRINT1((_L("DPC : min %d max %d curr %d\n"), 
sl@0
   739
									tempPages.iMinSize, tempPages.iMaxSize, tempPages.iCurrentSize));
sl@0
   740
						DEBUG_PRINT1((_L("    : maxFree %d freeRam %d\n"),
sl@0
   741
									tempPages.iMaxFreeSize, FreeRam()));
sl@0
   742
						}
sl@0
   743
					}
sl@0
   744
				DEBUG_PRINT1((_L("Load() releasing some memory for %S (%d)\n"), &aFileName, retVal));
sl@0
   745
				if (aTheSem)
sl@0
   746
					aTheSem->Wait();
sl@0
   747
				PagestressLdd.DoReleaseSomeRam(TEST_LM_BLOCKS_FREE);
sl@0
   748
				if (aTheSem)
sl@0
   749
					aTheSem->Signal();
sl@0
   750
				}
sl@0
   751
			else
sl@0
   752
				{
sl@0
   753
				if (whinged)
sl@0
   754
					{
sl@0
   755
					DEBUG_PRINT((_L("Load() Ok %d pages (%d) %S\n"), ((initialFreeRam - freeRam) / TestPageSize), (freeRam / TestPageSize), &aFileName));
sl@0
   756
					}
sl@0
   757
				break;
sl@0
   758
				}
sl@0
   759
			}
sl@0
   760
		}
sl@0
   761
	else
sl@0
   762
		{
sl@0
   763
		DEBUG_PRINT1((_L("Loading %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   764
		retVal = Load(aFileName);
sl@0
   765
		if (retVal != KErrNone)
sl@0
   766
			{
sl@0
   767
			DEBUG_PRINT1((_L("Load failed %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   768
			if (TestingReaper )
sl@0
   769
				{
sl@0
   770
				TInt tempIndex = 0;
sl@0
   771
				TBool whinged = EFalse;
sl@0
   772
				while (    (   (retVal == KErrNotFound) 
sl@0
   773
							|| (retVal == KErrPermissionDenied) 
sl@0
   774
							|| (retVal == KErrCorrupt) 
sl@0
   775
							|| (retVal == KErrInUse)) 
sl@0
   776
						&& (    TestingReaperCleaningFiles
sl@0
   777
							|| (tempIndex < TEST_REAPER_ITERS)))
sl@0
   778
					{
sl@0
   779
					User::After(2000000);
sl@0
   780
					if (!whinged)
sl@0
   781
						{
sl@0
   782
						DEBUG_PRINT((_L("Load() retrying load for %S (%d)\n"), &aFileName, retVal));
sl@0
   783
						whinged = ETrue;
sl@0
   784
						}
sl@0
   785
					retVal = Load(aFileName);
sl@0
   786
					if (!TestingReaperCleaningFiles)
sl@0
   787
						{
sl@0
   788
						tempIndex ++;
sl@0
   789
						}
sl@0
   790
					}
sl@0
   791
				if (retVal != KErrNone)
sl@0
   792
					{
sl@0
   793
					DEBUG_PRINT((_L("Load() failing for %S (%d) idx %d\n"), &aFileName, retVal, tempIndex));
sl@0
   794
					}
sl@0
   795
				}
sl@0
   796
			else if (TestingDefrag)
sl@0
   797
				{
sl@0
   798
				TInt tempIndex = 0;
sl@0
   799
				TBool whinged = EFalse;
sl@0
   800
				while ((retVal == KErrGeneral) && (tempIndex < 10))
sl@0
   801
					{
sl@0
   802
					User::After(20000);
sl@0
   803
					if (!whinged)
sl@0
   804
						{
sl@0
   805
						DEBUG_PRINT((_L("Load() retrying load for %S (%d)\n"), &aFileName, retVal));
sl@0
   806
						whinged = ETrue;
sl@0
   807
						}
sl@0
   808
					retVal = Load(aFileName);
sl@0
   809
					tempIndex ++;
sl@0
   810
					}
sl@0
   811
				if (retVal != KErrNone)
sl@0
   812
					{
sl@0
   813
					DEBUG_PRINT((_L("Load() failing for %S (%d) idx %d\n"), &aFileName, retVal, tempIndex));
sl@0
   814
					}
sl@0
   815
				}
sl@0
   816
			}
sl@0
   817
		}
sl@0
   818
	DEBUG_PRINT1((_L("Loaded %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   819
	if (retVal == KErrNone)
sl@0
   820
		{
sl@0
   821
		iInUse = ETrue;
sl@0
   822
		iInitFunc = Lookup(PAGELDRTST_FUNC_Init);
sl@0
   823
		iFunctionCountFunc = Lookup(PAGELDRTST_FUNC_FunctionCount);
sl@0
   824
		iCallFunctionFunc = (TCallFunction)Lookup(PAGELDRTST_FUNC_CallFunction);
sl@0
   825
		iSetCloseFunc = Lookup(PAGELDRTST_FUNC_SetClose);
sl@0
   826
		if (   (iInitFunc != NULL)
sl@0
   827
			&& (iFunctionCountFunc != NULL)
sl@0
   828
			&& (iCallFunctionFunc != NULL)
sl@0
   829
			&& (iSetCloseFunc != NULL))
sl@0
   830
			{
sl@0
   831
			retVal = (iInitFunc)();
sl@0
   832
			if (retVal == KErrNone)
sl@0
   833
				{
sl@0
   834
				iFuncCount = (iFunctionCountFunc)();
sl@0
   835
				if (iFuncCount != 0)
sl@0
   836
					{
sl@0
   837
					DEBUG_PRINT1((_L("Loaded ok %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   838
					return KErrNone;	
sl@0
   839
					}
sl@0
   840
				retVal = KErrGeneral;
sl@0
   841
				DEBUG_PRINT((_L("!!! bad count %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   842
				}
sl@0
   843
			else
sl@0
   844
				{
sl@0
   845
				DEBUG_PRINT((_L("!!! init failed %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   846
				retVal = KErrGeneral;
sl@0
   847
				}
sl@0
   848
			}
sl@0
   849
		else
sl@0
   850
			{
sl@0
   851
			DEBUG_PRINT((_L("!!! missing %S (%d)\n"), &aFileName, aThreadIndex));	 
sl@0
   852
			retVal = KErrGeneral;
sl@0
   853
			}
sl@0
   854
		}
sl@0
   855
	else
sl@0
   856
		{
sl@0
   857
		DEBUG_PRINT((_L("Load() failed %S %d\n"), &aFileName, retVal));
sl@0
   858
#ifdef WANT_FS_CACHE_STATS
sl@0
   859
		RFs			 fs;
sl@0
   860
		if (KErrNone != fs.Connect())
sl@0
   861
			{
sl@0
   862
			DEBUG_PRINT(_L("TestLoadLibrary : Can't connect to the FS\n"));
sl@0
   863
			}
sl@0
   864
		else
sl@0
   865
			{
sl@0
   866
			TFileCacheStats stats1;
sl@0
   867
			TInt drvNum = FindMMCDriveNumber(fs); 
sl@0
   868
			controlIo(fs,drvNum, KControlIoFileCacheStats, stats1);
sl@0
   869
		
sl@0
   870
			DEBUG_PRINT((_L("FSC: drv %d %c free %d used %d locked %d\n"),
sl@0
   871
						drvNum, 'a' + drvNum,
sl@0
   872
						stats1.iFreeCount,
sl@0
   873
						stats1.iUsedCount,
sl@0
   874
						stats1.iLockedSegmentCount));
sl@0
   875
			DEBUG_PRINT((_L("   : alloc %d lock %d closed %d\n"),
sl@0
   876
						stats1.iAllocatedSegmentCount,
sl@0
   877
						stats1.iFileCount,
sl@0
   878
						stats1.iFilesOnClosedQueue));
sl@0
   879
			fs.Close();
sl@0
   880
			}
sl@0
   881
#endif //WANT_FS_CACHE_STATS 
sl@0
   882
sl@0
   883
		if (TestIsDemandPaged)
sl@0
   884
			{
sl@0
   885
			SVMCacheInfo  tempPages;
sl@0
   886
			UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
   887
sl@0
   888
			DEBUG_PRINT((_L("DPC : min %d max %d curr %d\n"), 
sl@0
   889
						tempPages.iMinSize, tempPages.iMaxSize, tempPages.iCurrentSize));
sl@0
   890
			DEBUG_PRINT((_L("    : maxFree %d freeRam %d\n"),
sl@0
   891
						tempPages.iMaxFreeSize, FreeRam()));
sl@0
   892
			}
sl@0
   893
		}
sl@0
   894
	return retVal;
sl@0
   895
	}
sl@0
   896
sl@0
   897
//
sl@0
   898
// GetNumDlls
sl@0
   899
//
sl@0
   900
// Work out how many Dlls we will play with
sl@0
   901
//
sl@0
   902
TInt GetNumDlls()
sl@0
   903
	{
sl@0
   904
	TInt maxDllIndex;
sl@0
   905
sl@0
   906
	switch (TestWhichMedia)
sl@0
   907
		{
sl@0
   908
		default:
sl@0
   909
		case TEST_MEDIA_BASE:	
sl@0
   910
		case TEST_MEDIA_ROM:
sl@0
   911
			maxDllIndex = PAGELDRTST_MAX_DLLS;
sl@0
   912
		break;
sl@0
   913
sl@0
   914
		case TEST_MEDIA_ROM_BASE:
sl@0
   915
			maxDllIndex = PAGELDRTST_MAX_DLLS * 2;
sl@0
   916
		break;
sl@0
   917
sl@0
   918
		case TEST_MEDIA_ALL:
sl@0
   919
			maxDllIndex = PAGELDRTST_MAX_DLLS * KTestMediaCOUNT;
sl@0
   920
		break;
sl@0
   921
		}
sl@0
   922
	return maxDllIndex;
sl@0
   923
	}
sl@0
   924
sl@0
   925
//
sl@0
   926
// LoadTheLibs
sl@0
   927
//
sl@0
   928
// Open DLLs for use in the tests.
sl@0
   929
//
sl@0
   930
sl@0
   931
TInt LoadTheLibs(PageLdrRLibrary       *aTheLibs,
sl@0
   932
                 TInt                   aLibCount,
sl@0
   933
				 TInt				    aThreadIndex, 
sl@0
   934
                 RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
   935
				 TMessageBuf           *aBuffer = NULL, 
sl@0
   936
				 RSemaphore			   *aTheSem = NULL)
sl@0
   937
	{
sl@0
   938
	TBuf<128>			nameBuffer;
sl@0
   939
	TInt				dllIndex = 0;
sl@0
   940
	TInt				realDllIndex = 0;
sl@0
   941
	TInt				dllOffset = -1;
sl@0
   942
	TInt				testWhich;
sl@0
   943
	RThread				thisThread;
sl@0
   944
sl@0
   945
	memset(aTheLibs, 0, sizeof(*aTheLibs) * aLibCount);
sl@0
   946
	for (dllIndex = 0; dllIndex < aLibCount; dllIndex ++)
sl@0
   947
		{
sl@0
   948
		realDllIndex = (dllIndex + aThreadIndex) % PAGELDRTST_MAX_DLLS;
sl@0
   949
//		realDllIndex = (dllIndex) % PAGELDRTST_MAX_DLLS;
sl@0
   950
		if (realDllIndex == 0)
sl@0
   951
			dllOffset ++;
sl@0
   952
sl@0
   953
		if ((TestWhichMedia & TEST_MEDIA_ALL) == TEST_MEDIA_ALL)
sl@0
   954
			testWhich = (dllIndex + dllOffset) % KTestMediaCOUNT;
sl@0
   955
		else if ((TestWhichMedia & TEST_MEDIA_ALL) == TEST_MEDIA_ROM_BASE)
sl@0
   956
			testWhich = ((dllIndex + dllOffset) & 1) ? KTestMediaBase : KTestMediaRom;
sl@0
   957
		else if (TestWhichMedia & TEST_MEDIA_BASE )
sl@0
   958
			testWhich = KTestMediaBase;
sl@0
   959
		else
sl@0
   960
			testWhich = KTestMediaRom;
sl@0
   961
		
sl@0
   962
		if (!TestDllExesExist[testWhich])
sl@0
   963
			testWhich = KTestMediaBase;
sl@0
   964
sl@0
   965
		nameBuffer.Format(_L("%S%d%S"), &KDllBaseName, realDllIndex, &TestPlExtNames[testWhich]);
sl@0
   966
		
sl@0
   967
		DEBUG_PRINT1((_L("LoadTheLibs[%02d] - loading %S\n"), aThreadIndex, &nameBuffer));
sl@0
   968
		TInt theErr = aTheLibs[dllIndex].TestLoadLibrary(nameBuffer, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
   969
		if (theErr != KErrNone)
sl@0
   970
			{
sl@0
   971
			DEBUG_PRINT((_L("LoadTheLibs[%02d] - fail %S %d\n"), aThreadIndex, &nameBuffer, theErr));
sl@0
   972
			return KErrGeneral;
sl@0
   973
			}
sl@0
   974
		else
sl@0
   975
			{
sl@0
   976
			DEBUG_PRINT1((_L("LoadTheLibs[%02d] - loaded %S OK\n"), aThreadIndex, &nameBuffer));
sl@0
   977
			}
sl@0
   978
		if (TestThreadsExit)
sl@0
   979
			{
sl@0
   980
			DEBUG_PRINT((_L("LoadTheLibs[%02d] - cancelled\n"), aThreadIndex));
sl@0
   981
			return KErrCancel;
sl@0
   982
			}
sl@0
   983
		if (TestPrioChange)
sl@0
   984
			{
sl@0
   985
			TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
   986
			DEBUG_PRINT1((_L("LoadTheLibs[%02d] before priority change\n"), aThreadIndex));
sl@0
   987
			thisThread.SetPriority(EPriorityLess);
sl@0
   988
			User::AfterHighRes(0);
sl@0
   989
			thisThread.SetPriority(originalThreadPriority);
sl@0
   990
			DEBUG_PRINT1((_L("LoadTheLibs[%02d] after priority change\n"), aThreadIndex));
sl@0
   991
			}
sl@0
   992
		}
sl@0
   993
	DEBUG_PRINT((_L("LoadTheLibs[%02d] done\n"), aThreadIndex));
sl@0
   994
	return KErrNone;
sl@0
   995
	}
sl@0
   996
sl@0
   997
//
sl@0
   998
// CloseTheLibs
sl@0
   999
//
sl@0
  1000
// Close the DLLs that we have previously opened
sl@0
  1001
//
sl@0
  1002
sl@0
  1003
void CloseTheLibs (PageLdrRLibrary       *aTheLibs,
sl@0
  1004
                   TInt                   aLibCount)
sl@0
  1005
	{
sl@0
  1006
	TInt				dllIndex = 0;
sl@0
  1007
	
sl@0
  1008
	for (dllIndex = 0; dllIndex < aLibCount; dllIndex ++)
sl@0
  1009
		{
sl@0
  1010
		aTheLibs[dllIndex].CloseLibrary();
sl@0
  1011
		}
sl@0
  1012
	memset(aTheLibs, 0, sizeof(*aTheLibs) * aLibCount);
sl@0
  1013
	}
sl@0
  1014
sl@0
  1015
//
sl@0
  1016
// RunThreadForward
sl@0
  1017
//
sl@0
  1018
// Walk through the function pointer array (forwards) calling each function
sl@0
  1019
//
sl@0
  1020
sl@0
  1021
TInt RunThreadForward(TInt				     aThreadIndex, 
sl@0
  1022
					  PageLdrRLibrary		*aTheLibs,
sl@0
  1023
					  TInt					 aMaxDllIndex,
sl@0
  1024
					  RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
  1025
					  TMessageBuf			*aBuffer = NULL, 
sl@0
  1026
					  RSemaphore			*aTheSem = NULL)
sl@0
  1027
	{
sl@0
  1028
	TInt				seed = 1;
sl@0
  1029
	TUint32				index = 0;
sl@0
  1030
	RThread				thisThread;
sl@0
  1031
	PageLdrRLibrary    *pTheLibs = NULL;
sl@0
  1032
	TInt				dllIndex = 0;
sl@0
  1033
sl@0
  1034
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1035
		{
sl@0
  1036
		DOLOADALLOC(aMaxDllIndex, pTheLibs, aTheSem);
sl@0
  1037
		if (pTheLibs)
sl@0
  1038
			{
sl@0
  1039
			TInt retVal = LoadTheLibs(pTheLibs, aMaxDllIndex, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1040
			if (retVal != KErrNone)
sl@0
  1041
				{
sl@0
  1042
				DEBUG_PRINT((_L("Forward[%d] - load fail\n"), aThreadIndex));
sl@0
  1043
				CloseTheLibs (pTheLibs, aMaxDllIndex);
sl@0
  1044
				User::Free(pTheLibs);
sl@0
  1045
				return retVal;
sl@0
  1046
				}
sl@0
  1047
			}
sl@0
  1048
		else
sl@0
  1049
			{
sl@0
  1050
			DEBUG_PRINT((_L("Forward[%d] - alloc fail\n"), aThreadIndex));
sl@0
  1051
			return KErrGeneral;
sl@0
  1052
			}
sl@0
  1053
		}
sl@0
  1054
	else
sl@0
  1055
		{
sl@0
  1056
		pTheLibs = aTheLibs;
sl@0
  1057
		}
sl@0
  1058
	
sl@0
  1059
	for (dllIndex = 0; dllIndex < aMaxDllIndex; dllIndex ++)
sl@0
  1060
		{
sl@0
  1061
		index = 0;
sl@0
  1062
		while (index < pTheLibs[dllIndex].iFuncCount)
sl@0
  1063
			{
sl@0
  1064
			if (TestPrioChange)
sl@0
  1065
				{
sl@0
  1066
				TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
  1067
				thisThread.SetPriority(EPriorityLess);
sl@0
  1068
				User::AfterHighRes(0);
sl@0
  1069
				thisThread.SetPriority(originalThreadPriority);
sl@0
  1070
				}
sl@0
  1071
			if (pTheLibs[dllIndex].iCallFunctionFunc)
sl@0
  1072
				seed = pTheLibs[dllIndex].iCallFunctionFunc(index, seed, index);
sl@0
  1073
			else
sl@0
  1074
				DEBUG_PRINT((_L("Forward[%d] : dll %d was NULL\n"), aThreadIndex, dllIndex));
sl@0
  1075
			index ++;
sl@0
  1076
			if (TestThreadsExit)
sl@0
  1077
				break;
sl@0
  1078
			}
sl@0
  1079
		if (TestThreadsExit)
sl@0
  1080
			break;
sl@0
  1081
		}
sl@0
  1082
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1083
		{
sl@0
  1084
		CloseTheLibs(pTheLibs, aMaxDllIndex);
sl@0
  1085
		User::Free(pTheLibs);
sl@0
  1086
		}
sl@0
  1087
	return KErrNone;
sl@0
  1088
	}
sl@0
  1089
sl@0
  1090
//
sl@0
  1091
// RunThreadBackward
sl@0
  1092
//
sl@0
  1093
// Walk through the function pointer array (backwards) calling each function
sl@0
  1094
//
sl@0
  1095
sl@0
  1096
TInt RunThreadBackward(TInt				      aThreadIndex, 
sl@0
  1097
					   PageLdrRLibrary		 *aTheLibs,
sl@0
  1098
					   TInt					  aMaxDllIndex,
sl@0
  1099
					   RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
  1100
					   TMessageBuf			 *aBuffer = NULL,
sl@0
  1101
					   RSemaphore			 *aTheSem = NULL)
sl@0
  1102
	{
sl@0
  1103
	TInt				seed = 1;
sl@0
  1104
	TUint32				index = 0;
sl@0
  1105
	RThread				thisThread;
sl@0
  1106
	PageLdrRLibrary    *pTheLibs = NULL;
sl@0
  1107
	TInt				dllIndex = 0;
sl@0
  1108
sl@0
  1109
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1110
		{
sl@0
  1111
		DOLOADALLOC(aMaxDllIndex, pTheLibs, aTheSem);
sl@0
  1112
		if (pTheLibs)
sl@0
  1113
			{
sl@0
  1114
			TInt retVal = LoadTheLibs(pTheLibs, aMaxDllIndex, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1115
			if (retVal != KErrNone)
sl@0
  1116
				{
sl@0
  1117
				DEBUG_PRINT((_L("Backward[%d] - load fail\n"), aThreadIndex));
sl@0
  1118
				CloseTheLibs (pTheLibs, aMaxDllIndex);
sl@0
  1119
				User::Free(pTheLibs);
sl@0
  1120
				return retVal;
sl@0
  1121
				}
sl@0
  1122
			}
sl@0
  1123
		else
sl@0
  1124
			{
sl@0
  1125
			DEBUG_PRINT((_L("Backward[%d] - alloc fail\n"), aThreadIndex));
sl@0
  1126
			return KErrGeneral;
sl@0
  1127
			}
sl@0
  1128
		}	
sl@0
  1129
	else
sl@0
  1130
		{
sl@0
  1131
		pTheLibs = aTheLibs;
sl@0
  1132
		}
sl@0
  1133
sl@0
  1134
	for (dllIndex = aMaxDllIndex - 1; dllIndex >= 0; dllIndex --)
sl@0
  1135
		{
sl@0
  1136
		index = pTheLibs[dllIndex].iFuncCount;
sl@0
  1137
		while (index > 0)
sl@0
  1138
			{
sl@0
  1139
			if (TestPrioChange)
sl@0
  1140
				{
sl@0
  1141
				TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
  1142
				thisThread.SetPriority(EPriorityLess);
sl@0
  1143
				User::AfterHighRes(0);
sl@0
  1144
				thisThread.SetPriority(originalThreadPriority);
sl@0
  1145
				}
sl@0
  1146
			if (pTheLibs[dllIndex].iCallFunctionFunc)
sl@0
  1147
				seed = pTheLibs[dllIndex].iCallFunctionFunc(index, seed, index);
sl@0
  1148
			else
sl@0
  1149
				DEBUG_PRINT((_L("Backward[%d] : dll %d was NULL\n"), aThreadIndex, dllIndex));
sl@0
  1150
			index --;
sl@0
  1151
			if (TestThreadsExit)
sl@0
  1152
				break;
sl@0
  1153
			}
sl@0
  1154
		if (TestThreadsExit)
sl@0
  1155
			break;
sl@0
  1156
		}
sl@0
  1157
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1158
		{
sl@0
  1159
		CloseTheLibs(pTheLibs, aMaxDllIndex);
sl@0
  1160
		User::Free(pTheLibs);
sl@0
  1161
		}
sl@0
  1162
	return KErrNone;
sl@0
  1163
	}
sl@0
  1164
sl@0
  1165
//
sl@0
  1166
// RunThreadRandom
sl@0
  1167
//
sl@0
  1168
// Walk through the function pointer array in a random order a number of times calling each function
sl@0
  1169
//
sl@0
  1170
sl@0
  1171
TInt RunThreadRandom(TInt				    aThreadIndex, 
sl@0
  1172
					 PageLdrRLibrary	   *aTheLibs,
sl@0
  1173
					 TInt				    aMaxDllIndex,
sl@0
  1174
					 RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
  1175
					 TMessageBuf		   *aBuffer = NULL,
sl@0
  1176
					 RSemaphore			   *aTheSem = NULL)
sl@0
  1177
	{
sl@0
  1178
	TInt				seed = 1;
sl@0
  1179
	TUint				randNum;
sl@0
  1180
	RThread				thisThread;
sl@0
  1181
	PageLdrRLibrary    *pTheLibs = NULL;
sl@0
  1182
	TUint				dllIndex = 0;
sl@0
  1183
	
sl@0
  1184
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1185
		{
sl@0
  1186
		DOLOADALLOC(aMaxDllIndex, pTheLibs, aTheSem);
sl@0
  1187
		if (pTheLibs)
sl@0
  1188
			{
sl@0
  1189
			TInt retVal = LoadTheLibs(pTheLibs, aMaxDllIndex, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1190
			if (retVal != KErrNone)
sl@0
  1191
				{
sl@0
  1192
				DEBUG_PRINT((_L("Random[%d] - load fail\n"), aThreadIndex));
sl@0
  1193
				CloseTheLibs (pTheLibs, aMaxDllIndex);
sl@0
  1194
				User::Free(pTheLibs);
sl@0
  1195
				return retVal;
sl@0
  1196
				}
sl@0
  1197
			}
sl@0
  1198
		else
sl@0
  1199
			{
sl@0
  1200
			DEBUG_PRINT((_L("Random[%d] - alloc fail\n"), aThreadIndex));
sl@0
  1201
			return KErrGeneral;
sl@0
  1202
			}
sl@0
  1203
		}
sl@0
  1204
	else
sl@0
  1205
		{
sl@0
  1206
		pTheLibs = aTheLibs;
sl@0
  1207
		}
sl@0
  1208
sl@0
  1209
	
sl@0
  1210
	TUint funcCount = (TUint)pTheLibs[0].iFuncCount;
sl@0
  1211
	TInt iterCount = aMaxDllIndex * funcCount;
sl@0
  1212
	
sl@0
  1213
	// reduce the time for auto tests by reducing the number of cycles.
sl@0
  1214
	if (TestIsAutomated)
sl@0
  1215
		iterCount /= 4;
sl@0
  1216
sl@0
  1217
	while (iterCount > 0)
sl@0
  1218
		{
sl@0
  1219
		if (TestPrioChange)
sl@0
  1220
			{
sl@0
  1221
			TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
  1222
			thisThread.SetPriority(EPriorityLess);
sl@0
  1223
			User::AfterHighRes(0);
sl@0
  1224
			thisThread.SetPriority(originalThreadPriority);
sl@0
  1225
			}
sl@0
  1226
		
sl@0
  1227
		randNum = (TUint)Math::Random();
sl@0
  1228
		dllIndex = randNum % (TUint)aMaxDllIndex;
sl@0
  1229
sl@0
  1230
		randNum %= funcCount;
sl@0
  1231
sl@0
  1232
		if (   (randNum < funcCount)
sl@0
  1233
		    && ((TInt)dllIndex < aMaxDllIndex))
sl@0
  1234
			{
sl@0
  1235
			if (pTheLibs[dllIndex].iCallFunctionFunc)
sl@0
  1236
				{
sl@0
  1237
				seed = pTheLibs[dllIndex].iCallFunctionFunc(randNum, seed, randNum);
sl@0
  1238
				}
sl@0
  1239
			else
sl@0
  1240
				DEBUG_PRINT((_L("Random[%d] : dll %d was NULL\n"), aThreadIndex, dllIndex));
sl@0
  1241
			}
sl@0
  1242
		else
sl@0
  1243
			{
sl@0
  1244
			DEBUG_PRINT((_L("Random[%d] : %d ERROR dllIndex %u rand %u\n"), aThreadIndex, iterCount, dllIndex, randNum));
sl@0
  1245
			}
sl@0
  1246
		
sl@0
  1247
		--iterCount;
sl@0
  1248
		if (TestThreadsExit)
sl@0
  1249
			break;
sl@0
  1250
		}
sl@0
  1251
sl@0
  1252
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1253
		{
sl@0
  1254
		CloseTheLibs(pTheLibs, aMaxDllIndex);
sl@0
  1255
		User::Free(pTheLibs);
sl@0
  1256
		}
sl@0
  1257
	return KErrNone;
sl@0
  1258
	}
sl@0
  1259
sl@0
  1260
sl@0
  1261
//
sl@0
  1262
// ThrashThreadLoad
sl@0
  1263
//
sl@0
  1264
// Load and unload the DLLs rapidly to show up a timing window in the kernel.
sl@0
  1265
//
sl@0
  1266
sl@0
  1267
TInt ThrashThreadLoad (TInt				      aThreadIndex, 
sl@0
  1268
					   PageLdrRLibrary		 *aTheLibs,
sl@0
  1269
					   TInt					  aMaxDllIndex,
sl@0
  1270
					   RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
  1271
					   TMessageBuf			 *aBuffer = NULL,
sl@0
  1272
					   RSemaphore			 *aTheSem = NULL)
sl@0
  1273
	{
sl@0
  1274
	if (TestLoadDllHow == TEST_DLL_FUNC)
sl@0
  1275
		{
sl@0
  1276
		PageLdrRLibrary    *pTheLibs = NULL;
sl@0
  1277
		DOLOADALLOC(aMaxDllIndex, pTheLibs, aTheSem);
sl@0
  1278
		if (pTheLibs)
sl@0
  1279
			{
sl@0
  1280
			TInt retVal = LoadTheLibs(pTheLibs, aMaxDllIndex, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1281
			if (retVal != KErrNone)
sl@0
  1282
				{
sl@0
  1283
				DEBUG_PRINT((_L("Thrash[%d] - load fail\n"), aThreadIndex));
sl@0
  1284
				CloseTheLibs (pTheLibs, aMaxDllIndex);
sl@0
  1285
				User::Free(pTheLibs);
sl@0
  1286
				return retVal;
sl@0
  1287
				}
sl@0
  1288
			}
sl@0
  1289
		else
sl@0
  1290
			{
sl@0
  1291
			DEBUG_PRINT((_L("Thrash[%d] - alloc fail\n"), aThreadIndex));
sl@0
  1292
			return KErrGeneral;
sl@0
  1293
			}
sl@0
  1294
sl@0
  1295
		CloseTheLibs(pTheLibs, aMaxDllIndex);
sl@0
  1296
		User::Free(pTheLibs);
sl@0
  1297
		}
sl@0
  1298
	return KErrNone;
sl@0
  1299
	}
sl@0
  1300
sl@0
  1301
sl@0
  1302
//
sl@0
  1303
// PerformTestThread
sl@0
  1304
//
sl@0
  1305
// This is the function that actually does the work.
sl@0
  1306
// It is complicated a little because test.Printf can only be called from the first thread that calls it 
sl@0
  1307
// so if we are using multiple threads we need to use a message queue to pass the debug info from the
sl@0
  1308
// child threads back to the parent for the parent to then call printf.
sl@0
  1309
//
sl@0
  1310
//
sl@0
  1311
sl@0
  1312
LOCAL_C TInt PerformTestThread(TInt					  aThreadIndex, 
sl@0
  1313
							   RMsgQueue<TMessageBuf> *aMsgQueue = NULL, 
sl@0
  1314
							   TMessageBuf			 *aBuffer = NULL,
sl@0
  1315
							   RSemaphore			 *aTheSem = NULL)
sl@0
  1316
	{
sl@0
  1317
	TUint start = User::TickCount();
sl@0
  1318
sl@0
  1319
	TFullName n(RThread().Name());
sl@0
  1320
sl@0
  1321
	DEBUG_PRINT((_L("%S : thread %d Executing %S\n"), &TestNameBuffer, aThreadIndex, &n));
sl@0
  1322
	
sl@0
  1323
	// now select how we do the test...
sl@0
  1324
	TInt	iterIndex;
sl@0
  1325
sl@0
  1326
	PageLdrRLibrary    *pTheLibs = theGlobalLibs;
sl@0
  1327
	TInt				maxDllIndex = GetNumDlls();
sl@0
  1328
sl@0
  1329
	switch (TestLoadDllHow)
sl@0
  1330
		{
sl@0
  1331
		case TEST_DLL_THREAD:
sl@0
  1332
			pTheLibs = NULL;
sl@0
  1333
			DOLOADALLOC(maxDllIndex, pTheLibs, aTheSem);
sl@0
  1334
			if (pTheLibs)
sl@0
  1335
				{
sl@0
  1336
				TInt retVal = LoadTheLibs(pTheLibs, maxDllIndex, aThreadIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1337
				if (retVal != KErrNone)
sl@0
  1338
					{
sl@0
  1339
					DEBUG_PRINT((_L("Perform[%d] - load fail\n"), aThreadIndex));
sl@0
  1340
					CloseTheLibs (pTheLibs, maxDllIndex);
sl@0
  1341
					User::Free(pTheLibs);
sl@0
  1342
					return retVal;
sl@0
  1343
					}
sl@0
  1344
				}
sl@0
  1345
			else
sl@0
  1346
				{
sl@0
  1347
				DEBUG_PRINT((_L("Perform[%d] - alloc fail\n"), aThreadIndex));
sl@0
  1348
				return KErrGeneral;
sl@0
  1349
				}
sl@0
  1350
		break;
sl@0
  1351
sl@0
  1352
		case TEST_DLL_GLOBAL:
sl@0
  1353
			pTheLibs = theGlobalLibs;
sl@0
  1354
		break;
sl@0
  1355
sl@0
  1356
		case TEST_DLL_FUNC:
sl@0
  1357
		default:
sl@0
  1358
		// do nowt
sl@0
  1359
		break;
sl@0
  1360
		}
sl@0
  1361
sl@0
  1362
	TInt    retVal = KErrNone;
sl@0
  1363
	if (TEST_ALL == (TestWhichTests & TEST_ALL))
sl@0
  1364
		{
sl@0
  1365
		#define LOCAL_ORDER_INDEX1	6
sl@0
  1366
		#define LOCAL_ORDER_INDEX2	3
sl@0
  1367
		TInt	order[LOCAL_ORDER_INDEX1][LOCAL_ORDER_INDEX2] = {	{TEST_FORWARD, TEST_BACKWARD,TEST_RANDOM},
sl@0
  1368
																	{TEST_FORWARD, TEST_RANDOM,  TEST_BACKWARD},
sl@0
  1369
																	{TEST_BACKWARD,TEST_FORWARD, TEST_RANDOM},
sl@0
  1370
																	{TEST_BACKWARD,TEST_RANDOM,  TEST_FORWARD},
sl@0
  1371
																	{TEST_RANDOM,  TEST_FORWARD, TEST_BACKWARD},
sl@0
  1372
																	{TEST_RANDOM,  TEST_BACKWARD,TEST_FORWARD}};
sl@0
  1373
		TInt	whichOrder = 0;
sl@0
  1374
sl@0
  1375
		for (iterIndex = 0; ; )
sl@0
  1376
			{
sl@0
  1377
			TInt    selOrder = ((aThreadIndex + 1) * (iterIndex + 1)) % LOCAL_ORDER_INDEX1;
sl@0
  1378
			for (whichOrder = 0; whichOrder < LOCAL_ORDER_INDEX2; whichOrder ++)
sl@0
  1379
				{
sl@0
  1380
				switch (order[selOrder][whichOrder])
sl@0
  1381
					{
sl@0
  1382
						case TEST_FORWARD:
sl@0
  1383
						DEBUG_PRINT((_L("%S : %d Iter %d.%d Forward\n"),
sl@0
  1384
							&TestNameBuffer, aThreadIndex, iterIndex, whichOrder));
sl@0
  1385
						retVal = RunThreadForward(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1386
						break;
sl@0
  1387
sl@0
  1388
						case TEST_BACKWARD:
sl@0
  1389
						DEBUG_PRINT((_L("%S : %d Iter %d.%d Backward\n"),
sl@0
  1390
							&TestNameBuffer, aThreadIndex, iterIndex, whichOrder));
sl@0
  1391
						retVal = RunThreadBackward(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1392
						break;
sl@0
  1393
sl@0
  1394
						case TEST_RANDOM:
sl@0
  1395
						DEBUG_PRINT((_L("%S : %d Iter %d.%d Random\n"),
sl@0
  1396
							&TestNameBuffer, aThreadIndex, iterIndex, whichOrder));
sl@0
  1397
						retVal = RunThreadRandom(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1398
						break;
sl@0
  1399
						
sl@0
  1400
						default: // this is really an error.
sl@0
  1401
						break;
sl@0
  1402
					}
sl@0
  1403
				DEBUG_PRINT((_L("%S : %d Iter %d.%d finished %d\n"),
sl@0
  1404
					&TestNameBuffer, aThreadIndex, iterIndex, whichOrder, retVal));
sl@0
  1405
				if ((retVal == KErrCancel) && iterIndex > 0)
sl@0
  1406
					retVal = KErrNone;
sl@0
  1407
				if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1408
					break;
sl@0
  1409
				}
sl@0
  1410
			if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1411
				break;
sl@0
  1412
			if (++iterIndex >= TestMaxLoops)
sl@0
  1413
				break;
sl@0
  1414
			User::AfterHighRes(TEST_DOT_PERIOD/3*1000000);
sl@0
  1415
			}
sl@0
  1416
		}
sl@0
  1417
	else
sl@0
  1418
		{
sl@0
  1419
		if (TestWhichTests & TEST_FORWARD)
sl@0
  1420
			{
sl@0
  1421
			for (iterIndex = 0; ; )
sl@0
  1422
				{
sl@0
  1423
				DEBUG_PRINT((_L("%S : %d Iter %d Forward\n"), &TestNameBuffer, aThreadIndex, iterIndex));
sl@0
  1424
				retVal = RunThreadForward(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1425
				DEBUG_PRINT((_L("%S : %d Iter %d finished %d\n"), &TestNameBuffer, aThreadIndex, iterIndex, retVal));
sl@0
  1426
				if ((retVal == KErrCancel) && iterIndex > 0)
sl@0
  1427
					retVal = KErrNone;
sl@0
  1428
				if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1429
					break;
sl@0
  1430
				if (++iterIndex >= TestMaxLoops)
sl@0
  1431
					break;
sl@0
  1432
				User::AfterHighRes(TEST_DOT_PERIOD/3*1000000);
sl@0
  1433
				}
sl@0
  1434
			}
sl@0
  1435
			
sl@0
  1436
		if (TestWhichTests & TEST_BACKWARD)
sl@0
  1437
			{
sl@0
  1438
			for (iterIndex = 0; ; )
sl@0
  1439
				{
sl@0
  1440
				DEBUG_PRINT((_L("%S : %d Iter %d Backward\n"), &TestNameBuffer, aThreadIndex, iterIndex));
sl@0
  1441
				retVal = RunThreadBackward(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1442
				DEBUG_PRINT((_L("%S : %d Iter %d finished %d\n"), &TestNameBuffer, aThreadIndex, iterIndex, retVal));
sl@0
  1443
				if ((retVal == KErrCancel) && iterIndex > 0)
sl@0
  1444
					retVal = KErrNone;
sl@0
  1445
				if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1446
					break;
sl@0
  1447
				if (++iterIndex >= TestMaxLoops)
sl@0
  1448
					break;
sl@0
  1449
				User::AfterHighRes(TEST_DOT_PERIOD/3*1000000);
sl@0
  1450
				}
sl@0
  1451
			}
sl@0
  1452
sl@0
  1453
		if (TestWhichTests & TEST_RANDOM)
sl@0
  1454
			{
sl@0
  1455
			for (iterIndex = 0; ; )
sl@0
  1456
				{
sl@0
  1457
				DEBUG_PRINT((_L("%S : %d Iter %d Random\n"), &TestNameBuffer, aThreadIndex, iterIndex));
sl@0
  1458
				retVal = RunThreadRandom(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1459
				DEBUG_PRINT((_L("%S : %d Iter %d finished %d\n"), &TestNameBuffer, aThreadIndex, iterIndex, retVal));
sl@0
  1460
				if ((retVal == KErrCancel) && iterIndex > 0)
sl@0
  1461
					retVal = KErrNone;
sl@0
  1462
				if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1463
					break;
sl@0
  1464
				if (++iterIndex >= TestMaxLoops)
sl@0
  1465
					break;
sl@0
  1466
				User::AfterHighRes(TEST_DOT_PERIOD/3*1000000);
sl@0
  1467
				}
sl@0
  1468
			}
sl@0
  1469
		
sl@0
  1470
		if (TestWhichTests & TEST_THRASH)
sl@0
  1471
			{
sl@0
  1472
			for (iterIndex = 0; ; )
sl@0
  1473
				{
sl@0
  1474
				DEBUG_PRINT((_L("%S : %d Iter %d Thrash Load\n"), &TestNameBuffer, aThreadIndex, iterIndex));
sl@0
  1475
				retVal = ThrashThreadLoad(aThreadIndex, pTheLibs, maxDllIndex, aMsgQueue, aBuffer, aTheSem);
sl@0
  1476
				DEBUG_PRINT((_L("%S : %d Iter %d finished %d\n"), &TestNameBuffer, aThreadIndex, iterIndex, retVal));
sl@0
  1477
				if ((retVal == KErrCancel) && iterIndex > 0)
sl@0
  1478
					retVal = KErrNone;
sl@0
  1479
				if ((retVal != KErrNone) || TestThreadsExit)
sl@0
  1480
					break;
sl@0
  1481
				if (++iterIndex >= TestMaxLoops)
sl@0
  1482
					break;
sl@0
  1483
				User::AfterHighRes(TEST_DOT_PERIOD/3*1000000);
sl@0
  1484
				}
sl@0
  1485
			}
sl@0
  1486
		}
sl@0
  1487
sl@0
  1488
	if (TestLoadDllHow == TEST_DLL_THREAD)
sl@0
  1489
		{
sl@0
  1490
		CloseTheLibs(pTheLibs, maxDllIndex);
sl@0
  1491
		User::Free(pTheLibs);
sl@0
  1492
		}
sl@0
  1493
sl@0
  1494
	DEBUG_PRINT((_L("%S : thread %d Exit (tick %u)\n"), &TestNameBuffer, aThreadIndex, User::TickCount() - start));
sl@0
  1495
	return retVal;
sl@0
  1496
	}
sl@0
  1497
sl@0
  1498
sl@0
  1499
//
sl@0
  1500
// MultipleTestThread
sl@0
  1501
//
sl@0
  1502
// Thread function, one created for each thread in a multiple thread test.
sl@0
  1503
//
sl@0
  1504
sl@0
  1505
LOCAL_C TInt MultipleTestThread(TAny* aUseTb)
sl@0
  1506
	{
sl@0
  1507
	TInt			ret;
sl@0
  1508
	TMessageBuf		localBuffer;
sl@0
  1509
sl@0
  1510
	if (TestInterleave)	
sl@0
  1511
		{
sl@0
  1512
		RThread				thisThread;
sl@0
  1513
		thisThread.SetPriority((TThreadPriority) TEST_INTERLEAVE_PRIO);
sl@0
  1514
		}
sl@0
  1515
sl@0
  1516
	ret = PerformTestThread((TInt) aUseTb, &TestMsgQueue, &localBuffer, &TestMultiSem);
sl@0
  1517
	if (!TestingChunks)
sl@0
  1518
		{
sl@0
  1519
		if (ret != KErrNone) 
sl@0
  1520
			User::Panic(_L("LOAD"), KErrGeneral);
sl@0
  1521
		}
sl@0
  1522
	return KErrNone;
sl@0
  1523
	}
sl@0
  1524
sl@0
  1525
//
sl@0
  1526
// StartExe
sl@0
  1527
//
sl@0
  1528
// Start an executable.
sl@0
  1529
//
sl@0
  1530
sl@0
  1531
TInt StartExe(RProcess& aTheProcesses, TRequestStatus* aPrStatus, TInt aIndex, TBool aLoadSelf, TBool aLowMem, RSemaphore *pTheSem = NULL)
sl@0
  1532
	{
sl@0
  1533
	TBuf<256>		buffer;
sl@0
  1534
	TInt			testWhich = KTestMediaRom;
sl@0
  1535
	//y_LIT(KTestDebug, "debug");
sl@0
  1536
	_LIT(KTestSilent, "silent");
sl@0
  1537
sl@0
  1538
	if ((TestWhichMedia & TEST_MEDIA_ALL) == TEST_MEDIA_ALL)
sl@0
  1539
		testWhich = aIndex % KTestMediaCOUNT;
sl@0
  1540
	else if ((TestWhichMedia & TEST_MEDIA_ALL) == TEST_MEDIA_ROM_BASE)
sl@0
  1541
		testWhich = (aIndex & 1) ? KTestMediaBase : KTestMediaRom;
sl@0
  1542
	else if (TestWhichMedia & TEST_MEDIA_BASE )
sl@0
  1543
		testWhich = KTestMediaBase;
sl@0
  1544
	else
sl@0
  1545
		testWhich = KTestMediaRom;
sl@0
  1546
sl@0
  1547
	if (!TestDllExesExist[testWhich])
sl@0
  1548
		testWhich = KTestMediaBase;
sl@0
  1549
sl@0
  1550
	buffer.Zero();
sl@0
  1551
	TInt ret;
sl@0
  1552
	if (aLoadSelf)
sl@0
  1553
		{
sl@0
  1554
		buffer.Format(_L("single random dll %S iters %d inst %d"),
sl@0
  1555
			/* TestDebug ? &KTestDebug : */ &KTestSilent, TestMaxLoops, aIndex);
sl@0
  1556
		if (TestExtremeChunks)
sl@0
  1557
			buffer.Append(_L(" echunks"));
sl@0
  1558
		else if (TestChunksPlus)
sl@0
  1559
			buffer.Append(_L(" chunks prio"));
sl@0
  1560
		if (TestChunkData == EFalse)
sl@0
  1561
			buffer.Append(_L(" nochunkdata"));
sl@0
  1562
		DBGS_PRINT((_L("%S : Starting Process %d %S %S\n"),
sl@0
  1563
			&TestNameBuffer, aIndex, &TestPlExeNames[testWhich], &buffer));
sl@0
  1564
		DOTEST1(ret,aTheProcesses.Create(TestPlExeNames[testWhich],buffer),KErrNone, KErrNoMemory);
sl@0
  1565
		}
sl@0
  1566
	else
sl@0
  1567
		{
sl@0
  1568
		buffer.Format(_L("single random %S iters %d inst %d"),
sl@0
  1569
			/* TestDebug ? &KTestDebug : */ &KTestSilent, TestMaxLoops, aIndex);
sl@0
  1570
		DBGS_PRINT((_L("%S : Starting Process %d %S %S\n"),
sl@0
  1571
			&TestNameBuffer, aIndex, &TestPsExeNames[testWhich], &buffer));
sl@0
  1572
		DOTEST1(ret,aTheProcesses.Create(TestPsExeNames[testWhich],buffer),KErrNone, KErrNoMemory);
sl@0
  1573
		}
sl@0
  1574
	if (ret == KErrNone)
sl@0
  1575
		{
sl@0
  1576
		if(aPrStatus)
sl@0
  1577
			{
sl@0
  1578
			aTheProcesses.Logon(*aPrStatus);
sl@0
  1579
			RUNTEST1(*aPrStatus == KRequestPending);	
sl@0
  1580
			}
sl@0
  1581
		aTheProcesses.Resume();
sl@0
  1582
		}
sl@0
  1583
	return ret;
sl@0
  1584
	}
sl@0
  1585
sl@0
  1586
//
sl@0
  1587
// PerformRomAndFileSystemAccessThread
sl@0
  1588
// 
sl@0
  1589
// Access the rom and dump it out to one of the writeable partitions...
sl@0
  1590
// really just to make the media server a little busy during the test.
sl@0
  1591
//
sl@0
  1592
TInt PerformRomAndFileSystemAccessThread(TInt					aThreadId,
sl@0
  1593
										 RMsgQueue<TMessageBuf> *aMsgQueue, 
sl@0
  1594
										 TMessageBuf		   *aBuffer,
sl@0
  1595
										 RSemaphore			   *aTheSem,
sl@0
  1596
										 TBool					aLowMem)
sl@0
  1597
	{
sl@0
  1598
	RThread		 thisThread;
sl@0
  1599
	TUint		 maxBytes = KMaxTUint;
sl@0
  1600
	TInt		 startTime = User::TickCount();
sl@0
  1601
	RSemaphore	*pTheSem = aTheSem;
sl@0
  1602
	RFs fs;
sl@0
  1603
	RFile file;
sl@0
  1604
sl@0
  1605
	if (KErrNone != fs.Connect())
sl@0
  1606
		{
sl@0
  1607
		DEBUG_PRINT(_L("PerformRomAndFileSystemAccessThread : Can't connect to the FS\n"));
sl@0
  1608
		return KErrGeneral;
sl@0
  1609
		}
sl@0
  1610
sl@0
  1611
	// get info about the ROM...
sl@0
  1612
	TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress();
sl@0
  1613
	TUint8* start;
sl@0
  1614
	TUint8* end;
sl@0
  1615
	if(romHeader->iPageableRomStart)
sl@0
  1616
		{
sl@0
  1617
		start = (TUint8*)romHeader + romHeader->iPageableRomStart;
sl@0
  1618
		end = start + romHeader->iPageableRomSize;
sl@0
  1619
		}
sl@0
  1620
	else
sl@0
  1621
		{
sl@0
  1622
		start = (TUint8*)romHeader;
sl@0
  1623
		end = start + romHeader->iUncompressedSize;
sl@0
  1624
		}
sl@0
  1625
	if (end <= start)
sl@0
  1626
		return KErrGeneral;
sl@0
  1627
sl@0
  1628
	// read all ROM pages in a random order...and write out to file in ROFs
sl@0
  1629
	TInt pageSize = 0;
sl@0
  1630
	UserSvr::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,&pageSize,0);
sl@0
  1631
sl@0
  1632
	TUint size = end - start - pageSize;
sl@0
  1633
	if(size > maxBytes)
sl@0
  1634
		size = maxBytes;
sl@0
  1635
sl@0
  1636
	TUint32 random = 1 + aThreadId;
sl@0
  1637
	TPtrC8  sourceData;
sl@0
  1638
	TUint8* theAddr;
sl@0
  1639
	HBufC8* checkData;
sl@0
  1640
sl@0
  1641
	DOTEST((checkData = HBufC8::New(pageSize + 10)),
sl@0
  1642
	       (checkData != NULL));
sl@0
  1643
	
sl@0
  1644
	if (!checkData)
sl@0
  1645
		{
sl@0
  1646
		DEBUG_PRINT((_L("RomAndFSThread %S : failed to alloc read buffer\n"), &TestNameBuffer));
sl@0
  1647
		}
sl@0
  1648
sl@0
  1649
	TInt		drvNum = (TestBootedFromMmc || TestOnlyFromMmc) ? FindMMCDriveNumber(fs) : FindFsNANDDrive(fs);
sl@0
  1650
	TBuf<32>	filename;
sl@0
  1651
	
sl@0
  1652
	filename.Format(_L("?:\\Pageldrtst%d.tmp"), aThreadId);
sl@0
  1653
	if (drvNum >= 0)
sl@0
  1654
		{
sl@0
  1655
		DEBUG_PRINT((_L("%S : Filename %S\n"), &TestNameBuffer, &filename));
sl@0
  1656
		}
sl@0
  1657
	else
sl@0
  1658
		{
sl@0
  1659
		DEBUG_PRINT((_L("RomAndFSThread : error getting drive num\n")));
sl@0
  1660
		drvNum = 3; //make it 'd' by default.
sl@0
  1661
		}
sl@0
  1662
	filename[0] = 'a' + drvNum;
sl@0
  1663
sl@0
  1664
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1665
	TInt allocatedSegmentCount = 0;
sl@0
  1666
	TInt filesOnClosedQueue = 0;
sl@0
  1667
#endif
sl@0
  1668
	TInt ret;
sl@0
  1669
	while(1)
sl@0
  1670
		{
sl@0
  1671
		for(TInt i = size / (pageSize); i>0; --i)
sl@0
  1672
			{
sl@0
  1673
			DEBUG_PRINT1((_L("%S : Opening the file\n"), &TestNameBuffer));
sl@0
  1674
			DOTEST((ret = file.Replace(fs, filename, EFileWrite)),
sl@0
  1675
				   (KErrNone == ret));
sl@0
  1676
sl@0
  1677
			random = random * 69069 + 1;
sl@0
  1678
			theAddr = (TUint8 *)(start + ((TInt64(random) * TInt64(size - pageSize)) >> 32));
sl@0
  1679
			sourceData.Set(theAddr,pageSize);
sl@0
  1680
			DEBUG_PRINT1((_L("%S : Writing the file\n"), &TestNameBuffer));
sl@0
  1681
			ret = file.Write(sourceData);
sl@0
  1682
			if (ret != KErrNone)
sl@0
  1683
				{
sl@0
  1684
				DEBUG_PRINT((_L("%S : Write returned error %d\n"), &TestNameBuffer, ret));
sl@0
  1685
				}
sl@0
  1686
			DEBUG_PRINT1((_L("%S : Closing the file\n"), &TestNameBuffer));
sl@0
  1687
			file.Close();
sl@0
  1688
			
sl@0
  1689
			if (checkData)
sl@0
  1690
				{
sl@0
  1691
				TPtr8  theBuf = checkData->Des();
sl@0
  1692
sl@0
  1693
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1694
				// Page cache
sl@0
  1695
				TFileCacheStats stats1;
sl@0
  1696
				TFileCacheStats stats2;
sl@0
  1697
				ret = controlIo(fs,drvNum, KControlIoFileCacheStats, stats1);
sl@0
  1698
				if ((ret != KErrNone) && (ret != KErrNotSupported))
sl@0
  1699
					{
sl@0
  1700
					DEBUG_PRINT((_L("%S : KControlIoFileCacheStats 1 failed %d\n"), &TestNameBuffer, ret));
sl@0
  1701
					}
sl@0
  1702
sl@0
  1703
				if (aThreadId & 1)
sl@0
  1704
					{
sl@0
  1705
					// flush closed files queue
sl@0
  1706
					ret = fs.ControlIo(drvNum, KControlIoFlushClosedFiles);
sl@0
  1707
					if (ret != KErrNone)
sl@0
  1708
						{
sl@0
  1709
						DEBUG_PRINT((_L("%S : KControlIoFlushClosedFiles failed %d\n"), &TestNameBuffer, ret));
sl@0
  1710
						}
sl@0
  1711
					}
sl@0
  1712
				else
sl@0
  1713
#endif //WANT_FS_CACHE_STATS 
sl@0
  1714
					{
sl@0
  1715
					// rename file to make sure it has cleared the cache.				
sl@0
  1716
					TBuf<32>	newname;
sl@0
  1717
					newname.Format(_L("d:\\Pageldrtst%d.temp"), aThreadId);
sl@0
  1718
					if (drvNum >= 0)
sl@0
  1719
						{
sl@0
  1720
						newname[0] = 'a' + drvNum;
sl@0
  1721
						}
sl@0
  1722
					fs.Rename(filename, newname);
sl@0
  1723
					filename = newname;
sl@0
  1724
					}
sl@0
  1725
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1726
				ret = controlIo(fs,drvNum, KControlIoFileCacheStats, stats2);
sl@0
  1727
				if (ret != KErrNone && ret != KErrNotSupported)
sl@0
  1728
					{
sl@0
  1729
					DEBUG_PRINT((_L("%S : KControlIoFileCacheStats2 failed %d\n"), &TestNameBuffer, ret));
sl@0
  1730
					}
sl@0
  1731
sl@0
  1732
				allocatedSegmentCount = (allocatedSegmentCount > stats1.iAllocatedSegmentCount) ? allocatedSegmentCount : stats1.iAllocatedSegmentCount;
sl@0
  1733
				filesOnClosedQueue = (filesOnClosedQueue > stats1.iFilesOnClosedQueue) ? filesOnClosedQueue : stats1.iFilesOnClosedQueue;
sl@0
  1734
#endif //WANT_FS_CACHE_STATS 
sl@0
  1735
sl@0
  1736
				DOTEST((ret = file.Open(fs, filename, EFileRead)),
sl@0
  1737
					   (KErrNone == ret));
sl@0
  1738
				// now read back the page that we wrote and compare with the source.
sl@0
  1739
				ret = file.Read(0, theBuf, pageSize);
sl@0
  1740
				if (ret == KErrNone)
sl@0
  1741
					{		
sl@0
  1742
					ret = sourceData.Compare(theBuf);
sl@0
  1743
					if (ret != 0)
sl@0
  1744
						{
sl@0
  1745
						DEBUG_PRINT((_L("%S : read compare error %d\n"), &TestNameBuffer, ret));
sl@0
  1746
						}
sl@0
  1747
					}
sl@0
  1748
				else
sl@0
  1749
					{
sl@0
  1750
					DEBUG_PRINT((_L("%S : failed read compare, error %d\n"), &TestNameBuffer, ret));
sl@0
  1751
					}
sl@0
  1752
				file.Close();
sl@0
  1753
				}
sl@0
  1754
			DEBUG_PRINT1((_L("%S : Deleting the file\n"), &TestNameBuffer));
sl@0
  1755
			ret = fs.Delete(filename);
sl@0
  1756
			if (KErrNone != ret)
sl@0
  1757
				{
sl@0
  1758
				DEBUG_PRINT((_L("%S [%d] Delete %S Failed %d!\n"), &TestNameBuffer, aThreadId, &filename, ret));
sl@0
  1759
				}
sl@0
  1760
		
sl@0
  1761
			if (TestPrioChange)
sl@0
  1762
				{
sl@0
  1763
				TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
  1764
				DEBUG_PRINT1((_L("%S [%d] media thread before priority change, stop = %d\n"), &TestNameBuffer, aThreadId, TestStopMedia));
sl@0
  1765
				thisThread.SetPriority(EPriorityLess);
sl@0
  1766
				User::AfterHighRes(0);
sl@0
  1767
				thisThread.SetPriority(originalThreadPriority);
sl@0
  1768
				DEBUG_PRINT1((_L("%S [%d] media thread after priority change, stop = %d\n"), &TestNameBuffer, aThreadId, TestStopMedia));
sl@0
  1769
				}
sl@0
  1770
			if (TestStopMedia)
sl@0
  1771
				break;
sl@0
  1772
			}
sl@0
  1773
		if (TestStopMedia)
sl@0
  1774
			break;
sl@0
  1775
		}
sl@0
  1776
sl@0
  1777
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1778
	DEBUG_PRINT((_L("%S : [%d] allocPageCount %d filesClosedQueue %d \n"),&TestNameBuffer, aThreadId,allocatedSegmentCount,filesOnClosedQueue));
sl@0
  1779
#endif //WANT_FS_CACHE_STATS 
sl@0
  1780
sl@0
  1781
	if (checkData)
sl@0
  1782
		{
sl@0
  1783
		delete checkData;
sl@0
  1784
		}
sl@0
  1785
	fs.Close();
sl@0
  1786
	DEBUG_PRINT1((_L("Done in %d ticks\n"), User::TickCount() - startTime));
sl@0
  1787
	return KErrNone;
sl@0
  1788
	}
sl@0
  1789
sl@0
  1790
//
sl@0
  1791
// PerformFileSystemAccessThread
sl@0
  1792
// 
sl@0
  1793
// Access the rom and dump it out to one of the writeable partitions...
sl@0
  1794
// really just to make the media server a little busy during the test.
sl@0
  1795
//
sl@0
  1796
TInt PerformFileSystemAccessThread(TInt					    aThreadId,
sl@0
  1797
								   RMsgQueue<TMessageBuf>   *aMsgQueue, 
sl@0
  1798
								   TMessageBuf	           *aBuffer,
sl@0
  1799
								   RSemaphore			   *aTheSem,
sl@0
  1800
								   TBool					aLowMem)
sl@0
  1801
	{
sl@0
  1802
	RThread		 thisThread;
sl@0
  1803
	TInt		 startTime = User::TickCount();
sl@0
  1804
	RSemaphore	*pTheSem = aTheSem;
sl@0
  1805
	RFs			 fs;
sl@0
  1806
	RFile		 file;
sl@0
  1807
	if (KErrNone != fs.Connect())
sl@0
  1808
		{
sl@0
  1809
		DEBUG_PRINT(_L("PerformFileSystemAccessThread : Can't connect to the FS\n"));
sl@0
  1810
		return KErrGeneral;
sl@0
  1811
		}
sl@0
  1812
sl@0
  1813
	// read all ROM pages in a random order...and write out to file in ROFs
sl@0
  1814
	TInt pageSize = 0;
sl@0
  1815
	UserSvr::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,&pageSize,0);
sl@0
  1816
sl@0
  1817
	HBufC8* checkData;
sl@0
  1818
	HBufC8* sourceData;
sl@0
  1819
	TUint32 random = 1 + aThreadId;
sl@0
  1820
	TInt	dataSize = pageSize + (pageSize / 2);
sl@0
  1821
	
sl@0
  1822
	DOTEST((sourceData = HBufC8::New(dataSize)),
sl@0
  1823
	       (sourceData != NULL));
sl@0
  1824
	if (!sourceData)
sl@0
  1825
		{
sl@0
  1826
		DEBUG_PRINT((_L("RomAndFSThread %S : failed to alloc read buffer\n"), &TestNameBuffer));
sl@0
  1827
		fs.Close();
sl@0
  1828
		return KErrGeneral;
sl@0
  1829
		}
sl@0
  1830
sl@0
  1831
	DOTEST((checkData = HBufC8::New(dataSize)),
sl@0
  1832
	       (checkData != NULL));
sl@0
  1833
	if (!checkData)
sl@0
  1834
		{
sl@0
  1835
		DEBUG_PRINT((_L("RomAndFSThread %S : failed to alloc read buffer\n"), &TestNameBuffer));
sl@0
  1836
		}
sl@0
  1837
sl@0
  1838
	TInt		drvNum = (TestBootedFromMmc || TestOnlyFromMmc) ? FindMMCDriveNumber(fs) : FindFsNANDDrive(fs);
sl@0
  1839
	TBuf<32>	filename;
sl@0
  1840
	
sl@0
  1841
	if (drvNum < 0)
sl@0
  1842
		{
sl@0
  1843
		drvNum = 3; //make it 'd' by default.
sl@0
  1844
		DEBUG_PRINT((_L("FSAccessThread : error getting drive num\n")));
sl@0
  1845
		}
sl@0
  1846
sl@0
  1847
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1848
	TInt allocatedSegmentCount = 0;
sl@0
  1849
	TInt filesOnClosedQueue = 0;
sl@0
  1850
#endif
sl@0
  1851
	TInt fileIndex;
sl@0
  1852
	TInt ret;
sl@0
  1853
sl@0
  1854
	TPtr8  pBuf = sourceData->Des();
sl@0
  1855
	
sl@0
  1856
	while (1)
sl@0
  1857
		{
sl@0
  1858
		TUint32 randomStart = random;
sl@0
  1859
		// write the file
sl@0
  1860
		for (fileIndex = 0; fileIndex < TEST_NUM_FILES; fileIndex ++)
sl@0
  1861
			{
sl@0
  1862
			filename.Format(_L("%c:\\pldrtst%d_%d.tmp"), 'a' + drvNum, aThreadId, fileIndex);
sl@0
  1863
sl@0
  1864
			DEBUG_PRINT1((_L("%S : Opening the file\n"), &TestNameBuffer));
sl@0
  1865
sl@0
  1866
			DOTEST ((ret = file.Replace(fs, filename, EFileWrite)),
sl@0
  1867
				   (KErrNone == ret));
sl@0
  1868
sl@0
  1869
			pBuf.Zero();			
sl@0
  1870
			if (fileIndex & 1)
sl@0
  1871
				{
sl@0
  1872
				TInt fillSize = dataSize / sizeof(TUint32);
sl@0
  1873
				while (fillSize > 0)
sl@0
  1874
					{
sl@0
  1875
					random = random * 69069 + 1;
sl@0
  1876
					pBuf.Append((const TUint8 *) &random, sizeof(random));
sl@0
  1877
					fillSize --;
sl@0
  1878
					}
sl@0
  1879
				}
sl@0
  1880
			else
sl@0
  1881
				{
sl@0
  1882
				pBuf.Fill('x',dataSize);
sl@0
  1883
				}
sl@0
  1884
		
sl@0
  1885
sl@0
  1886
			DEBUG_PRINT1((_L("%S : Writing the file\n"), &TestNameBuffer));
sl@0
  1887
			ret = file.Write(sourceData->Des());
sl@0
  1888
			if (ret != KErrNone)
sl@0
  1889
				{
sl@0
  1890
				DEBUG_PRINT((_L("%S : Write returned error %d\n"), &TestNameBuffer, ret));
sl@0
  1891
				}
sl@0
  1892
			DEBUG_PRINT1((_L("%S : Closing the file\n"), &TestNameBuffer));
sl@0
  1893
			file.Close();
sl@0
  1894
			}
sl@0
  1895
sl@0
  1896
		random = randomStart;
sl@0
  1897
		// check the file
sl@0
  1898
		for (fileIndex = 0; fileIndex < TEST_NUM_FILES; fileIndex ++)
sl@0
  1899
			{
sl@0
  1900
			filename.Format(_L("%c:\\pldrtst%d_%d.tmp"), 'a' + drvNum, aThreadId, fileIndex);
sl@0
  1901
			
sl@0
  1902
			if (checkData)
sl@0
  1903
				{
sl@0
  1904
				TPtr8  theBuf = checkData->Des();
sl@0
  1905
sl@0
  1906
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1907
				// Page cache
sl@0
  1908
				TFileCacheStats stats1;
sl@0
  1909
				TFileCacheStats stats2;
sl@0
  1910
				ret = controlIo(fs,drvNum, KControlIoFileCacheStats, stats1);
sl@0
  1911
				if ((ret != KErrNone) && (ret != KErrNotSupported))
sl@0
  1912
					{
sl@0
  1913
					DEBUG_PRINT((_L("%S : KControlIoFileCacheStats 1 failed %d\n"), &TestNameBuffer, ret));
sl@0
  1914
					}
sl@0
  1915
sl@0
  1916
				if (aThreadId & 1)
sl@0
  1917
					{
sl@0
  1918
					// flush closed files queue
sl@0
  1919
					ret = fs.ControlIo(drvNum, KControlIoFlushClosedFiles);
sl@0
  1920
					if (ret != KErrNone)
sl@0
  1921
						{
sl@0
  1922
						DEBUG_PRINT((_L("%S : KControlIoFlushClosedFiles failed %d\n"), &TestNameBuffer, ret));
sl@0
  1923
						}
sl@0
  1924
					}
sl@0
  1925
				else
sl@0
  1926
#endif //WANT_FS_CACHE_STATS 
sl@0
  1927
					{
sl@0
  1928
					// rename file to make sure it has cleared the cache.				
sl@0
  1929
					TBuf<32>	newname;
sl@0
  1930
					newname.Format(_L("%c:\\pldrtst%d_%d.temp"), 'a' + drvNum, aThreadId, fileIndex);
sl@0
  1931
					fs.Rename(filename, newname);
sl@0
  1932
					filename = newname;
sl@0
  1933
					}
sl@0
  1934
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1935
				ret = controlIo(fs,drvNum, KControlIoFileCacheStats, stats2);
sl@0
  1936
				if (ret != KErrNone && ret != KErrNotSupported)
sl@0
  1937
					{
sl@0
  1938
					DEBUG_PRINT((_L("%S : KControlIoFileCacheStats2 failed %d\n"), &TestNameBuffer, ret));
sl@0
  1939
					}
sl@0
  1940
				allocatedSegmentCount = (allocatedSegmentCount > stats1.iAllocatedSegmentCount) ? allocatedSegmentCount : stats1.iAllocatedSegmentCount;
sl@0
  1941
				filesOnClosedQueue = (filesOnClosedQueue > stats1.iFilesOnClosedQueue) ? filesOnClosedQueue : stats1.iFilesOnClosedQueue;
sl@0
  1942
#endif //WANT_FS_CACHE_STATS 
sl@0
  1943
sl@0
  1944
				DOTEST((ret = file.Open(fs, filename, EFileRead)),
sl@0
  1945
					   (KErrNone == ret));
sl@0
  1946
				// now read back the page that we wrote and compare with the source.
sl@0
  1947
				ret = file.Read(0, theBuf, dataSize);
sl@0
  1948
				if (ret == KErrNone)
sl@0
  1949
					{
sl@0
  1950
					pBuf.Zero();			
sl@0
  1951
					if (fileIndex & 1)
sl@0
  1952
						{
sl@0
  1953
						TInt fillSize = dataSize / sizeof(TUint32);
sl@0
  1954
						while (fillSize > 0)
sl@0
  1955
							{
sl@0
  1956
							random = random * 69069 + 1;
sl@0
  1957
							pBuf.Append((const TUint8 *) &random, sizeof(random));
sl@0
  1958
							fillSize --;
sl@0
  1959
							}
sl@0
  1960
						}
sl@0
  1961
					else
sl@0
  1962
						{
sl@0
  1963
						pBuf.Fill('x',dataSize);
sl@0
  1964
						}
sl@0
  1965
sl@0
  1966
					ret = sourceData->Des().Compare(theBuf);
sl@0
  1967
					if (ret != 0)
sl@0
  1968
						{
sl@0
  1969
						DEBUG_PRINT((_L("%S :compare error %S %d\n"), &TestNameBuffer, &filename, ret));
sl@0
  1970
						}
sl@0
  1971
					}
sl@0
  1972
				else
sl@0
  1973
					{
sl@0
  1974
					DEBUG_PRINT((_L("%S : failed read compare, error %d\n"), &TestNameBuffer, ret));
sl@0
  1975
					}
sl@0
  1976
				file.Close();
sl@0
  1977
				}
sl@0
  1978
			DEBUG_PRINT1((_L("%S : Deleting the file\n"), &TestNameBuffer));
sl@0
  1979
			ret = fs.Delete(filename);
sl@0
  1980
			if (KErrNone != ret)
sl@0
  1981
				{
sl@0
  1982
				DEBUG_PRINT((_L("%S [%d] Delete %S Failed %d!\n"), &TestNameBuffer, aThreadId, &filename, ret));
sl@0
  1983
				}
sl@0
  1984
			if (TestPrioChange)
sl@0
  1985
				{
sl@0
  1986
				TThreadPriority originalThreadPriority = thisThread.Priority();
sl@0
  1987
				thisThread.SetPriority(EPriorityLess);
sl@0
  1988
				User::AfterHighRes(0);
sl@0
  1989
				thisThread.SetPriority(originalThreadPriority);
sl@0
  1990
				}
sl@0
  1991
			if (TestStopMedia)
sl@0
  1992
				break;
sl@0
  1993
			}
sl@0
  1994
		if (TestStopMedia)
sl@0
  1995
			break;
sl@0
  1996
		}
sl@0
  1997
#ifdef WANT_FS_CACHE_STATS 
sl@0
  1998
	DEBUG_PRINT((_L("%S : [%d] allocPageCount %d filesClosedQueue %d \n"),&TestNameBuffer, aThreadId,allocatedSegmentCount,filesOnClosedQueue));
sl@0
  1999
#endif //WANT_FS_CACHE_STATS 
sl@0
  2000
sl@0
  2001
	if (checkData)
sl@0
  2002
		{
sl@0
  2003
		delete checkData;
sl@0
  2004
		}
sl@0
  2005
	delete sourceData;
sl@0
  2006
	fs.Close();
sl@0
  2007
	DEBUG_PRINT1((_L("Done in %d ticks\n"), User::TickCount() - startTime));
sl@0
  2008
	return KErrNone;
sl@0
  2009
	}
sl@0
  2010
sl@0
  2011
//
sl@0
  2012
// PerformRomAndFileSystemAccess
sl@0
  2013
//
sl@0
  2014
// Thread function, kicks off the file system access.
sl@0
  2015
//
sl@0
  2016
sl@0
  2017
LOCAL_C TInt PerformRomAndFileSystemAccess(TAny* aParam)
sl@0
  2018
	{
sl@0
  2019
	TMessageBuf			localBuffer;
sl@0
  2020
	TInt				threadId = (TInt) aParam;
sl@0
  2021
	TInt				retVal = KErrGeneral;
sl@0
  2022
sl@0
  2023
	if (TestInterleave)	
sl@0
  2024
		{
sl@0
  2025
		RThread				thisThread;
sl@0
  2026
		thisThread.SetPriority((TThreadPriority) TEST_INTERLEAVE_PRIO);
sl@0
  2027
		}
sl@0
  2028
sl@0
  2029
	switch (TestMediaAccess)
sl@0
  2030
		{
sl@0
  2031
		default:
sl@0
  2032
		break;
sl@0
  2033
		
sl@0
  2034
		case KTestMediaAccessBasic:
sl@0
  2035
		case KTestMediaAccessMultipleThreads:
sl@0
  2036
			retVal = PerformRomAndFileSystemAccessThread(threadId, &TestMsgQueue, &localBuffer, &TestMultiSem, TestingLowMem);	
sl@0
  2037
		break;
sl@0
  2038
				
sl@0
  2039
		case KTestMediaAccessMultiplePattern:
sl@0
  2040
			retVal = PerformFileSystemAccessThread(threadId, &TestMsgQueue, &localBuffer, &TestMultiSem, TestingLowMem);
sl@0
  2041
		break;
sl@0
  2042
sl@0
  2043
		case KTestMediaAccessMixed:
sl@0
  2044
			if (threadId < ((TestMultipleThreadCount + 1) / 2))
sl@0
  2045
				retVal = PerformRomAndFileSystemAccessThread(threadId, &TestMsgQueue, &localBuffer, &TestMultiSem, TestingLowMem);	
sl@0
  2046
			else
sl@0
  2047
				retVal = PerformFileSystemAccessThread(threadId, &TestMsgQueue, &localBuffer, &TestMultiSem, TestingLowMem);
sl@0
  2048
		break;
sl@0
  2049
		}
sl@0
  2050
	return retVal;
sl@0
  2051
	}
sl@0
  2052
sl@0
  2053
sl@0
  2054
//
sl@0
  2055
// DisplayTestBanner
sl@0
  2056
// 
sl@0
  2057
// Output a header showing the test parameters.
sl@0
  2058
//
sl@0
  2059
sl@0
  2060
void DisplayTestBanner(TBool aMultiple)
sl@0
  2061
	{
sl@0
  2062
	DBGS_PRINT((_L("%S : what = %S%S%S(0x%x), media = %S%S%S(0x%x)\n"),
sl@0
  2063
				aMultiple ? &KMultipleTest : &KSingleTest,
sl@0
  2064
				TestLoading & TEST_EXE ? &KTestExe : &KTestBlank,
sl@0
  2065
 				TestLoading & TEST_DLL ? &KTestDll : &KTestBlank,
sl@0
  2066
 				TestLoading & TEST_SELF ? &KTestSelf : &KTestBlank,
sl@0
  2067
				TestLoading,
sl@0
  2068
				TestWhichMedia & TEST_MEDIA_BASE ? &KTestBase : &KTestBlank,
sl@0
  2069
				TestWhichMedia & TEST_MEDIA_ROM ? &KTestRom : &KTestBlank,
sl@0
  2070
				(TestWhichMedia & TEST_MEDIA_ALL) == TEST_MEDIA_ALL ? &KTestAll : &KTestBlank,
sl@0
  2071
				TestWhichMedia));
sl@0
  2072
	DBGS_PRINT((_L("         : maxLoops = %d, threads = %d, loadHow = %S (0x%x)\n"),
sl@0
  2073
				TestMaxLoops,
sl@0
  2074
				TestMultipleThreadCount,
sl@0
  2075
				TestLoadDllHow == TEST_DLL_GLOBAL ? &KTestGlobal : TestLoadDllHow == TEST_DLL_THREAD ? &KTestThread : &KTestFunc, TestLoadDllHow));
sl@0
  2076
	DBGS_PRINT((_L("         : options = %S%S%S%S%S%S, which = %S%S%S%S (0x%x)\n"),
sl@0
  2077
				TestInterleave ? &KTestInter : &KTestBlank,
sl@0
  2078
				TestPrioChange ? &KTestPrio: &KTestBlank,
sl@0
  2079
				(TestMediaAccess == KTestMediaAccessNone) ? &KTestBlank : &KTestMedia,
sl@0
  2080
				TestingLowMem ? &KTestLowMem : &KTestBlank, 
sl@0
  2081
				TestExtremeChunks ? &KTestEChunking : TestChunksPlus ? &KTestChunkingPlus : TestingChunks ? &KTestChunking : &KTestBlank, 
sl@0
  2082
				TestingReaper ? &KTestReaper : &KTestBlank, 
sl@0
  2083
				TestWhichTests & TEST_THRASH ? &KTestThrash : &KTestBlank,
sl@0
  2084
				TestWhichTests & TEST_FORWARD ? &KTestForward : &KTestBlank,
sl@0
  2085
				TestWhichTests & TEST_BACKWARD ? &KTestBackward : &KTestBlank,
sl@0
  2086
				TestWhichTests & TEST_RANDOM ? &KTestRandom : &KTestBlank,
sl@0
  2087
				TestWhichTests));
sl@0
  2088
	}
sl@0
  2089
sl@0
  2090
//
sl@0
  2091
// DoSingleTest
sl@0
  2092
// 
sl@0
  2093
// Perform the single thread test, spawning a number of threads.
sl@0
  2094
//
sl@0
  2095
sl@0
  2096
LOCAL_C TInt DoSingleTest(TBool aLowMem = EFalse)
sl@0
  2097
	{
sl@0
  2098
	TUint        start = User::TickCount();
sl@0
  2099
	RSemaphore	*pTheSem = NULL;
sl@0
  2100
	TInt ret = KErrNone;
sl@0
  2101
	DisplayTestBanner(EFalse);
sl@0
  2102
sl@0
  2103
	if (aLowMem)
sl@0
  2104
		{
sl@0
  2105
		DOTEST1(ret,TestMultiSem.CreateLocal(1),KErrNone, KErrNoMemory);
sl@0
  2106
		pTheSem = &TestMultiSem;
sl@0
  2107
		}
sl@0
  2108
	if (TestLoading & TEST_EXE)
sl@0
  2109
		{
sl@0
  2110
		RProcess		theProcess;
sl@0
  2111
		TRequestStatus	status;
sl@0
  2112
		
sl@0
  2113
		if (StartExe(theProcess, &status, 0, EFalse, aLowMem, pTheSem) == KErrNone)
sl@0
  2114
			{
sl@0
  2115
			User::WaitForRequest(status);
sl@0
  2116
			if (theProcess.ExitType() == EExitPanic)
sl@0
  2117
				{
sl@0
  2118
				DBGS_PRINT((_L("%S : Process Panic'd...\n"), &TestNameBuffer));	
sl@0
  2119
				}
sl@0
  2120
			theProcess.Close();
sl@0
  2121
			}
sl@0
  2122
		}
sl@0
  2123
sl@0
  2124
	if (TestLoading & TEST_SELF)
sl@0
  2125
		{
sl@0
  2126
		RProcess		theProcess;
sl@0
  2127
		TRequestStatus	status;
sl@0
  2128
		
sl@0
  2129
		if (StartExe(theProcess, &status, 0, ETrue, aLowMem,pTheSem) == KErrNone)
sl@0
  2130
			{
sl@0
  2131
			User::WaitForRequest(status);
sl@0
  2132
			if (theProcess.ExitType() == EExitPanic)
sl@0
  2133
				{
sl@0
  2134
				DBGS_PRINT((_L("%S : Process Panic'd...\n"), &TestNameBuffer));
sl@0
  2135
				}
sl@0
  2136
			theProcess.Close();
sl@0
  2137
			}
sl@0
  2138
		}
sl@0
  2139
sl@0
  2140
	if (TestLoading	& TEST_DLL)
sl@0
  2141
		{
sl@0
  2142
		TInt maxDlls = GetNumDlls();
sl@0
  2143
		if (TestLoadDllHow == TEST_DLL_GLOBAL)
sl@0
  2144
			{
sl@0
  2145
			TInt retVal = LoadTheLibs(theGlobalLibs, maxDlls, TestInstanceId, NULL, NULL, pTheSem);
sl@0
  2146
			if (retVal != KErrNone)
sl@0
  2147
				{
sl@0
  2148
				DBGS_PRINT((_L("DoSingleTest - unable to load libs\n") ));
sl@0
  2149
				CloseTheLibs (theGlobalLibs, PAGELDRTST_MAX_DLLS);
sl@0
  2150
				if (aLowMem)
sl@0
  2151
					{
sl@0
  2152
					TestMultiSem.Close();
sl@0
  2153
					}
sl@0
  2154
				return KErrGeneral;
sl@0
  2155
				}
sl@0
  2156
			}
sl@0
  2157
sl@0
  2158
		ret = PerformTestThread((TInt) TestInstanceId, NULL, NULL, pTheSem);
sl@0
  2159
sl@0
  2160
		if (TestLoadDllHow == TEST_DLL_GLOBAL)
sl@0
  2161
			{
sl@0
  2162
			CloseTheLibs(theGlobalLibs, maxDlls);
sl@0
  2163
			}
sl@0
  2164
		}
sl@0
  2165
	if (aLowMem)
sl@0
  2166
		{
sl@0
  2167
		TestMultiSem.Close();
sl@0
  2168
		}
sl@0
  2169
sl@0
  2170
	if (!TestSilent)
sl@0
  2171
		{
sl@0
  2172
		TInt end = User::TickCount();
sl@0
  2173
		TInt time = TUint((TUint64)(end-start)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2174
		DBGS_PRINT((_L("\n%S : Single Test : (%u seconds)\n"), &TestNameBuffer, time));
sl@0
  2175
		}
sl@0
  2176
sl@0
  2177
	return ret;
sl@0
  2178
	}
sl@0
  2179
sl@0
  2180
//
sl@0
  2181
// FillPage
sl@0
  2182
//
sl@0
  2183
// Fill a page with test data
sl@0
  2184
//
sl@0
  2185
sl@0
  2186
void FillPage(TUint aOffset)
sl@0
  2187
	{
sl@0
  2188
	if (TestChunkData)
sl@0
  2189
		{
sl@0
  2190
		TUint32* ptr = (TUint32 *)((TUint8 *)TestChunkBase+aOffset);
sl@0
  2191
		TUint32* ptrEnd = (TUint32 *)((TUint8 *)ptr + TestPageSize);
sl@0
  2192
		do 
sl@0
  2193
			{
sl@0
  2194
			*ptr = 0x55000000 + aOffset;
sl@0
  2195
			ptr ++;
sl@0
  2196
			aOffset += 4;
sl@0
  2197
			}
sl@0
  2198
		while(ptr<ptrEnd);
sl@0
  2199
		}
sl@0
  2200
	}
sl@0
  2201
sl@0
  2202
//
sl@0
  2203
// CheckPage
sl@0
  2204
//
sl@0
  2205
// Check a page matches test data....
sl@0
  2206
//
sl@0
  2207
sl@0
  2208
TBool CheckPage(TUint index, TUint aOffset)
sl@0
  2209
	{
sl@0
  2210
	TBool ret = ETrue;
sl@0
  2211
	if (TestChunkData)
sl@0
  2212
		{
sl@0
  2213
		TUint32* ptr = (TUint32 *)((TUint8 *)TestChunkBase+aOffset);
sl@0
  2214
		TUint32* ptrEnd = (TUint32 *)((TUint8 *)ptr + TestPageSize);
sl@0
  2215
		do
sl@0
  2216
			{
sl@0
  2217
			if (*ptr != (0x55000000 + aOffset)) 
sl@0
  2218
				break;
sl@0
  2219
			ptr ++;
sl@0
  2220
			aOffset += 4;
sl@0
  2221
			}
sl@0
  2222
		while(ptr<ptrEnd);
sl@0
  2223
		if (ptr==ptrEnd)
sl@0
  2224
			{
sl@0
  2225
			TestChunkStats[index].check.ok ++;
sl@0
  2226
			}
sl@0
  2227
		else
sl@0
  2228
			{
sl@0
  2229
			TestChunkStats[index].check.fail ++;
sl@0
  2230
			ret = EFalse;
sl@0
  2231
			}
sl@0
  2232
		}
sl@0
  2233
	return ret;
sl@0
  2234
	}
sl@0
  2235
sl@0
  2236
//
sl@0
  2237
// DoSomeChunking
sl@0
  2238
//
sl@0
  2239
// Lock and unlock various pages in a chunk...
sl@0
  2240
//
sl@0
  2241
TUint   TestChunkingIndex = 0;
sl@0
  2242
TUint   TestChunkingIndexFails = 0;
sl@0
  2243
sl@0
  2244
void DoSomeChunking()
sl@0
  2245
	{
sl@0
  2246
	TUint       iters = TEST_NUM_CHUNK_PAGES / 4;
sl@0
  2247
	TBool		lockit = EFalse;
sl@0
  2248
	TBool		decomit = EFalse;
sl@0
  2249
	TUint		index;
sl@0
  2250
	TInt		ret;
sl@0
  2251
	TInt		theOffset;
sl@0
  2252
	
sl@0
  2253
	while (iters)
sl@0
  2254
		{
sl@0
  2255
		TestChunkingIndex = TestChunkingIndex * 69069 + 1;
sl@0
  2256
		index = TUint64((TUint64)TestChunkingIndex*(TUint64)TEST_NUM_CHUNK_PAGES)>>32;
sl@0
  2257
		if (index >= TEST_NUM_CHUNK_PAGES)
sl@0
  2258
			TestChunkingIndexFails ++;
sl@0
  2259
sl@0
  2260
		theOffset = index * TestPageSize;
sl@0
  2261
		if (theOffset < TestCommitEnd)
sl@0
  2262
			{
sl@0
  2263
			if (lockit)
sl@0
  2264
				{
sl@0
  2265
				if (decomit)
sl@0
  2266
					{
sl@0
  2267
					ret = TestChunk.Decommit(theOffset,TestPageSize);
sl@0
  2268
					if (KErrNone == ret)
sl@0
  2269
						TestChunkStats[index].decommit.ok ++;
sl@0
  2270
					else
sl@0
  2271
						TestChunkStats[index].decommit.fail ++;
sl@0
  2272
					ret = TestChunk.Commit(theOffset,TestPageSize);
sl@0
  2273
					if (KErrNone == ret)
sl@0
  2274
						{
sl@0
  2275
						TestChunkStats[index].commit.ok ++;
sl@0
  2276
						FillPage(theOffset);
sl@0
  2277
						TestChunkPageState[index] = ETrue;
sl@0
  2278
						}
sl@0
  2279
					else
sl@0
  2280
						{
sl@0
  2281
						TestChunkStats[index].commit.fail ++;
sl@0
  2282
						TestChunkPageState[index] = EFalse;
sl@0
  2283
						}
sl@0
  2284
					ret = KErrNone;
sl@0
  2285
					}
sl@0
  2286
				else
sl@0
  2287
					{
sl@0
  2288
					ret = TestChunk.Lock(theOffset,TestPageSize);
sl@0
  2289
					if (KErrNone == ret)
sl@0
  2290
						{
sl@0
  2291
						TestChunkStats[index].lock.ok ++;
sl@0
  2292
						if (!CheckPage(index, theOffset))
sl@0
  2293
							FillPage(theOffset);
sl@0
  2294
						TestChunkPageState[index] = ETrue;
sl@0
  2295
						}
sl@0
  2296
					else
sl@0
  2297
						{
sl@0
  2298
						TestChunkStats[index].lock.fail ++;
sl@0
  2299
						TestChunkPageState[index] = EFalse;
sl@0
  2300
						}
sl@0
  2301
					}
sl@0
  2302
				decomit = !decomit;
sl@0
  2303
				}
sl@0
  2304
			else
sl@0
  2305
				{
sl@0
  2306
				if (TestChunkPageState[index])
sl@0
  2307
					{
sl@0
  2308
					// this one should still be locked so the data should be ok.
sl@0
  2309
					if (KErrNone == TestChunk.Lock(theOffset,TestPageSize))
sl@0
  2310
						{				
sl@0
  2311
						TestChunkStats[index].lock.ok ++;
sl@0
  2312
						CheckPage(index, theOffset);
sl@0
  2313
						}
sl@0
  2314
					else
sl@0
  2315
						TestChunkStats[index].lock.fail ++;
sl@0
  2316
					}
sl@0
  2317
				ret = TestChunk.Unlock(theOffset,TestPageSize);
sl@0
  2318
				if (KErrNone == ret)
sl@0
  2319
					TestChunkStats[index].unlock.ok ++;
sl@0
  2320
				else
sl@0
  2321
					TestChunkStats[index].unlock.fail ++;
sl@0
  2322
				TestChunkPageState[index] = EFalse;
sl@0
  2323
				}
sl@0
  2324
			if (KErrNone != ret)			
sl@0
  2325
				{
sl@0
  2326
				// so now we need to commit another page in this pages place.
sl@0
  2327
				ret = TestChunk.Commit(theOffset,TestPageSize);
sl@0
  2328
				if (KErrNone != ret)
sl@0
  2329
					{
sl@0
  2330
					TestChunkStats[index].commit.fail ++;
sl@0
  2331
					//DBGS_PRINT((_L("%S : DoSomeChunking[%03d] index %03d failed to commit a page  %d\n"), &TestNameBuffer, iters, index, ret));
sl@0
  2332
					TestChunkPageState[index] = EFalse;
sl@0
  2333
					}
sl@0
  2334
				else
sl@0
  2335
					{
sl@0
  2336
					TestChunkStats[index].commit.ok ++;
sl@0
  2337
					FillPage(theOffset);
sl@0
  2338
					TestChunkPageState[index] = ETrue;
sl@0
  2339
					}
sl@0
  2340
				}
sl@0
  2341
			lockit = !lockit;
sl@0
  2342
			}
sl@0
  2343
		else
sl@0
  2344
			{
sl@0
  2345
			RDebug::Printf("DoSomeChunking - offset was bad %d / %d", theOffset, TestCommitEnd);
sl@0
  2346
			}
sl@0
  2347
		iters --;
sl@0
  2348
		}
sl@0
  2349
	}
sl@0
  2350
sl@0
  2351
//
sl@0
  2352
// DoMultipleTest
sl@0
  2353
// 
sl@0
  2354
// Perform the multiple thread test, spawning a number of threads.
sl@0
  2355
// It is complicated a little because test.Printf can only be called from the first thread that calls it 
sl@0
  2356
// so if we are using multiple threads we need to use a message queue to pass the debug info from the
sl@0
  2357
// child threads back to the parent for the parent to then call printf.
sl@0
  2358
//
sl@0
  2359
sl@0
  2360
TInt DoMultipleTest(TBool aLowMem = EFalse)
sl@0
  2361
	{
sl@0
  2362
	TInt			 index;
sl@0
  2363
	TUint            start = User::TickCount();
sl@0
  2364
	RThread			*pTheThreads = NULL;
sl@0
  2365
	TInt			*pThreadInUse = NULL;
sl@0
  2366
sl@0
  2367
	RProcess		*pTheProcesses = NULL;
sl@0
  2368
	TInt			*pProcessInUse = NULL;
sl@0
  2369
sl@0
  2370
	RThread			*pMedThreads = NULL;
sl@0
  2371
	TInt			*pMedInUse = NULL;
sl@0
  2372
sl@0
  2373
	TRequestStatus	mediaStatus;
sl@0
  2374
	RThread			mediaThread;
sl@0
  2375
	TInt ret;
sl@0
  2376
sl@0
  2377
	RSemaphore	*pTheSem = NULL;
sl@0
  2378
sl@0
  2379
	DisplayTestBanner(ETrue);
sl@0
  2380
	
sl@0
  2381
	TestThreadsExit = EFalse;
sl@0
  2382
sl@0
  2383
	DOTEST1(ret,TestMultiSem.CreateLocal(1),KErrNone, KErrNoMemory);
sl@0
  2384
	
sl@0
  2385
	pTheSem = &TestMultiSem;
sl@0
  2386
	if (TestLoading & TEST_DLL)
sl@0
  2387
		{
sl@0
  2388
		DOTEST((pTheThreads  = (RThread *)User::AllocZ(sizeof(RThread) * TestMultipleThreadCount)),
sl@0
  2389
		       (pTheThreads != NULL))
sl@0
  2390
		DOTEST((pThreadInUse = (TInt *)User::AllocZ(sizeof(TInt) * TestMultipleThreadCount)),
sl@0
  2391
		       (pThreadInUse != NULL));
sl@0
  2392
		RUNTEST1(pTheThreads && pThreadInUse);
sl@0
  2393
		if (!(pTheThreads && pThreadInUse))
sl@0
  2394
			return KErrGeneral;
sl@0
  2395
		}
sl@0
  2396
sl@0
  2397
	if (TestLoading & TEST_EXE_SELF)
sl@0
  2398
		{
sl@0
  2399
		DOTEST((pTheProcesses = (RProcess *)User::AllocZ(sizeof(RProcess) * TestMultipleThreadCount)),
sl@0
  2400
		       (pTheProcesses != NULL));
sl@0
  2401
		DOTEST((pProcessInUse = (TInt *)User::AllocZ(sizeof(TInt) * TestMultipleThreadCount)),
sl@0
  2402
		       (pProcessInUse != NULL));
sl@0
  2403
		RUNTEST1(pTheProcesses && pProcessInUse);
sl@0
  2404
		if (!(pTheProcesses && pProcessInUse))
sl@0
  2405
			return KErrGeneral;
sl@0
  2406
		}
sl@0
  2407
	
sl@0
  2408
	if (!TestSilent)
sl@0
  2409
		{
sl@0
  2410
		DOTEST1(ret,TestMsgQueue.CreateLocal(TestMultipleThreadCount * 10, EOwnerProcess),KErrNone, KErrNoMemory);
sl@0
  2411
		if (ret != KErrNone)
sl@0
  2412
			return KErrGeneral;
sl@0
  2413
		}
sl@0
  2414
sl@0
  2415
	if (TestMediaAccess != KTestMediaAccessNone)
sl@0
  2416
		{
sl@0
  2417
		if (TestMediaAccess != KTestMediaAccessBasic)
sl@0
  2418
			{
sl@0
  2419
			TestStopMedia = EFalse;
sl@0
  2420
			DOTEST((pMedThreads  = (RThread *)User::AllocZ(sizeof(RThread) * TestMultipleThreadCount)),
sl@0
  2421
				   (pMedThreads != NULL))
sl@0
  2422
			DOTEST((pMedInUse = (TInt *)User::AllocZ(sizeof(TInt) * TestMultipleThreadCount)),
sl@0
  2423
				   (pMedInUse != NULL));
sl@0
  2424
			RUNTEST1(pMedThreads && pMedInUse);
sl@0
  2425
			if (!(pMedThreads && pMedInUse))
sl@0
  2426
				return KErrGeneral;
sl@0
  2427
sl@0
  2428
			for (index = 0; index < TestMultipleThreadCount; index++)
sl@0
  2429
				{
sl@0
  2430
				DBGS_PRINT((_L("%S : Starting Media Thread %d\n"), &TestNameBuffer, index));
sl@0
  2431
				DOTEST1(ret,pMedThreads[index].Create(KTestBlank,PerformRomAndFileSystemAccess,KDefaultStackSize,NULL,(TAny*) index),KErrNone, KErrNoMemory);
sl@0
  2432
				if (ret == KErrNone)
sl@0
  2433
					{
sl@0
  2434
					pMedThreads[index].Resume();
sl@0
  2435
					pMedInUse[index] = 1;
sl@0
  2436
					}
sl@0
  2437
				User::AfterHighRes(0);
sl@0
  2438
				}
sl@0
  2439
			}
sl@0
  2440
		else
sl@0
  2441
			{
sl@0
  2442
			TestStopMedia = EFalse;
sl@0
  2443
			DOTEST1(ret,mediaThread.Create(KTestBlank,PerformRomAndFileSystemAccess,KDefaultStackSize,NULL,(TAny *) 0),KErrNone, KErrNoMemory);
sl@0
  2444
			if (ret == KErrNone)
sl@0
  2445
				{
sl@0
  2446
				mediaThread.Logon(mediaStatus);
sl@0
  2447
				RUNTEST1(mediaStatus == KRequestPending);	
sl@0
  2448
				mediaThread.Resume();
sl@0
  2449
				}
sl@0
  2450
			}
sl@0
  2451
		}
sl@0
  2452
sl@0
  2453
	TInt maxDlls = GetNumDlls();
sl@0
  2454
	if (TestLoadDllHow == TEST_DLL_GLOBAL)
sl@0
  2455
		{
sl@0
  2456
		TInt retVal = LoadTheLibs(theGlobalLibs, maxDlls, 0, NULL, NULL, NULL);
sl@0
  2457
		if (retVal != KErrNone)
sl@0
  2458
			{
sl@0
  2459
			DBGS_PRINT((_L("DoMultipleTest - unable to load libs\n")));
sl@0
  2460
			CloseTheLibs (theGlobalLibs, maxDlls);
sl@0
  2461
			if (!TestSilent)
sl@0
  2462
				{
sl@0
  2463
				TestMsgQueue.Close();
sl@0
  2464
				}
sl@0
  2465
			TestMultiSem.Close();
sl@0
  2466
			return KErrGeneral;
sl@0
  2467
			}
sl@0
  2468
		}
sl@0
  2469
sl@0
  2470
	// make sure we have a priority higher than that of the threads we spawn...
sl@0
  2471
	RThread thisThread;
sl@0
  2472
	TThreadPriority savedThreadPriority = thisThread.Priority();
sl@0
  2473
	const TThreadPriority KMainThreadPriority = EPriorityMuchMore;
sl@0
  2474
	__ASSERT_COMPILE(KMainThreadPriority>TEST_INTERLEAVE_PRIO);
sl@0
  2475
	thisThread.SetPriority(KMainThreadPriority);
sl@0
  2476
	
sl@0
  2477
sl@0
  2478
	for (index = 0; index < TestMultipleThreadCount; index++)
sl@0
  2479
		{
sl@0
  2480
		if (TestLoading & TEST_EXE_SELF)
sl@0
  2481
			{
sl@0
  2482
			if (KErrNone == StartExe(pTheProcesses[index], 0, index + ((TestLoading & TEST_DLL) ? TestMultipleThreadCount : 0), ((TestLoading & TEST_EXE_SELF) == TEST_EXE_SELF) ? (index & 2) : (TestLoading & TEST_SELF), aLowMem, pTheSem))
sl@0
  2483
				{
sl@0
  2484
				User::AfterHighRes(0);
sl@0
  2485
				pProcessInUse[index] = 1;
sl@0
  2486
				}
sl@0
  2487
			}
sl@0
  2488
		
sl@0
  2489
	
sl@0
  2490
		if (TestLoading & TEST_DLL)
sl@0
  2491
			{
sl@0
  2492
			DBGS_PRINT((_L("%S : Starting Thread %d\n"), &TestNameBuffer, index));
sl@0
  2493
			DOTEST1(ret,pTheThreads[index].Create(KTestBlank,MultipleTestThread,KDefaultStackSize,NULL,(TAny*) index),KErrNone, KErrNoMemory);
sl@0
  2494
			if (ret == KErrNone)
sl@0
  2495
				{
sl@0
  2496
				pTheThreads[index].Resume();
sl@0
  2497
				User::AfterHighRes(0);
sl@0
  2498
				pThreadInUse[index] = 1;
sl@0
  2499
				}
sl@0
  2500
			}
sl@0
  2501
		}
sl@0
  2502
sl@0
  2503
	// wait for any child threads to exit and process any debug messages they pass back to the parent.
sl@0
  2504
	TBool		anyUsed = ETrue;
sl@0
  2505
	TMessageBuf	localBuffer;
sl@0
  2506
	
sl@0
  2507
	TInt		processOk = 0;
sl@0
  2508
	TInt		threadOk = 0;
sl@0
  2509
	TInt		processPanic = 0;
sl@0
  2510
	TInt		threadPanic = 0;
sl@0
  2511
	TUint		end = start;
sl@0
  2512
	TUint		now;
sl@0
  2513
	TUint		time;
sl@0
  2514
	TUint		killNext = 0;
sl@0
  2515
	TUint		numDots = 0;
sl@0
  2516
	TUint		maxDots = (10*60)/TEST_DOT_PERIOD;	// No individual test should take longer than 10 minutes!
sl@0
  2517
													// Most have been tuned to take between 2 and 8 minutes.
sl@0
  2518
													// The autotests should not take more than 120 minutes total.
sl@0
  2519
sl@0
  2520
	while(anyUsed)
sl@0
  2521
		{
sl@0
  2522
		TInt threadCount = 0;
sl@0
  2523
		TInt processCount = 0;
sl@0
  2524
		anyUsed = EFalse;
sl@0
  2525
sl@0
  2526
		// check the message queue and call printf if we get a message.
sl@0
  2527
		if (!TestSilent)
sl@0
  2528
			{
sl@0
  2529
			while (KErrNone == TestMsgQueue.Receive(localBuffer))
sl@0
  2530
				{
sl@0
  2531
				DBGS_PRINT((localBuffer));
sl@0
  2532
				}
sl@0
  2533
			}
sl@0
  2534
sl@0
  2535
		// walk through the thread list to check which are still alive.
sl@0
  2536
		for (index = 0; index < TestMultipleThreadCount; index++)
sl@0
  2537
			{
sl@0
  2538
			if (TestLoading & TEST_DLL)
sl@0
  2539
				{
sl@0
  2540
				if (pThreadInUse[index])
sl@0
  2541
					{
sl@0
  2542
					if (pTheThreads[index].ExitType() != EExitPending)
sl@0
  2543
						{
sl@0
  2544
						if (pTheThreads[index].ExitType() == EExitPanic)
sl@0
  2545
							{
sl@0
  2546
							DBGS_PRINT((_L("%S : Thread %d Panic'd after %u ticks \n"),
sl@0
  2547
								&TestNameBuffer, index, User::TickCount() - start));	
sl@0
  2548
							threadPanic ++;
sl@0
  2549
							}
sl@0
  2550
						else
sl@0
  2551
							{
sl@0
  2552
							DBGS_PRINT((_L("%S : Thread %d Exited after %u ticks \n"),
sl@0
  2553
								&TestNameBuffer, index, User::TickCount() - start));	
sl@0
  2554
							threadOk ++;
sl@0
  2555
							}
sl@0
  2556
						pTheThreads[index].Close();
sl@0
  2557
						pThreadInUse[index] = EFalse;
sl@0
  2558
						}
sl@0
  2559
					else
sl@0
  2560
						{
sl@0
  2561
						threadCount += 1;
sl@0
  2562
						anyUsed = ETrue;
sl@0
  2563
						if (TestThreadsExit)
sl@0
  2564
							{
sl@0
  2565
							now = User::TickCount();
sl@0
  2566
							time = TUint((TUint64)(now-end)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2567
							if (time > TEST_DOT_PERIOD)
sl@0
  2568
								{
sl@0
  2569
								DBGS_PRINT((_L("%S : Thread %d still running\n"), &TestNameBuffer, index));	
sl@0
  2570
								}
sl@0
  2571
							time = TUint((TUint64)(now-killNext)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2572
							const TUint killTimeStep = (TEST_DOT_PERIOD+9)/10; // 1/10th of a dot
sl@0
  2573
							if(time>TEST_DOT_PERIOD+killTimeStep)
sl@0
  2574
								{
sl@0
  2575
								killNext += killTimeStep*1000000/TickPeriod;
sl@0
  2576
								DBGS_PRINT((_L("%S : killing Thread %d\n"), &TestNameBuffer, index));	
sl@0
  2577
								pTheThreads[index].Kill(KErrNone);
sl@0
  2578
								pTheThreads[index].Close();
sl@0
  2579
								pThreadInUse[index] = EFalse;
sl@0
  2580
								}
sl@0
  2581
							}
sl@0
  2582
						}
sl@0
  2583
					}
sl@0
  2584
				}
sl@0
  2585
			if (TestLoading & TEST_EXE_SELF)
sl@0
  2586
				{
sl@0
  2587
				if (pProcessInUse[index])
sl@0
  2588
					{
sl@0
  2589
					if (pTheProcesses[index].ExitType() != EExitPending)
sl@0
  2590
						{
sl@0
  2591
						if (pTheProcesses[index].ExitType() == EExitPanic)
sl@0
  2592
							{
sl@0
  2593
							DBGS_PRINT((_L("%S : Process %d Panic'd after %u ticks \n"),
sl@0
  2594
								&TestNameBuffer,
sl@0
  2595
								index + ((TestLoading & TEST_DLL) ? TestMultipleThreadCount : 0),
sl@0
  2596
								User::TickCount() - start));	
sl@0
  2597
							processPanic ++;
sl@0
  2598
							}
sl@0
  2599
						else
sl@0
  2600
							{
sl@0
  2601
							DBGS_PRINT((_L("%S : Process %d Exited after %u ticks \n"),
sl@0
  2602
								&TestNameBuffer,
sl@0
  2603
								index + ((TestLoading & TEST_DLL) ? TestMultipleThreadCount : 0),
sl@0
  2604
								User::TickCount() - start));	
sl@0
  2605
							processOk ++;
sl@0
  2606
							}
sl@0
  2607
sl@0
  2608
						pTheProcesses[index].Close();
sl@0
  2609
						pProcessInUse[index] = EFalse;
sl@0
  2610
						}
sl@0
  2611
					else
sl@0
  2612
						{
sl@0
  2613
						processCount += 1;
sl@0
  2614
						anyUsed = ETrue;
sl@0
  2615
						if (TestThreadsExit)
sl@0
  2616
							{
sl@0
  2617
							now = User::TickCount();
sl@0
  2618
							time = TUint((TUint64)(now-end)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2619
							if (time > TEST_DOT_PERIOD)
sl@0
  2620
								{
sl@0
  2621
								DBGS_PRINT((_L("%S : Process %d still running; killing it.\n"),
sl@0
  2622
									&TestNameBuffer, index));
sl@0
  2623
								pTheProcesses[index].Kill(EExitKill);
sl@0
  2624
								pTheProcesses[index].Close();
sl@0
  2625
								pProcessInUse[index] = EFalse;
sl@0
  2626
								}
sl@0
  2627
							
sl@0
  2628
							}
sl@0
  2629
						}
sl@0
  2630
					}
sl@0
  2631
				}
sl@0
  2632
			}
sl@0
  2633
sl@0
  2634
		now = User::TickCount();
sl@0
  2635
		time = TUint((TUint64)(now-end)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2636
sl@0
  2637
		DBGD_PRINT((_L("%S : %d seconds (%d ticks) %d threads, %d processes still alive\n"),
sl@0
  2638
			&TestNameBuffer, time, now, threadCount, processCount));
sl@0
  2639
sl@0
  2640
		if (time > TEST_DOT_PERIOD)
sl@0
  2641
			{
sl@0
  2642
			DBGS_PRINT((_L(".")));
sl@0
  2643
			numDots ++;
sl@0
  2644
			end += TEST_DOT_PERIOD*1000000/TickPeriod;
sl@0
  2645
			if (TestingReaper)
sl@0
  2646
				{
sl@0
  2647
				TestingReaperCleaningFiles = ETrue;
sl@0
  2648
				CleanupFiles(EFalse);
sl@0
  2649
				CheckFilePresence(ETrue);
sl@0
  2650
				TestingReaperCleaningFiles = EFalse;
sl@0
  2651
				}
sl@0
  2652
			if ((numDots >= maxDots) && (!TestThreadsExit))
sl@0
  2653
				{
sl@0
  2654
				DBGS_PRINT((_L("Taking longer than %d dots...exiting test case."), maxDots));
sl@0
  2655
				TestThreadsExit = ETrue;
sl@0
  2656
				killNext = end;
sl@0
  2657
				}
sl@0
  2658
			}
sl@0
  2659
sl@0
  2660
		if (TestingChunks)
sl@0
  2661
			{
sl@0
  2662
			DoSomeChunking();
sl@0
  2663
			}
sl@0
  2664
sl@0
  2665
#ifdef TEST_THRASHING_TEST
sl@0
  2666
		User::AfterHighRes(1000);
sl@0
  2667
#else
sl@0
  2668
		User::AfterHighRes(TickPeriod);
sl@0
  2669
#endif
sl@0
  2670
		}
sl@0
  2671
sl@0
  2672
	DBGD_PRINT((_L("%S : all test threads presumably gone now\n"), &TestNameBuffer));
sl@0
  2673
sl@0
  2674
	if (TestMediaAccess != KTestMediaAccessNone)
sl@0
  2675
		{
sl@0
  2676
		if (TestMediaAccess != KTestMediaAccessBasic)
sl@0
  2677
			{
sl@0
  2678
			TBool killMedia = EFalse;
sl@0
  2679
			TestStopMedia = ETrue;
sl@0
  2680
			anyUsed = ETrue;
sl@0
  2681
			DBGS_PRINT((_L("%S : Waiting for media threads to exit...\n"), &TestNameBuffer));	
sl@0
  2682
			end = User::TickCount();
sl@0
  2683
			while (anyUsed)
sl@0
  2684
				{
sl@0
  2685
				anyUsed = EFalse;
sl@0
  2686
sl@0
  2687
				// check the message queue and call printf if we get a message.
sl@0
  2688
				if (!TestSilent)
sl@0
  2689
					{
sl@0
  2690
					while (KErrNone == TestMsgQueue.Receive(localBuffer))
sl@0
  2691
						{
sl@0
  2692
						DBGS_PRINT((localBuffer));
sl@0
  2693
						}
sl@0
  2694
					}
sl@0
  2695
sl@0
  2696
				for (index = 0; index < TestMultipleThreadCount; index++)
sl@0
  2697
					{
sl@0
  2698
					if (pMedInUse[index])
sl@0
  2699
						{
sl@0
  2700
						if (pMedThreads[index].ExitType() != EExitPending)
sl@0
  2701
							{
sl@0
  2702
							if (pMedThreads[index].ExitType() == EExitPanic)
sl@0
  2703
								{
sl@0
  2704
								DBGS_PRINT((_L("%S : Media Thread %d Panic'd after %u ticks \n"),
sl@0
  2705
									&TestNameBuffer, index, User::TickCount() - start));	
sl@0
  2706
								threadPanic ++;
sl@0
  2707
								}
sl@0
  2708
							else
sl@0
  2709
								{
sl@0
  2710
								DBGS_PRINT((_L("%S : Media Thread %d Exited after %u ticks \n"),
sl@0
  2711
									&TestNameBuffer, index, User::TickCount() - start));	
sl@0
  2712
								threadOk ++;
sl@0
  2713
								}
sl@0
  2714
							pMedInUse[index] = EFalse;
sl@0
  2715
							}
sl@0
  2716
						else
sl@0
  2717
							{
sl@0
  2718
							anyUsed = ETrue;
sl@0
  2719
							if (killMedia)
sl@0
  2720
								{
sl@0
  2721
								DBGS_PRINT((_L("%S : Media Thread %d still going after %u ticks; killing it!\n"),
sl@0
  2722
									&TestNameBuffer, index, User::TickCount() - start));	
sl@0
  2723
								pMedThreads[index].Kill(EExitKill);
sl@0
  2724
								}
sl@0
  2725
							}
sl@0
  2726
						}
sl@0
  2727
					}
sl@0
  2728
				now = User::TickCount();
sl@0
  2729
				time = TUint((TUint64)(now-end)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2730
				if (time > TEST_DOT_PERIOD)
sl@0
  2731
					{
sl@0
  2732
					DBGS_PRINT((_L(".")));
sl@0
  2733
					end += TEST_DOT_PERIOD*1000000/TickPeriod;
sl@0
  2734
					killMedia = ETrue;
sl@0
  2735
					}
sl@0
  2736
sl@0
  2737
				User::AfterHighRes(50000);
sl@0
  2738
sl@0
  2739
				}
sl@0
  2740
			DBGS_PRINT((_L("%S : Media threads exited...\n"), &TestNameBuffer));	
sl@0
  2741
			User::Free(pMedThreads);
sl@0
  2742
			User::Free(pMedInUse);
sl@0
  2743
			}
sl@0
  2744
		else
sl@0
  2745
			{
sl@0
  2746
			TestStopMedia = ETrue;
sl@0
  2747
			DBGS_PRINT((_L("%S : Waiting for media thread to exit...\n"), &TestNameBuffer));	
sl@0
  2748
			end = User::TickCount();
sl@0
  2749
			while (mediaThread.ExitType() == EExitPending)
sl@0
  2750
				{
sl@0
  2751
				now = User::TickCount();
sl@0
  2752
				time = TUint((TUint64)(now-end)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2753
				if (time > TEST_DOT_PERIOD)
sl@0
  2754
					{
sl@0
  2755
					DBGS_PRINT((_L("%S : Media thread still going after %u seconds; killing it!\n"),
sl@0
  2756
						&TestNameBuffer, time));
sl@0
  2757
					mediaThread.Kill(EExitKill);
sl@0
  2758
					}
sl@0
  2759
				User::AfterHighRes(50000);
sl@0
  2760
				}
sl@0
  2761
			User::WaitForRequest(mediaStatus);
sl@0
  2762
			mediaThread.Close();
sl@0
  2763
			DBGS_PRINT((_L("%S : Media thread exited...\n"), &TestNameBuffer));	
sl@0
  2764
			}
sl@0
  2765
		}
sl@0
  2766
sl@0
  2767
	DBGD_PRINT((_L("%S : all media threads presumably gone now\n"), &TestNameBuffer));
sl@0
  2768
sl@0
  2769
	if (!TestSilent)
sl@0
  2770
		{
sl@0
  2771
		TestMsgQueue.Close();
sl@0
  2772
		}
sl@0
  2773
	TestMultiSem.Close();
sl@0
  2774
sl@0
  2775
	DBGD_PRINT((_L("%S : about to close the libraries\n"), &TestNameBuffer));
sl@0
  2776
sl@0
  2777
	if (TestLoadDllHow == TEST_DLL_GLOBAL)
sl@0
  2778
		{
sl@0
  2779
		CloseTheLibs(theGlobalLibs, maxDlls);
sl@0
  2780
		}
sl@0
  2781
sl@0
  2782
	TestThreadsExit = EFalse;
sl@0
  2783
sl@0
  2784
	DBGD_PRINT((_L("%S : cleaning up\n"), &TestNameBuffer));
sl@0
  2785
sl@0
  2786
	// cleanup the resources and exit.
sl@0
  2787
	if (TestLoading & TEST_EXE_SELF)
sl@0
  2788
		{
sl@0
  2789
		User::Free(pTheProcesses);
sl@0
  2790
		User::Free(pProcessInUse);
sl@0
  2791
		}
sl@0
  2792
sl@0
  2793
	// cleanup the resources and exit.
sl@0
  2794
	if (TestLoading & TEST_DLL)
sl@0
  2795
		{
sl@0
  2796
		User::Free(pTheThreads);
sl@0
  2797
		User::Free(pThreadInUse);
sl@0
  2798
		}
sl@0
  2799
sl@0
  2800
	if (!TestSilent)
sl@0
  2801
		{
sl@0
  2802
		end = User::TickCount();
sl@0
  2803
		time = TUint((TUint64)(end-start)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  2804
		DBGS_PRINT((_L("\n%S : Multiple Test : (%u seconds)\n\tThreads panic'd = %d Ok = %d\n\tProcess panic'd = %d Ok = %d\n"), &TestNameBuffer, time, threadPanic, threadOk, processPanic, processOk));
sl@0
  2805
		}
sl@0
  2806
sl@0
  2807
	thisThread.SetPriority(savedThreadPriority);
sl@0
  2808
sl@0
  2809
	return (threadPanic | processPanic) ? KErrGeneral : KErrNone;
sl@0
  2810
	}
sl@0
  2811
sl@0
  2812
//
sl@0
  2813
// DoChunkTests
sl@0
  2814
//
sl@0
  2815
// Allocate a chunk and assign some pages to it...
sl@0
  2816
// Then do a multiple test.
sl@0
  2817
//
sl@0
  2818
sl@0
  2819
void DoChunkTests()
sl@0
  2820
	{
sl@0
  2821
	SVMCacheInfo  tempPages;
sl@0
  2822
	memset(&tempPages, 0, sizeof(tempPages));
sl@0
  2823
	if (TestIsDemandPaged)
sl@0
  2824
		{
sl@0
  2825
		// Shrink the page cache down to the minimum.
sl@0
  2826
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  2827
sl@0
  2828
		DBGS_PRINT((_L("Start : min %d max %d current %d maxFree %d freeRam %d\n"),
sl@0
  2829
					 tempPages.iMinSize, tempPages.iMaxSize, tempPages.iCurrentSize ,tempPages.iMaxFreeSize, FreeRam()));
sl@0
  2830
sl@0
  2831
		// set the cache small 
sl@0
  2832
		TInt minSize = 16 * TestPageSize;
sl@0
  2833
		TInt maxSize = TEST_NUM_PAGES * TestPageSize;
sl@0
  2834
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  2835
		}
sl@0
  2836
sl@0
  2837
	if (KErrNone != TestChunk.CreateDisconnectedLocal(0,0,TEST_NUM_CHUNK_PAGES *TestPageSize))
sl@0
  2838
		{
sl@0
  2839
		DBGS_PRINT((_L("DoChunkTests - create failed.\n")));
sl@0
  2840
		return;
sl@0
  2841
		}
sl@0
  2842
	TestChunkBase = TestChunk.Base();
sl@0
  2843
	if (TestChunkBase == NULL)
sl@0
  2844
		{
sl@0
  2845
		RDebug::Printf("DoChunkTests - TestChunkBase was NULL");
sl@0
  2846
		TestChunk.Close();
sl@0
  2847
		return;
sl@0
  2848
		}
sl@0
  2849
	TInt retVal = KErrNone;
sl@0
  2850
	TUint index = 0;
sl@0
  2851
	TestCommitEnd = 0;
sl@0
  2852
	memset(TestChunkPageState, 0, sizeof(TestChunkPageState));
sl@0
  2853
	memset(TestChunkStats,0,sizeof(TestChunkStats));
sl@0
  2854
	while(index < TEST_NUM_CHUNK_PAGES)
sl@0
  2855
		{
sl@0
  2856
		retVal = TestChunk.Commit(TestCommitEnd,TestPageSize);
sl@0
  2857
		if (KErrNone != retVal)
sl@0
  2858
			{
sl@0
  2859
			DBGS_PRINT((_L("%S : TestChunk.Commit returned %d for 0x%08x...\n"), &TestNameBuffer, retVal, TestCommitEnd));	
sl@0
  2860
			break;
sl@0
  2861
			}
sl@0
  2862
		TestChunkPageState[index] = ETrue;
sl@0
  2863
		FillPage(TestCommitEnd);
sl@0
  2864
		TestCommitEnd += TestPageSize;
sl@0
  2865
		index ++;
sl@0
  2866
		}
sl@0
  2867
	RUNTEST1(retVal == KErrNone);
sl@0
  2868
	
sl@0
  2869
	// now do some testing....
sl@0
  2870
	TestingChunks = ETrue;
sl@0
  2871
	TestInterleave = EFalse;
sl@0
  2872
	TestPrioChange = ETrue;
sl@0
  2873
	TestMediaAccess = KTestMediaAccessNone;
sl@0
  2874
	// temp
sl@0
  2875
	TestWhichMedia = TEST_MEDIA_ROM_BASE;
sl@0
  2876
sl@0
  2877
	if (TestChunksPlus)
sl@0
  2878
		{
sl@0
  2879
		TestMaxLoops = 1;
sl@0
  2880
		TestMultipleThreadCount	= 40;
sl@0
  2881
		}
sl@0
  2882
	else if (TestExtremeChunks)
sl@0
  2883
		{
sl@0
  2884
		TestMaxLoops = 10;
sl@0
  2885
		TestMultipleThreadCount	= 12;
sl@0
  2886
		}
sl@0
  2887
	else
sl@0
  2888
		{
sl@0
  2889
		TestMaxLoops = 3;
sl@0
  2890
		TestMultipleThreadCount	= 20;
sl@0
  2891
		}
sl@0
  2892
	TestWhichTests = TEST_RANDOM;
sl@0
  2893
sl@0
  2894
	TestLoading = TEST_EXE_SELF_DLL;
sl@0
  2895
	TestLoadDllHow = TEST_DLL_FUNC;
sl@0
  2896
	TestChunkingIndexFails = 0;
sl@0
  2897
sl@0
  2898
	TEST_NEXT((_L("Multiple threads random with chunks.")));
sl@0
  2899
	RUNTEST(DoMultipleTest(), KErrNone);
sl@0
  2900
	
sl@0
  2901
	TestingChunks = EFalse;
sl@0
  2902
sl@0
  2903
	// clean up.
sl@0
  2904
	UserSvr::HalFunction(EHalGroupVM,EVMHalFlushCache,0,0);
sl@0
  2905
	TestChunk.Close();
sl@0
  2906
sl@0
  2907
	if (TestIsDemandPaged)
sl@0
  2908
		{
sl@0
  2909
		// put the cache back to the the original values.
sl@0
  2910
		TInt minSize = tempPages.iMinSize;
sl@0
  2911
		TInt maxSize = tempPages.iMaxSize;
sl@0
  2912
sl@0
  2913
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  2914
sl@0
  2915
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  2916
sl@0
  2917
		DBGS_PRINT((_L("Finish : min %d max %d current %d maxFree %d freeRam %d\n"),
sl@0
  2918
					 tempPages.iMinSize, tempPages.iMaxSize, tempPages.iCurrentSize ,tempPages.iMaxFreeSize, FreeRam()));
sl@0
  2919
		}
sl@0
  2920
	TChunkTestStats  stats;
sl@0
  2921
sl@0
  2922
	memset(&stats, 0, sizeof(stats));
sl@0
  2923
	DBGS_PRINT((_L("Stats : (pass/fail) \nindex\t\tlock\t\tunlock\t\tcommit\t\tdecommit\t\tcheck\n")));
sl@0
  2924
	for (index = 0; index < TEST_NUM_CHUNK_PAGES; index ++)
sl@0
  2925
		{
sl@0
  2926
		DBGS_PRINT((_L("%u\t\t%d/%d\t\t%d/%d\t\t%d/%d\t\t%d/%d\t\t%d/%d\n"), 
sl@0
  2927
					index,
sl@0
  2928
					TestChunkStats[index].lock.ok, TestChunkStats[index].lock.fail,
sl@0
  2929
					TestChunkStats[index].unlock.ok, TestChunkStats[index].unlock.fail,
sl@0
  2930
					TestChunkStats[index].commit.ok, TestChunkStats[index].commit.fail,
sl@0
  2931
					TestChunkStats[index].decommit.ok, TestChunkStats[index].decommit.fail,
sl@0
  2932
					TestChunkStats[index].check.ok, TestChunkStats[index].check.fail));
sl@0
  2933
sl@0
  2934
		stats.lock.ok += TestChunkStats[index].lock.ok;
sl@0
  2935
		stats.lock.fail += TestChunkStats[index].lock.fail;
sl@0
  2936
		stats.unlock.ok += TestChunkStats[index].unlock.ok;
sl@0
  2937
		stats.unlock.fail += TestChunkStats[index].unlock.fail;
sl@0
  2938
		stats.decommit.ok += TestChunkStats[index].decommit.ok;
sl@0
  2939
		stats.decommit.fail += TestChunkStats[index].decommit.fail;
sl@0
  2940
		stats.commit.ok += TestChunkStats[index].commit.ok;
sl@0
  2941
		stats.commit.fail += TestChunkStats[index].commit.fail;
sl@0
  2942
		stats.check.ok += TestChunkStats[index].check.ok;
sl@0
  2943
		stats.check.fail += TestChunkStats[index].check.fail;
sl@0
  2944
		}
sl@0
  2945
sl@0
  2946
	DBGS_PRINT((_L("Total Stats (p/f): \n\t lock %d / %d\n\t unlock  %d / %d\n\t commit %d / %d\n\t decommit %d / %d\n\t check %d / %d\n"), 
sl@0
  2947
				stats.lock.ok, stats.lock.fail,
sl@0
  2948
				stats.unlock.ok, stats.unlock.fail,
sl@0
  2949
				stats.commit.ok, stats.commit.fail,
sl@0
  2950
				stats.decommit.ok, stats.decommit.fail,
sl@0
  2951
				stats.check.ok, stats.check.fail));
sl@0
  2952
	DBGS_PRINT((_L("TestChunkingIndexFails %d\n"), TestChunkingIndexFails));
sl@0
  2953
sl@0
  2954
	}
sl@0
  2955
sl@0
  2956
//
sl@0
  2957
// DoReaperTests
sl@0
  2958
//
sl@0
  2959
// Test the reaper by deleting the transient files and re-creating them.
sl@0
  2960
//
sl@0
  2961
sl@0
  2962
void DoReaperTests(void)
sl@0
  2963
	{
sl@0
  2964
	// make sure we have the full complement of files.
sl@0
  2965
	CheckFilePresence(ETrue);
sl@0
  2966
	
sl@0
  2967
	// now do some testing....
sl@0
  2968
	TestInterleave = EFalse;
sl@0
  2969
	TestPrioChange = EFalse;
sl@0
  2970
	TestMediaAccess = KTestMediaAccessNone;
sl@0
  2971
	// temp
sl@0
  2972
	TestWhichMedia = TEST_MEDIA_ALL;
sl@0
  2973
	TestMaxLoops = 3;
sl@0
  2974
	TestMultipleThreadCount	= 12;
sl@0
  2975
	TestWhichTests = TEST_RANDOM;
sl@0
  2976
sl@0
  2977
	TestLoading = TEST_EXE_SELF_DLL;
sl@0
  2978
	TestLoadDllHow = TEST_DLL_FUNC;
sl@0
  2979
	
sl@0
  2980
	TestingReaper = ETrue;
sl@0
  2981
sl@0
  2982
	TEST_NEXT((_L("Reaper tests.")));
sl@0
  2983
	RUNTEST(DoMultipleTest(), KErrNone);
sl@0
  2984
	TestInterleave = ETrue;
sl@0
  2985
	TestPrioChange = ETrue;
sl@0
  2986
	TEST_NEXT((_L("Reaper tests 2.")));
sl@0
  2987
	RUNTEST(DoMultipleTest(), KErrNone);
sl@0
  2988
	
sl@0
  2989
	TestingReaper = EFalse;
sl@0
  2990
	}
sl@0
  2991
sl@0
  2992
//
sl@0
  2993
// DoBtraceTest
sl@0
  2994
//
sl@0
  2995
// Test the paging BTrace function.
sl@0
  2996
//
sl@0
  2997
sl@0
  2998
void DoBtraceTest(void)
sl@0
  2999
	{
sl@0
  3000
#define LE4(a) ((*((a) + 3) << 24) + (*((a) + 2) << 16) + (*((a) + 1) << 8) + *(a))
sl@0
  3001
sl@0
  3002
	RBTrace bTraceHandle;
sl@0
  3003
	
sl@0
  3004
	TInt r = bTraceHandle.Open();
sl@0
  3005
	test(r == KErrNone);
sl@0
  3006
	
sl@0
  3007
	r = bTraceHandle.ResizeBuffer(0x200000); 
sl@0
  3008
	test(r == KErrNone);
sl@0
  3009
	bTraceHandle.SetFilter(BTrace::EPaging, ETrue);
sl@0
  3010
sl@0
  3011
	// Enable trace
sl@0
  3012
	bTraceHandle.Empty();
sl@0
  3013
	bTraceHandle.SetMode(RBTrace::EEnable);
sl@0
  3014
	
sl@0
  3015
	TestLoading             = TEST_EXE_SELF_DLL;
sl@0
  3016
	TestWhichMedia          = TEST_MEDIA_ROM_BASE;
sl@0
  3017
	TestMaxLoops            = 2;
sl@0
  3018
	TestMultipleThreadCount = 10;
sl@0
  3019
	TestLoadDllHow          = TEST_DLL_FUNC;
sl@0
  3020
	TestInterleave          = ETrue;
sl@0
  3021
	TestPrioChange          = ETrue;
sl@0
  3022
	TestMediaAccess         = KTestMediaAccessNone;
sl@0
  3023
	TestWhichTests          = TEST_RANDOM;		
sl@0
  3024
	TestingLowMem			= EFalse;
sl@0
  3025
sl@0
  3026
	RUNTEST(DoMultipleTest(TestingLowMem), KErrNone);
sl@0
  3027
sl@0
  3028
	bTraceHandle.SetMode(0);
sl@0
  3029
sl@0
  3030
	// analyse the btrace logs and display on the serial port.
sl@0
  3031
	TUint8* pDataStart;
sl@0
  3032
	TInt	dataSize;
sl@0
  3033
	TUint8* pTemp;
sl@0
  3034
	TUint8* pThis;
sl@0
  3035
	TUint8* pEnd;
sl@0
  3036
	TBuf<128>	data;
sl@0
  3037
	while (1)
sl@0
  3038
		{
sl@0
  3039
		dataSize = bTraceHandle.GetData(pDataStart);
sl@0
  3040
		if (dataSize <= 0)
sl@0
  3041
			{
sl@0
  3042
			break;
sl@0
  3043
			}
sl@0
  3044
		pEnd = pDataStart + dataSize;
sl@0
  3045
		pTemp = pDataStart;
sl@0
  3046
		while (pTemp < pEnd)
sl@0
  3047
			{
sl@0
  3048
			TUint8	recSize		= pTemp[BTrace::ESizeIndex];
sl@0
  3049
			TUint8	recFlags	= pTemp[BTrace::EFlagsIndex];
sl@0
  3050
			TUint8	recCat		= pTemp[BTrace::ECategoryIndex];
sl@0
  3051
			TUint8	recSub		= pTemp[BTrace::ESubCategoryIndex];
sl@0
  3052
			TUint32 addr[4];
sl@0
  3053
			pThis = pTemp;
sl@0
  3054
sl@0
  3055
			data.Zero();
sl@0
  3056
			// step over the header.
sl@0
  3057
			data.Format(_L("size %d cat %d sub %d flg 0x%02x "), recSize, recCat, recSub, recFlags);
sl@0
  3058
			pTemp += 4; 
sl@0
  3059
					
sl@0
  3060
			if (recFlags & BTrace::EHeader2Present)
sl@0
  3061
				{
sl@0
  3062
				data.AppendFormat(_L("h2 0x%08x "), LE4(pTemp));
sl@0
  3063
				pTemp += 4;
sl@0
  3064
				}
sl@0
  3065
			if (recFlags & BTrace::ETimestampPresent)
sl@0
  3066
				{
sl@0
  3067
				data.AppendFormat(_L("ts 0x%08x "), LE4(pTemp));
sl@0
  3068
				pTemp += 4;
sl@0
  3069
				}
sl@0
  3070
			if (recFlags & BTrace::ETimestamp2Present)
sl@0
  3071
				{
sl@0
  3072
				data.AppendFormat(_L("ts2 0x%08x "), LE4(pTemp));
sl@0
  3073
				pTemp += 4;
sl@0
  3074
				}
sl@0
  3075
			if (recFlags & BTrace::EContextIdPresent)
sl@0
  3076
				{
sl@0
  3077
				data.AppendFormat(_L("cId 0x%08x "), LE4(pTemp));
sl@0
  3078
				pTemp += 4;
sl@0
  3079
				}
sl@0
  3080
			TInt index;
sl@0
  3081
			for (index = 0; index < 4; index ++)
sl@0
  3082
				{
sl@0
  3083
				if (recSize > pTemp - pThis)
sl@0
  3084
					{
sl@0
  3085
					addr[index] = LE4(pTemp);
sl@0
  3086
					pTemp += 4;
sl@0
  3087
					}
sl@0
  3088
				else
sl@0
  3089
					addr[index] = 0;
sl@0
  3090
				}
sl@0
  3091
sl@0
  3092
			switch(recCat)
sl@0
  3093
				{
sl@0
  3094
				case BTrace::EPaging:
sl@0
  3095
					{
sl@0
  3096
					switch (recSub)
sl@0
  3097
						{
sl@0
  3098
						case BTrace::EPagingPageInBegin:
sl@0
  3099
						/**
sl@0
  3100
						- 4 bytes containing the virtual address which was accessed, causing this paging event.
sl@0
  3101
						- 4 bytes containing the virtual address of the instuction which caused this paging event.
sl@0
  3102
						  (The PC value.)
sl@0
  3103
						**/
sl@0
  3104
						test.Printf(_L("PageInBegin    : %S addr 0x%08x inst 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3105
						break;
sl@0
  3106
sl@0
  3107
						/**
sl@0
  3108
						- 0 bytes. (No extra data.)
sl@0
  3109
						*/
sl@0
  3110
						case BTrace::EPagingPageInUnneeded:
sl@0
  3111
						test.Printf(_L("PageInUnneeded : %S\n"), &data);
sl@0
  3112
						break;
sl@0
  3113
sl@0
  3114
						/**
sl@0
  3115
						- 4 bytes containing the physical address of the page 'paged in'.
sl@0
  3116
						- 4 bytes containing the virtual address of the page 'paged in'.
sl@0
  3117
						*/
sl@0
  3118
						case BTrace::EPagingPageInROM:
sl@0
  3119
						test.Printf(_L("PageInROM      : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3120
						break;
sl@0
  3121
sl@0
  3122
						/**
sl@0
  3123
						- 4 bytes containing the physical address of the page being 'paged out'.
sl@0
  3124
						- 4 bytes containing the virtual address of the page being 'paged out'.
sl@0
  3125
						*/
sl@0
  3126
						case BTrace::EPagingPageOutROM:
sl@0
  3127
						test.Printf(_L("PageOutROM     : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3128
						break;
sl@0
  3129
sl@0
  3130
						/**
sl@0
  3131
						- 4 bytes containing the physical address of the page being 'paged in'.
sl@0
  3132
						*/
sl@0
  3133
						case BTrace::EPagingPageInFree:
sl@0
  3134
						test.Printf(_L("PageInFree     : %S phys 0x%08x\n"), &data, addr[0]);
sl@0
  3135
						break;
sl@0
  3136
sl@0
  3137
						/**
sl@0
  3138
						- 4 bytes containing the physical address of the page being 'paged out'.
sl@0
  3139
						*/
sl@0
  3140
						case BTrace::EPagingPageOutFree:
sl@0
  3141
						test.Printf(_L("PageOutFree    : %S phys 0x%08x\n"), &data, addr[0]);
sl@0
  3142
						break;
sl@0
  3143
sl@0
  3144
						/**
sl@0
  3145
						- 4 bytes containing the physical address of the page being rejuvenated, (made young).
sl@0
  3146
						- 4 bytes containing the virtual address which was accessed, causing this paging event.
sl@0
  3147
						- 4 bytes containing the virtual address of the instuction which caused this paging event.
sl@0
  3148
						  (The PC value.)
sl@0
  3149
						*/
sl@0
  3150
						case BTrace::EPagingRejuvenate:
sl@0
  3151
						test.Printf(_L("Rejuvenate     : %S phys 0x%08x virt 0x%08x inst 0x%08x\n"), &data, addr[0], addr[1], addr[2]);
sl@0
  3152
						break;
sl@0
  3153
sl@0
  3154
						/**
sl@0
  3155
						- 4 bytes containing the physical address of the page accessed.
sl@0
  3156
						- 4 bytes containing the virtual address which was accessed, causing this paging event.
sl@0
  3157
						- 4 bytes containing the virtual address of the instuction which caused this paging event.
sl@0
  3158
						  (The PC value.)
sl@0
  3159
						*/
sl@0
  3160
						case BTrace::EPagingPageNop:
sl@0
  3161
						test.Printf(_L("PageNop        : %S phys 0x%08x virt 0x%08x inst 0x%08x\n"), &data, addr[0], addr[1], addr[2]);
sl@0
  3162
						break;
sl@0
  3163
sl@0
  3164
						/**
sl@0
  3165
						- 4 bytes containing the physical address of the page being locked.
sl@0
  3166
						- 4 bytes containing the value of the lock count after the paged was locked.
sl@0
  3167
						*/
sl@0
  3168
						case BTrace::EPagingPageLock:
sl@0
  3169
						test.Printf(_L("PageLock       : %S phys 0x%08x lock 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3170
						break;
sl@0
  3171
sl@0
  3172
						/**
sl@0
  3173
						- 4 bytes containing the physical address of the page being unlocked.
sl@0
  3174
						- 4 bytes containing the value of the lock count before the paged was unlocked.
sl@0
  3175
						*/
sl@0
  3176
						case BTrace::EPagingPageUnlock:
sl@0
  3177
						test.Printf(_L("PageUnlock     : %S phys 0x%08x lock 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3178
						break;
sl@0
  3179
		
sl@0
  3180
						/**
sl@0
  3181
						- 4 bytes containing the physical address of the page being 'paged out'.
sl@0
  3182
						- 4 bytes containing the virtual address of the page being 'paged out'.
sl@0
  3183
						*/
sl@0
  3184
						case BTrace::EPagingPageOutCache:
sl@0
  3185
						test.Printf(_L("PageOutCache   : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3186
						break;
sl@0
  3187
		
sl@0
  3188
						/**
sl@0
  3189
						- 4 bytes containing the physical address of the page 'paged in'.
sl@0
  3190
						- 4 bytes containing the virtual address of the page 'paged in'.
sl@0
  3191
						*/
sl@0
  3192
						case BTrace::EPagingPageInCode:
sl@0
  3193
						test.Printf(_L("PageInCode     : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3194
						break;
sl@0
  3195
sl@0
  3196
						/**
sl@0
  3197
						- 4 bytes containing the physical address of the page being 'paged out'.
sl@0
  3198
						- 4 bytes containing the virtual address of the page being 'paged out'.
sl@0
  3199
						*/
sl@0
  3200
						case BTrace::EPagingPageOutCode:
sl@0
  3201
						test.Printf(_L("PageOutCode    : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3202
						break;
sl@0
  3203
		
sl@0
  3204
						/**
sl@0
  3205
						- 4 bytes containing the physical address of the page 'paged in'.
sl@0
  3206
						- 4 bytes containing the virtual address of the page 'paged in'.
sl@0
  3207
						*/
sl@0
  3208
						case BTrace::EPagingMapCode:
sl@0
  3209
						test.Printf(_L("MapCode        : %S phys 0x%08x virt 0x%08x\n"), &data, addr[0], addr[1]);
sl@0
  3210
						break;
sl@0
  3211
						
sl@0
  3212
						/**
sl@0
  3213
						- 4 bytes containing the physical address of the page being aged, (made old).
sl@0
  3214
						*/
sl@0
  3215
						case BTrace::EPagingAged:
sl@0
  3216
						test.Printf(_L("Aged           : %S phys 0x%08x\n"), &data, addr[0]);
sl@0
  3217
						break;
sl@0
  3218
						}
sl@0
  3219
					}
sl@0
  3220
				break;
sl@0
  3221
sl@0
  3222
				default:
sl@0
  3223
				
sl@0
  3224
				break;
sl@0
  3225
				}
sl@0
  3226
			pTemp = BTrace::NextRecord(pThis);
sl@0
  3227
			}
sl@0
  3228
		bTraceHandle.DataUsed();
sl@0
  3229
		}
sl@0
  3230
	bTraceHandle.Close();
sl@0
  3231
	}
sl@0
  3232
sl@0
  3233
//
sl@0
  3234
// ParseCommandLine 
sl@0
  3235
//
sl@0
  3236
// read the arguments passed from the command line and set global variables to 
sl@0
  3237
// control the tests.
sl@0
  3238
//
sl@0
  3239
sl@0
  3240
TBool ParseCommandLine()
sl@0
  3241
	{
sl@0
  3242
	TBuf<256> args;
sl@0
  3243
	User::CommandLine(args);
sl@0
  3244
	TLex	lex(args);
sl@0
  3245
	TBool	retVal = ETrue;
sl@0
  3246
	
sl@0
  3247
	// initially test for arguments, the parse them, if not apply some sensible defaults.
sl@0
  3248
	TBool	foundArgs = EFalse;	
sl@0
  3249
		
sl@0
  3250
	FOREVER
sl@0
  3251
		{
sl@0
  3252
		TPtrC  token=lex.NextToken();
sl@0
  3253
		if(token.Length()!=0)
sl@0
  3254
			{
sl@0
  3255
			if ((token == _L("help")) || (token == _L("-h")) || (token == _L("-?")))
sl@0
  3256
				{
sl@0
  3257
				DBGS_PRINT((_L("\nUsage: [ single | multiple <numThreads>] [ dll | exe | self | complete ] [func | thread | global ] [ rom | base | mixed | mall ] [reaper] [chunks|echunks|chunks+ {nochunkdata}] [prio] [media] [lowmem] [forward | backward | random | all] [loadGlobal | loadThread | loadFunc] [interleave] [d_exc] [btrace] [defrag] [noclean] [min <pages>] [max <pages>] [stressfree] [iters <iters>]\n'-' indicated infinity.\n\n")));
sl@0
  3258
				test.Getch();
sl@0
  3259
				}
sl@0
  3260
			else  if (token == _L("mmc"))
sl@0
  3261
				{
sl@0
  3262
				TestOnlyFromMmc = ETrue;
sl@0
  3263
				}
sl@0
  3264
			else  if (token == _L("min"))
sl@0
  3265
				{
sl@0
  3266
				TPtrC val=lex.NextToken();
sl@0
  3267
				TLex lexv(val);
sl@0
  3268
				TInt value;
sl@0
  3269
				lexv.Val(value);
sl@0
  3270
				TestMinCacheSize = value * 4096;
sl@0
  3271
				}
sl@0
  3272
			else  if (token == _L("max"))
sl@0
  3273
				{
sl@0
  3274
				TPtrC val=lex.NextToken();
sl@0
  3275
				TLex lexv(val);
sl@0
  3276
				TInt value;
sl@0
  3277
				lexv.Val(value);
sl@0
  3278
				TestMaxCacheSize = value * 4096;
sl@0
  3279
				}
sl@0
  3280
			else  if (token == _L("interleave"))
sl@0
  3281
				{
sl@0
  3282
				TestInterleave = ETrue;
sl@0
  3283
				}
sl@0
  3284
			else if (token == _L("auto"))
sl@0
  3285
				{
sl@0
  3286
				TestFullAutoTest = EFalse;
sl@0
  3287
				retVal = EFalse;
sl@0
  3288
				}
sl@0
  3289
			else if (token == _L("stressfree"))
sl@0
  3290
				{
sl@0
  3291
				TestStressFree = !TestStressFree;
sl@0
  3292
				retVal = EFalse;
sl@0
  3293
				}
sl@0
  3294
			else if (token == _L("fullauto"))
sl@0
  3295
				{
sl@0
  3296
				TestFullAutoTest = ETrue;
sl@0
  3297
				retVal = EFalse;
sl@0
  3298
				}
sl@0
  3299
			else if (token == _L("prio"))
sl@0
  3300
				{
sl@0
  3301
				TestPrioChange = !TestPrioChange;
sl@0
  3302
				}
sl@0
  3303
			else if (token == _L("media"))
sl@0
  3304
				{
sl@0
  3305
				TestMediaAccess = KTestMediaAccessBasic;
sl@0
  3306
				}
sl@0
  3307
			else if (token == _L("reaper"))
sl@0
  3308
				{
sl@0
  3309
				TestReaper = ETrue;
sl@0
  3310
				}
sl@0
  3311
			else if (token == _L("btrace"))
sl@0
  3312
				{
sl@0
  3313
				TestBtrace = ETrue;
sl@0
  3314
				}
sl@0
  3315
			else if (token == _L("defrag"))
sl@0
  3316
				{
sl@0
  3317
				TestDefrag = ETrue;
sl@0
  3318
				}
sl@0
  3319
			else if (token == _L("echunks"))
sl@0
  3320
				{
sl@0
  3321
				TestChunks = ETrue;
sl@0
  3322
				TestExtremeChunks = ETrue;
sl@0
  3323
				}
sl@0
  3324
			else if (token == _L("chunks+"))
sl@0
  3325
				{
sl@0
  3326
				TestChunks = ETrue;
sl@0
  3327
				TestChunksPlus = ETrue;
sl@0
  3328
				}
sl@0
  3329
			else if (token == _L("chunks"))
sl@0
  3330
				{
sl@0
  3331
				TestChunks = ETrue;
sl@0
  3332
				}
sl@0
  3333
			else if (token == _L("nochunkdata"))
sl@0
  3334
				{
sl@0
  3335
				TestChunkData = EFalse;
sl@0
  3336
				}
sl@0
  3337
			else if (token == _L("lowmem"))
sl@0
  3338
				{
sl@0
  3339
				TestLowMem = ETrue;
sl@0
  3340
				}
sl@0
  3341
			else if (token == _L("dll"))
sl@0
  3342
				{
sl@0
  3343
				TestLoading = TEST_DLL;
sl@0
  3344
				}
sl@0
  3345
			else if (token == _L("exe"))
sl@0
  3346
				{
sl@0
  3347
				TestLoading = TEST_EXE;
sl@0
  3348
				}
sl@0
  3349
			else if (token == _L("self"))
sl@0
  3350
				{
sl@0
  3351
				TestLoading = TEST_SELF;
sl@0
  3352
				}
sl@0
  3353
			else if (token == _L("complete"))
sl@0
  3354
				{
sl@0
  3355
				TestLoading |= TEST_EXE_SELF_DLL;
sl@0
  3356
				}
sl@0
  3357
			else if (token == _L("rom"))
sl@0
  3358
				{
sl@0
  3359
				TestWhichMedia = TEST_MEDIA_ROM;
sl@0
  3360
				}
sl@0
  3361
			else if (token == _L("base"))
sl@0
  3362
				{
sl@0
  3363
				TestWhichMedia = TEST_MEDIA_BASE;
sl@0
  3364
				}
sl@0
  3365
			else if (token == _L("mixed"))
sl@0
  3366
				{
sl@0
  3367
				TestWhichMedia |= TEST_MEDIA_ROM_BASE;
sl@0
  3368
				}
sl@0
  3369
			else if (token == _L("all_media"))
sl@0
  3370
				{
sl@0
  3371
				TestWhichMedia |= TEST_MEDIA_ALL;
sl@0
  3372
				}
sl@0
  3373
			else if (token == _L("debug"))
sl@0
  3374
				{
sl@0
  3375
				if (!TestSilent)
sl@0
  3376
					{
sl@0
  3377
					TestDebug = ETrue;
sl@0
  3378
					TestPrioChange = ETrue;
sl@0
  3379
					}
sl@0
  3380
				}
sl@0
  3381
			else if (token == _L("silent"))
sl@0
  3382
				{
sl@0
  3383
				TestSilent = ETrue;
sl@0
  3384
				TestDebug = EFalse;
sl@0
  3385
				}
sl@0
  3386
			else if (token == _L("noclean"))
sl@0
  3387
				{
sl@0
  3388
				TestNoClean = ETrue;
sl@0
  3389
				}
sl@0
  3390
			else if (token == _L("d_exc"))
sl@0
  3391
				{
sl@0
  3392
				TestD_Exc = ETrue;
sl@0
  3393
				}
sl@0
  3394
			else if (token == _L("global"))
sl@0
  3395
				{
sl@0
  3396
				TestLoadDllHow = TEST_DLL_GLOBAL;
sl@0
  3397
				}	
sl@0
  3398
			else if (token == _L("thread"))
sl@0
  3399
				{
sl@0
  3400
				TestLoadDllHow = TEST_DLL_THREAD;
sl@0
  3401
				}	
sl@0
  3402
			else if (token == _L("func"))
sl@0
  3403
				{
sl@0
  3404
				TestLoadDllHow = TEST_DLL_FUNC;
sl@0
  3405
				}	
sl@0
  3406
			else if (token == _L("single"))
sl@0
  3407
				{
sl@0
  3408
				TestSingle = ETrue;
sl@0
  3409
				}
sl@0
  3410
			else if (token == _L("multiple"))
sl@0
  3411
				{
sl@0
  3412
				TPtrC val=lex.NextToken();
sl@0
  3413
				TLex lexv(val);
sl@0
  3414
				TInt value;
sl@0
  3415
sl@0
  3416
				if (lexv.Val(value)==KErrNone)
sl@0
  3417
					{
sl@0
  3418
					if ((value <= 0) || (value > 100))
sl@0
  3419
						{
sl@0
  3420
						TestMultipleThreadCount = 10;
sl@0
  3421
						}
sl@0
  3422
					else
sl@0
  3423
						{
sl@0
  3424
						TestMultipleThreadCount = value;
sl@0
  3425
						}
sl@0
  3426
					}
sl@0
  3427
				else
sl@0
  3428
					{
sl@0
  3429
					DBGS_PRINT((_L("Bad value for thread count '%S' was ignored.\n"), &val));
sl@0
  3430
					retVal = EFalse;
sl@0
  3431
					break;
sl@0
  3432
					}
sl@0
  3433
				TestMultiple = ETrue;
sl@0
  3434
				}
sl@0
  3435
			else if (token == _L("forward"))
sl@0
  3436
				{
sl@0
  3437
				TestWhichTests = TEST_FORWARD;
sl@0
  3438
				}
sl@0
  3439
			else if (token == _L("backward"))
sl@0
  3440
				{
sl@0
  3441
				TestWhichTests = TEST_BACKWARD;
sl@0
  3442
				}
sl@0
  3443
			else if (token == _L("random"))
sl@0
  3444
				{
sl@0
  3445
				TestWhichTests = TEST_RANDOM;
sl@0
  3446
				}
sl@0
  3447
			else if (token == _L("all"))
sl@0
  3448
				{
sl@0
  3449
				TestWhichTests = TEST_ALL;
sl@0
  3450
				}
sl@0
  3451
			else  if (token == _L("inst"))
sl@0
  3452
				{
sl@0
  3453
				TPtrC val=lex.NextToken();
sl@0
  3454
				TLex lexv(val);
sl@0
  3455
				TInt value;
sl@0
  3456
sl@0
  3457
				if (lexv.Val(value)==KErrNone)
sl@0
  3458
					{
sl@0
  3459
					TestInstanceId = value;
sl@0
  3460
					}
sl@0
  3461
				}
sl@0
  3462
			else  if (token == _L("iters"))
sl@0
  3463
				{
sl@0
  3464
				TPtrC val=lex.NextToken();
sl@0
  3465
				TLex lexv(val);
sl@0
  3466
				TInt value;
sl@0
  3467
sl@0
  3468
				if (val==_L("-"))
sl@0
  3469
					{
sl@0
  3470
					TestMaxLoops = KMaxTInt;
sl@0
  3471
					}
sl@0
  3472
				else
sl@0
  3473
					{
sl@0
  3474
					if (lexv.Val(value)==KErrNone)
sl@0
  3475
						{
sl@0
  3476
						TestMaxLoops = value;
sl@0
  3477
						}
sl@0
  3478
					else
sl@0
  3479
						{
sl@0
  3480
						DBGS_PRINT((_L("Bad value for thread count '%S' was ignored.\n"), &val));
sl@0
  3481
						retVal = EFalse;
sl@0
  3482
						break;
sl@0
  3483
						}
sl@0
  3484
					}
sl@0
  3485
				}
sl@0
  3486
			else
sl@0
  3487
				{
sl@0
  3488
				if ((foundArgs == EFalse) && (token.Length() == 1))
sl@0
  3489
					{
sl@0
  3490
					// Single letter argument...only run on 'd'
sl@0
  3491
					if (token.CompareF(_L("d")) == 0)
sl@0
  3492
						{
sl@0
  3493
sl@0
  3494
						TestFullAutoTest = EFalse;
sl@0
  3495
						TestIsAutomated = ETrue;
sl@0
  3496
						break;
sl@0
  3497
						}
sl@0
  3498
					else
sl@0
  3499
						{
sl@0
  3500
						if (!TestSilent)
sl@0
  3501
							{
sl@0
  3502
							test.Title();
sl@0
  3503
							test.Start(_L("Skipping non drive 'd' - Test Exiting."));
sl@0
  3504
							test.End();
sl@0
  3505
							}
sl@0
  3506
						foundArgs = ETrue;
sl@0
  3507
						TestExit = ETrue;
sl@0
  3508
						break;
sl@0
  3509
						}
sl@0
  3510
					}
sl@0
  3511
				DBGS_PRINT((_L("Unknown argument '%S' was ignored.\n"), &token));
sl@0
  3512
				break;
sl@0
  3513
				}
sl@0
  3514
			foundArgs = ETrue;
sl@0
  3515
			}
sl@0
  3516
		else
sl@0
  3517
			{
sl@0
  3518
			break;
sl@0
  3519
			}
sl@0
  3520
		}
sl@0
  3521
	if (!foundArgs)
sl@0
  3522
		{
sl@0
  3523
		retVal = EFalse;
sl@0
  3524
		}
sl@0
  3525
	return retVal;
sl@0
  3526
	}
sl@0
  3527
sl@0
  3528
//
sl@0
  3529
// AreWeTheTestBase
sl@0
  3530
//
sl@0
  3531
// Test whether we are the root of the tests.
sl@0
  3532
//
sl@0
  3533
void AreWeTheTestBase()
sl@0
  3534
	{
sl@0
  3535
	if (!TestSilent)
sl@0
  3536
		{
sl@0
  3537
		TFileName  filename(RProcess().FileName());
sl@0
  3538
sl@0
  3539
		TParse	myParse;
sl@0
  3540
		myParse.Set(filename, NULL, NULL);
sl@0
  3541
		TestNameBuffer.Zero();
sl@0
  3542
		TestNameBuffer.Append(myParse.Name());
sl@0
  3543
		TestNameBuffer.Append(_L(".exe"));
sl@0
  3544
sl@0
  3545
		TestWeAreTheTestBase = !TestNameBuffer.Compare(TestPlExeNames[KTestMediaBase]);
sl@0
  3546
sl@0
  3547
		RFs fs;
sl@0
  3548
		if (KErrNone == fs.Connect())
sl@0
  3549
			{
sl@0
  3550
			TEntry  anEntry;
sl@0
  3551
			TInt retVal = fs.Entry(_L("z:\\test\\mmcdemandpaginge32tests.bat"), anEntry);
sl@0
  3552
			if (retVal == KErrNone)
sl@0
  3553
				{
sl@0
  3554
				TestBootedFromMmc = ETrue;
sl@0
  3555
				}
sl@0
  3556
			else
sl@0
  3557
				{
sl@0
  3558
				TestBootedFromMmc = EFalse;
sl@0
  3559
				}
sl@0
  3560
			fs.Close();
sl@0
  3561
			}
sl@0
  3562
		}
sl@0
  3563
	else
sl@0
  3564
		{
sl@0
  3565
		TestNameBuffer.Zero();
sl@0
  3566
		TestNameBuffer.Append(_L("t_pageldrtst.exe"));
sl@0
  3567
		}
sl@0
  3568
	}
sl@0
  3569
#define  MEDNONE	KTestMediaAccessNone
sl@0
  3570
#define MEDBASIC	KTestMediaAccessBasic
sl@0
  3571
#define MEDMTHRE	KTestMediaAccessMultipleThreads
sl@0
  3572
#define MEDMPATT	KTestMediaAccessMultiplePattern
sl@0
  3573
#define MEDMIX		KTestMediaAccessMixed
sl@0
  3574
sl@0
  3575
TTheTests TheAutoTests[] =
sl@0
  3576
	{// fullOnly,           loading,               media,  multi, loops, threads,         loadHow,  inter,   prio,    media,  whichTests, lowmem, free, testName
sl@0
  3577
#ifdef TEST_SHORT_TEST
sl@0
  3578
		{ EFalse,          TEST_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      24,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL Load (ALL Media) Multiple thread all."), },
sl@0
  3579
#else
sl@0
  3580
		{ EFalse,          TEST_DLL,     TEST_MEDIA_BASE,  ETrue,     5,      24,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_THRASH, EFalse,    0, }, //_L("DLL Load (ROM) Multiple thread Thrash."), },
sl@0
  3581
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     5,      20,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_ALL,    EFalse,    0, }, //_L("DLL Load (ROM/ROFS) Single thread all."), },
sl@0
  3582
		{  ETrue,          TEST_EXE, TEST_MEDIA_ROM_BASE, EFalse,     5,      20,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_ALL,    EFalse,    0, }, //_L("Exe Load (ROM/ROFS) Single thread."), },
sl@0
  3583
		{  ETrue,         TEST_SELF, TEST_MEDIA_ROM_BASE, EFalse,     5,      20,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_ALL,    EFalse,    0, }, //_L("Self Load (ROM/ROFS) Single thread."), },
sl@0
  3584
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     5,      20,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL Load (ROM/ROFS) Multiple thread all."), },
sl@0
  3585
		{ EFalse,          TEST_DLL,      TEST_MEDIA_ALL,  ETrue,     3,      20,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL Load (ALL Media) Multiple thread all."), },
sl@0
  3586
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16,   TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads."), },
sl@0
  3587
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16,   TEST_DLL_FUNC, EFalse,  ETrue,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with prio."), },
sl@0
  3588
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      10,   TEST_DLL_FUNC, EFalse, EFalse, MEDBASIC, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with media access."), },
sl@0
  3589
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12,   TEST_DLL_FUNC, EFalse,  ETrue, MEDBASIC, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with media access and prio."), },
sl@0
  3590
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16, TEST_DLL_THREAD, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load thread (All Media) Multiple threads."), },
sl@0
  3591
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16, TEST_DLL_THREAD, EFalse,  ETrue,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load thread (All Media) Multiple threads with prio."), },
sl@0
  3592
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12, TEST_DLL_THREAD, EFalse,  ETrue, MEDBASIC, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load thread (All Media) Multiple threads with media access and prio."), },
sl@0
  3593
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16, TEST_DLL_GLOBAL, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load global (All Media) Multiple threads."), },
sl@0
  3594
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16, TEST_DLL_GLOBAL, EFalse,  ETrue,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load global (All Media) Multiple threads with prio."), },
sl@0
  3595
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12, TEST_DLL_GLOBAL, EFalse,  ETrue, MEDBASIC, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load global (All Media) Multiple threads with media access and prio."), },
sl@0
  3596
		{ EFalse, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16,   TEST_DLL_FUNC,  ETrue, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave."), },
sl@0
  3597
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16,   TEST_DLL_FUNC,  ETrue,  ETrue,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave, prio."), },
sl@0
  3598
sl@0
  3599
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      16,   TEST_DLL_FUNC,  ETrue,  ETrue, MEDBASIC, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave, media and prio."), },
sl@0
  3600
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12,   TEST_DLL_FUNC,  ETrue,  ETrue, MEDMTHRE, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave, multi media and prio."), },
sl@0
  3601
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12,   TEST_DLL_FUNC,  ETrue,  ETrue, MEDMPATT, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave, media and prio."), },
sl@0
  3602
		{  ETrue, TEST_EXE_SELF_DLL,      TEST_MEDIA_ALL,  ETrue,     2,      12,   TEST_DLL_FUNC,  ETrue,  ETrue,   MEDMIX, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load (All Media) Multiple threads with interleave, media and prio."), },
sl@0
  3603
		{ EFalse, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      10,   TEST_DLL_FUNC,  ETrue,  ETrue,   MEDMIX, TEST_RANDOM, EFalse,    0, }, //_L("DLL/EXE/SELF Load Multiple threads with interleave, media and prio."), },
sl@0
  3604
#endif // TEST_SHORT_TEST
sl@0
  3605
	};
sl@0
  3606
#define NUM_AUTO_TESTS (TInt)(sizeof(TheAutoTests) / sizeof(TTheTests))
sl@0
  3607
sl@0
  3608
//
sl@0
  3609
// PerformAutoTest
sl@0
  3610
//
sl@0
  3611
// The autotest.
sl@0
  3612
//
sl@0
  3613
sl@0
  3614
void PerformAutoTest(TBool aReduceTime = EFalse)
sl@0
  3615
	{
sl@0
  3616
	TInt        testIndex;
sl@0
  3617
	TTheTests  *pTest = &TheAutoTests[0];
sl@0
  3618
	
sl@0
  3619
	DoStats();
sl@0
  3620
sl@0
  3621
	for (testIndex = 0; testIndex < NUM_AUTO_TESTS; testIndex ++, pTest++)
sl@0
  3622
		{
sl@0
  3623
		if (   (   !TestWeAreTheTestBase 
sl@0
  3624
			    && (   (pTest->testLoadDllHow != TEST_DLL_FUNC)
sl@0
  3625
				    || !pTest->testMultiple))
sl@0
  3626
			|| ((TestFullAutoTest == EFalse) && (pTest->testFullAutoOnly)))
sl@0
  3627
			{
sl@0
  3628
			continue;
sl@0
  3629
			}
sl@0
  3630
		
sl@0
  3631
		TestLoading             = pTest->testLoading;
sl@0
  3632
		TestWhichMedia          = pTest->testWhichMedia;
sl@0
  3633
		TestMaxLoops            = aReduceTime ? 1 : pTest->testMaxLoops;
sl@0
  3634
		TestMultipleThreadCount = aReduceTime ? 10 : pTest->testMultipleThreadCount;
sl@0
  3635
		TestLoadDllHow          = pTest->testLoadDllHow;
sl@0
  3636
		TestInterleave          = pTest->testInterleave;
sl@0
  3637
		TestPrioChange          = pTest->testPrioChange;
sl@0
  3638
		TestMediaAccess         = pTest->testMediaAccess;
sl@0
  3639
		if (aReduceTime && (TestMediaAccess != MEDBASIC) && (TestMediaAccess != MEDNONE))
sl@0
  3640
			{
sl@0
  3641
			continue;
sl@0
  3642
			}
sl@0
  3643
		TestWhichTests          = pTest->testWhichTests;		
sl@0
  3644
		TestingLowMem			= pTest->testLowMem;
sl@0
  3645
		if (!TestSilent)
sl@0
  3646
			{
sl@0
  3647
			test.Next(_L("Auto Test"));
sl@0
  3648
			}
sl@0
  3649
		if (pTest->testMultiple)
sl@0
  3650
			{
sl@0
  3651
			RUNTEST(DoMultipleTest(ETrue), KErrNone);
sl@0
  3652
			}
sl@0
  3653
		else
sl@0
  3654
			{
sl@0
  3655
			RUNTEST(DoSingleTest(ETrue), KErrNone);
sl@0
  3656
			}
sl@0
  3657
sl@0
  3658
		DoStats();
sl@0
  3659
sl@0
  3660
#ifdef TEST_KERN_HEAP
sl@0
  3661
		__KHEAP_MARK;
sl@0
  3662
		__KHEAP_CHECK(0);
sl@0
  3663
		__KHEAP_MARKEND;
sl@0
  3664
#endif
sl@0
  3665
		}
sl@0
  3666
#ifdef TEST_KERN_HEAP
sl@0
  3667
	__KHEAP_MARK;
sl@0
  3668
	__KHEAP_CHECK(0);
sl@0
  3669
	__KHEAP_MARKEND;
sl@0
  3670
#endif
sl@0
  3671
	}
sl@0
  3672
sl@0
  3673
TTheTests TheLowMemTests[] =
sl@0
  3674
	{// fullOnly,           loading,               media,  multi, loops, threads,       loadHow,  inter,   prio,    media,  whichTests, lowmem, free, testName
sl@0
  3675
#ifndef TEST_SHORT_TEST
sl@0
  3676
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Single thread with Low memory (init)."), },
sl@0
  3677
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE, EFalse,     5,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM,  ETrue,    0, }, //_L("Single thread with Low memory."), },
sl@0
  3678
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory (init)."), },
sl@0
  3679
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      16, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory ."), },
sl@0
  3680
		{ EFalse,          TEST_DLL, TEST_MEDIA_ALL,      EFalse,     5,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory and All media(init)."), },
sl@0
  3681
		{ EFalse, TEST_EXE_SELF_DLL, TEST_MEDIA_ALL,       ETrue,     2,      12, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory and All media."), },
sl@0
  3682
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory, with starting free ram (init)."), },
sl@0
  3683
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      16, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM,  ETrue,   32, }, //_L("Multiple thread with Low memory, with starting free ram."), },
sl@0
  3684
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,      16, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory and prio and media access(init)."), },
sl@0
  3685
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      16, TEST_DLL_FUNC, EFalse,  ETrue, MEDBASIC, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory and prio and media access."), },
sl@0
  3686
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, prio and media access(init)."), },
sl@0
  3687
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      16, TEST_DLL_FUNC,  ETrue,  ETrue, MEDBASIC, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, prio and media access."), },
sl@0
  3688
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, media access and All media (init)."), },
sl@0
  3689
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ALL,       ETrue,     2,      16, TEST_DLL_FUNC,  ETrue, EFalse, MEDBASIC, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, media access and All media + loading."), },
sl@0
  3690
		{ EFalse,		   TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,    10,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Single thread with Low memory (init)."), },
sl@0
  3691
		{ EFalse,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     5,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM,  ETrue,    0, }, //_L("Single thread with Low memory."), },
sl@0
  3692
#endif //TEST_SHORT_TEST
sl@0
  3693
		{ EFalse,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,    10,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media (init)."), },
sl@0
  3694
		{ EFalse, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      16, TEST_DLL_FUNC,  ETrue,  ETrue, MEDBASIC, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media + loading."), },
sl@0
  3695
		{ EFalse,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     5,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media (init)."), },
sl@0
  3696
		{ EFalse, TEST_EXE_SELF_DLL, TEST_MEDIA_ROM_BASE,  ETrue,     2,      10, TEST_DLL_FUNC,  ETrue,  ETrue, MEDMTHRE, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, prio, multi media access and All media + loading."), },
sl@0
  3697
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media (init)."), },
sl@0
  3698
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ALL,       ETrue,     2,      16, TEST_DLL_FUNC,  ETrue,  ETrue, MEDBASIC, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media + loading."), },
sl@0
  3699
		{  ETrue,          TEST_DLL, TEST_MEDIA_ROM_BASE, EFalse,     1,       1, TEST_DLL_FUNC, EFalse, EFalse,  MEDNONE, TEST_RANDOM, EFalse,    0, }, //_L("Multiple thread with Low memory interleave, prio, media access and All media (init)."), },
sl@0
  3700
		{  ETrue, TEST_EXE_SELF_DLL, TEST_MEDIA_ALL,       ETrue,     2,      16, TEST_DLL_FUNC,  ETrue,  ETrue, MEDMTHRE, TEST_RANDOM,  ETrue,    0, }, //_L("Multiple thread with Low memory interleave, prio, multi media access and All media + loading."), },
sl@0
  3701
sl@0
  3702
	};
sl@0
  3703
#define NUM_LOWMEM_TESTS (TInt)(sizeof(TheLowMemTests) / sizeof(TTheTests))
sl@0
  3704
sl@0
  3705
//
sl@0
  3706
// DoLowMemTest
sl@0
  3707
//
sl@0
  3708
// Low Memory Test
sl@0
  3709
//
sl@0
  3710
void DoLowMemTest(TBool aEnableAllMedia = EFalse)
sl@0
  3711
	{
sl@0
  3712
	TInt r = User::LoadLogicalDevice(KPageStressTestLddName);
sl@0
  3713
	RUNTEST1(r==KErrNone || r==KErrAlreadyExists);
sl@0
  3714
	RUNTEST(PagestressLdd.Open(),KErrNone);
sl@0
  3715
	RUNTEST(PagestressLdd.DoSetDebugFlag((TInt)TestDebug),KErrNone);
sl@0
  3716
	
sl@0
  3717
	SVMCacheInfo  tempPages;
sl@0
  3718
	memset(&tempPages, 0, sizeof(tempPages));
sl@0
  3719
	if (TestIsDemandPaged)
sl@0
  3720
		{
sl@0
  3721
		// get the old cache info
sl@0
  3722
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  3723
		TInt minSize = 8 * 4096;
sl@0
  3724
		TInt maxSize = 256 * 4096;
sl@0
  3725
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  3726
		}
sl@0
  3727
sl@0
  3728
	TInt		testIndex;
sl@0
  3729
	TTheTests  *pTest = &TheLowMemTests[0];
sl@0
  3730
	for (testIndex = 0; testIndex < NUM_LOWMEM_TESTS; testIndex ++, pTest++)
sl@0
  3731
		{
sl@0
  3732
		if (   (!aEnableAllMedia && (pTest->testWhichMedia == TEST_MEDIA_ALL))
sl@0
  3733
		    || ((TestFullAutoTest == EFalse) && (pTest->testFullAutoOnly)))
sl@0
  3734
			{
sl@0
  3735
			continue;
sl@0
  3736
			}
sl@0
  3737
sl@0
  3738
		TestLoading             = pTest->testLoading;
sl@0
  3739
		TestWhichMedia          = pTest->testWhichMedia;
sl@0
  3740
		TestMaxLoops            = pTest->testMaxLoops;
sl@0
  3741
		TestMultipleThreadCount = pTest->testMultipleThreadCount;
sl@0
  3742
		TestLoadDllHow          = pTest->testLoadDllHow;
sl@0
  3743
		TestInterleave          = pTest->testInterleave;
sl@0
  3744
		TestPrioChange          = pTest->testPrioChange;
sl@0
  3745
		TestMediaAccess         = pTest->testMediaAccess;
sl@0
  3746
		TestWhichTests          = pTest->testWhichTests;		
sl@0
  3747
		TestingLowMem			= pTest->testLowMem;
sl@0
  3748
		if (!TestSilent)
sl@0
  3749
			{
sl@0
  3750
			test.Next(_L("Low Memory"));
sl@0
  3751
			}
sl@0
  3752
		if (pTest->testLowMem)
sl@0
  3753
			{
sl@0
  3754
			PagestressLdd.DoConsumeRamSetup(pTest->testFreeRam, TEST_LM_BLOCKSIZE);
sl@0
  3755
			}
sl@0
  3756
sl@0
  3757
		if (pTest->testMultiple)
sl@0
  3758
			{
sl@0
  3759
			RUNTEST(DoMultipleTest(pTest->testLowMem), KErrNone);
sl@0
  3760
			}
sl@0
  3761
		else
sl@0
  3762
			{
sl@0
  3763
			RUNTEST(DoSingleTest(pTest->testLowMem), KErrNone);
sl@0
  3764
			}
sl@0
  3765
sl@0
  3766
		if (pTest->testLowMem)
sl@0
  3767
			{
sl@0
  3768
			PagestressLdd.DoConsumeRamFinish();
sl@0
  3769
			}
sl@0
  3770
sl@0
  3771
		DoStats();
sl@0
  3772
#ifdef TEST_KERN_HEAP
sl@0
  3773
		__KHEAP_MARK;
sl@0
  3774
		__KHEAP_CHECK(0);
sl@0
  3775
		__KHEAP_MARKEND;
sl@0
  3776
#endif
sl@0
  3777
		}
sl@0
  3778
sl@0
  3779
	if (!TestSilent)
sl@0
  3780
		{
sl@0
  3781
		test.Next(_L("Close test driver"));
sl@0
  3782
		}
sl@0
  3783
	PagestressLdd.Close();
sl@0
  3784
	RUNTEST(User::FreeLogicalDevice(KPageStressTestLddName), KErrNone);
sl@0
  3785
sl@0
  3786
	if (TestIsDemandPaged)
sl@0
  3787
		{
sl@0
  3788
		TInt minSize = tempPages.iMinSize;
sl@0
  3789
		TInt maxSize = tempPages.iMaxSize;
sl@0
  3790
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  3791
		}
sl@0
  3792
sl@0
  3793
#ifdef TEST_KERN_HEAP
sl@0
  3794
	__KHEAP_MARK;
sl@0
  3795
	__KHEAP_CHECK(0);
sl@0
  3796
	__KHEAP_MARKEND;
sl@0
  3797
#endif
sl@0
  3798
	TestingLowMem = EFalse;
sl@0
  3799
sl@0
  3800
	}
sl@0
  3801
sl@0
  3802
//
sl@0
  3803
// MultipleDefragThread
sl@0
  3804
//
sl@0
  3805
// Thread function, one created for each zone in a multiple thread test.
sl@0
  3806
//
sl@0
  3807
sl@0
  3808
LOCAL_C TInt MultipleDefragThread(TAny* aUseTb)
sl@0
  3809
	{
sl@0
  3810
	TInt numZones = 1;
sl@0
  3811
	TInt zoneId = (TInt)aUseTb;
sl@0
  3812
sl@0
  3813
	if (TestZoneCount > TEST_MAX_ZONE_THREADS)
sl@0
  3814
		{
sl@0
  3815
		numZones = TestZoneCount / TEST_MAX_ZONE_THREADS;
sl@0
  3816
		}
sl@0
  3817
sl@0
  3818
	while (1)
sl@0
  3819
		{
sl@0
  3820
		TInt index = 0;
sl@0
  3821
		TInt tempy = 0;
sl@0
  3822
		for (; index < numZones; index ++)
sl@0
  3823
			{
sl@0
  3824
			User::AfterHighRes(TEST_MAX_ZONE_THREADS*TickPeriod/4);
sl@0
  3825
			tempy = zoneId + (TEST_MAX_ZONE_THREADS * index);
sl@0
  3826
			if (tempy < (TInt)TestZoneCount)
sl@0
  3827
				{
sl@0
  3828
				RamstressLdd.DoMovePagesInZone(tempy);
sl@0
  3829
				}
sl@0
  3830
			if (TestDefragTestEnd)
sl@0
  3831
				break;
sl@0
  3832
			}
sl@0
  3833
		if (TestDefragTestEnd)
sl@0
  3834
			break;
sl@0
  3835
		}	
sl@0
  3836
	return KErrNone;
sl@0
  3837
	}
sl@0
  3838
sl@0
  3839
//
sl@0
  3840
// DoDefragAutoTest
sl@0
  3841
//
sl@0
  3842
// Call the auto tests whilst defraging in the background.
sl@0
  3843
//
sl@0
  3844
sl@0
  3845
void DoDefragAutoTest()
sl@0
  3846
	{
sl@0
  3847
	TUint	localZoneCount = TestZoneCount;
sl@0
  3848
	if (TestZoneCount > TEST_MAX_ZONE_THREADS)
sl@0
  3849
		{
sl@0
  3850
		localZoneCount = TEST_MAX_ZONE_THREADS;
sl@0
  3851
		}
sl@0
  3852
	TInt			size =    (sizeof(RThread) * localZoneCount) 
sl@0
  3853
							+ (sizeof(TInt) * localZoneCount);
sl@0
  3854
	TUint8*			pBuf = (TUint8*)User::AllocZ(size);
sl@0
  3855
sl@0
  3856
	test(pBuf != NULL);
sl@0
  3857
	RThread			*pTheThreads = (RThread*)pBuf;
sl@0
  3858
	TInt			*pThreadInUse = (TInt*)(pTheThreads + localZoneCount);
sl@0
  3859
	TInt			 ret;
sl@0
  3860
	TUint			 index;
sl@0
  3861
	for (index = 0; index < localZoneCount; index ++)
sl@0
  3862
		{
sl@0
  3863
		DBGS_PRINT((_L("%S : Starting Defrag Thread %d\n"), &TestNameBuffer, index));
sl@0
  3864
		ret = pTheThreads[index].Create(KTestBlank,MultipleDefragThread,KDefaultStackSize,NULL,(TAny*) index);
sl@0
  3865
		if (ret == KErrNone)
sl@0
  3866
			{
sl@0
  3867
			pTheThreads[index].Resume();
sl@0
  3868
			pThreadInUse[index] = 1;
sl@0
  3869
			}
sl@0
  3870
		else
sl@0
  3871
			{
sl@0
  3872
			DBGS_PRINT((_L("%S : Starting Defrag Thread Failed %d\n"), &TestNameBuffer, index));
sl@0
  3873
			}
sl@0
  3874
		}
sl@0
  3875
sl@0
  3876
	// Do the full auto tests...
sl@0
  3877
	PerformAutoTest(TestIsDemandPaged);
sl@0
  3878
sl@0
  3879
	TestDefragTestEnd = ETrue;
sl@0
  3880
	RamstressLdd.DoSetEndFlag(1);
sl@0
  3881
	TBool	anyUsed = ETrue;
sl@0
  3882
sl@0
  3883
	DBGS_PRINT((_L("%S : Waiting for Defrag Threads to exit...\n"), &TestNameBuffer));	
sl@0
  3884
	TUint killNext = User::TickCount();
sl@0
  3885
	while(anyUsed)
sl@0
  3886
		{
sl@0
  3887
		anyUsed = EFalse;
sl@0
  3888
		
sl@0
  3889
		// walk through the thread list to check which are still alive.
sl@0
  3890
		for (index = 0; index < localZoneCount; index++)
sl@0
  3891
			{
sl@0
  3892
			if (pThreadInUse[index])
sl@0
  3893
				{
sl@0
  3894
				if (pTheThreads[index].ExitType() != EExitPending)
sl@0
  3895
					{
sl@0
  3896
					if (pTheThreads[index].ExitType() == EExitPanic)
sl@0
  3897
						{
sl@0
  3898
						DBGS_PRINT((_L("%S : Defrag Thread %d Panic'd\n"), &TestNameBuffer, index));	
sl@0
  3899
						}
sl@0
  3900
					else
sl@0
  3901
						{
sl@0
  3902
						DBGS_PRINT((_L("%S : Defrag Thread %d Exited\n"), &TestNameBuffer, index));	
sl@0
  3903
						}
sl@0
  3904
					pTheThreads[index].Close();
sl@0
  3905
					pThreadInUse[index] = EFalse;
sl@0
  3906
					}
sl@0
  3907
				else
sl@0
  3908
					{
sl@0
  3909
					anyUsed = ETrue;
sl@0
  3910
					TUint now = User::TickCount();
sl@0
  3911
					TUint time = TUint((TUint64)(now-killNext)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  3912
					const TUint killTimeStep = (TEST_DOT_PERIOD+9)/10; // 1/10th of a dot
sl@0
  3913
					if(time>TEST_DOT_PERIOD+killTimeStep)
sl@0
  3914
						{
sl@0
  3915
						killNext += killTimeStep*1000000/TickPeriod;
sl@0
  3916
						DBGS_PRINT((_L("%S : killing Defrag Thread %d\n"), &TestNameBuffer, index));	
sl@0
  3917
						pTheThreads[index].Kill(KErrNone);
sl@0
  3918
						pTheThreads[index].Close();
sl@0
  3919
						pThreadInUse[index] = EFalse;
sl@0
  3920
						}
sl@0
  3921
					}
sl@0
  3922
				}
sl@0
  3923
			}
sl@0
  3924
		User::After(500000);
sl@0
  3925
		}
sl@0
  3926
	DBGS_PRINT((_L("%S : Defrag Threads exited...\n"), &TestNameBuffer));	
sl@0
  3927
	RamstressLdd.DoSetEndFlag(0);
sl@0
  3928
	User::Free(pBuf);
sl@0
  3929
	}
sl@0
  3930
sl@0
  3931
//
sl@0
  3932
// DoDefragTest
sl@0
  3933
//
sl@0
  3934
// Test the ram defrag code.
sl@0
  3935
//
sl@0
  3936
sl@0
  3937
void DoDefragTest(void)
sl@0
  3938
	{
sl@0
  3939
	SVMCacheInfo  tempPages;
sl@0
  3940
	memset(&tempPages, 0, sizeof(tempPages));
sl@0
  3941
sl@0
  3942
	test.Next(_L("Ram Defrag : Get the number of zones"));
sl@0
  3943
	// first get the number of zones
sl@0
  3944
	TInt ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneCount,&TestZoneCount,0);
sl@0
  3945
	if(ret==KErrNotSupported)
sl@0
  3946
		{
sl@0
  3947
		test.Next(_L("TESTS NOT RUN - Ram Defrag appears to not be supported.\n"));
sl@0
  3948
		return;
sl@0
  3949
		}
sl@0
  3950
	test(ret == KErrNone);
sl@0
  3951
	test(TestZoneCount != 0);
sl@0
  3952
	test.Printf(_L("RAM Zones (count=%u)\n"),TestZoneCount);
sl@0
  3953
sl@0
  3954
	// now get the config of each of the zones.
sl@0
  3955
	TUint						index;
sl@0
  3956
	struct SRamZoneConfig		config;
sl@0
  3957
	struct SRamZoneUtilisation	util;
sl@0
  3958
	test.Next(_L("Ram Defrag : Get info about the zones"));
sl@0
  3959
	for (index = 0; index < TestZoneCount; index ++)
sl@0
  3960
		{
sl@0
  3961
		ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneConfig,(TAny*)index, (TAny*)&config);
sl@0
  3962
		test(ret == KErrNone);
sl@0
  3963
		test.Printf(_L("config : id=%d index=%d base=0x%08x end=0x%08x pages=%d pref=%d flags=0x%x\n"),
sl@0
  3964
					config.iZoneId,config.iZoneIndex,config.iPhysBase,config.iPhysEnd,config.iPhysPages, 
sl@0
  3965
					config.iPref,config.iFlags);
sl@0
  3966
sl@0
  3967
		ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneUtilisation,(TAny*)index, (TAny*)&util);
sl@0
  3968
		test(ret == KErrNone);
sl@0
  3969
		test.Printf(_L("usage  : id=%d index=%d pages=%d free=%d unknown=%d fixed=%d move=%d discard=%d other=%d\n"),
sl@0
  3970
					util.iZoneId,util.iZoneIndex,util.iPhysPages,util.iFreePages,
sl@0
  3971
					util.iAllocUnknown,util.iAllocFixed,util.iAllocMovable,util.iAllocDiscardable,util.iAllocOther);
sl@0
  3972
		}
sl@0
  3973
	// Now test for zones out of range.
sl@0
  3974
	test.Next(_L("Ram Defrag : test out of range indexes"));
sl@0
  3975
	ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneConfig,(TAny*)(TestZoneCount + 1), (TAny*)&config);
sl@0
  3976
	test(ret != KErrNone);
sl@0
  3977
	ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneUtilisation,(TAny*)(TestZoneCount + 1), (TAny*)&util);
sl@0
  3978
	test(ret != KErrNone);
sl@0
  3979
sl@0
  3980
	ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneConfig,(TAny*)-1, (TAny*)&config);
sl@0
  3981
	test(ret != KErrNone);
sl@0
  3982
	ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneUtilisation,(TAny*)-1, (TAny*)&util);
sl@0
  3983
	test(ret != KErrNone);
sl@0
  3984
	test.Next(_L("Ram Defrag : test out of range enums"));
sl@0
  3985
	ret = UserSvr::HalFunction(EHalGroupRam,-1, 0, 0);
sl@0
  3986
	test(ret != KErrNone);
sl@0
  3987
	ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneUtilisation + 1,0, 0);
sl@0
  3988
	test(ret != KErrNone);
sl@0
  3989
sl@0
  3990
	TInt r = User::LoadLogicalDevice(KRamStressTestLddName);
sl@0
  3991
	RUNTEST1(r==KErrNone || r==KErrAlreadyExists);
sl@0
  3992
	RUNTEST(RamstressLdd.Open(),KErrNone);
sl@0
  3993
	//TestDebug = ETrue;
sl@0
  3994
	RUNTEST(RamstressLdd.DoSetDebugFlag((TInt)TestDebug),KErrNone);
sl@0
  3995
sl@0
  3996
	test.Next(_L("Ram Defrag : set VM cache to stress free..."));
sl@0
  3997
sl@0
  3998
	if (TestIsDemandPaged)
sl@0
  3999
		{
sl@0
  4000
		// get the old cache info
sl@0
  4001
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  4002
sl@0
  4003
		TInt minSize = 512 * 4096;
sl@0
  4004
		TInt maxSize = 32767 * 4096;
sl@0
  4005
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  4006
		}
sl@0
  4007
sl@0
  4008
	test.Next(_L("Ram Defrag : move all pages in all zone in 1 thread..."));
sl@0
  4009
sl@0
  4010
	for (index = 0; index < TestZoneCount; index ++)
sl@0
  4011
		{
sl@0
  4012
		test.Printf(_L("Ram Defrag : moving pages in zone %u\n"),index);
sl@0
  4013
		ret = RamstressLdd.DoMovePagesInZone(index);
sl@0
  4014
		if (ret != KErrNone)
sl@0
  4015
			{
sl@0
  4016
			test.Printf(_L("Ram Defrag : moving pages in zone failed %u err=%d\n"), index, ret);
sl@0
  4017
			}
sl@0
  4018
		}
sl@0
  4019
sl@0
  4020
sl@0
  4021
	test.Next(_L("Ram Defrag : Get info after test"));
sl@0
  4022
	for (index = 0; index < TestZoneCount; index ++)
sl@0
  4023
		{
sl@0
  4024
		ret = UserSvr::HalFunction(EHalGroupRam,ERamHalGetZoneUtilisation,(TAny*)index, (TAny*)&util);
sl@0
  4025
		test(ret == KErrNone);
sl@0
  4026
		test.Printf(_L("usage  : id=%d index=%d pages=%d free=%d unknown=%d fixed=%d move=%d discard=%d other=%d\n"),
sl@0
  4027
					util.iZoneId,util.iZoneIndex,util.iPhysPages,util.iFreePages,
sl@0
  4028
					util.iAllocUnknown,util.iAllocFixed,util.iAllocMovable,util.iAllocDiscardable,util.iAllocOther);
sl@0
  4029
		}
sl@0
  4030
sl@0
  4031
	test.Next(_L("Ram Defrag : Page moving on multiple threads with auto test running."));
sl@0
  4032
sl@0
  4033
	TestingDefrag = ETrue;
sl@0
  4034
	TestDefragTestEnd = EFalse;
sl@0
  4035
sl@0
  4036
	DoDefragAutoTest();
sl@0
  4037
	TestingDefrag = EFalse;
sl@0
  4038
	/*
sl@0
  4039
	 * End of test cleanup.
sl@0
  4040
	 */
sl@0
  4041
sl@0
  4042
	test.Next(_L("Ram Defrag : reset VM cache back to stressed."));
sl@0
  4043
	if (TestIsDemandPaged)
sl@0
  4044
		{
sl@0
  4045
		TInt minSize = tempPages.iMinSize;
sl@0
  4046
		TInt maxSize = tempPages.iMaxSize;
sl@0
  4047
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  4048
		}
sl@0
  4049
	RamstressLdd.Close();
sl@0
  4050
	test.Next(_L("Ram Defrag : Done"));
sl@0
  4051
	}
sl@0
  4052
sl@0
  4053
//
sl@0
  4054
// PerformExceptionThread
sl@0
  4055
//
sl@0
  4056
// Generate a Panic
sl@0
  4057
//
sl@0
  4058
sl@0
  4059
LOCAL_C TInt PerformExceptionThread(TAny* )
sl@0
  4060
	{
sl@0
  4061
	User::AfterHighRes(1000000);
sl@0
  4062
	// this line will cause a Kern::Exec 0 !!!
sl@0
  4063
	test.Printf(_L("Hello World\n"));
sl@0
  4064
sl@0
  4065
	return KErrNone;
sl@0
  4066
	}
sl@0
  4067
sl@0
  4068
//
sl@0
  4069
// DoExceptionInAnotherThread
sl@0
  4070
//
sl@0
  4071
// Test the d_exc and minkda functionality with faulting processes.
sl@0
  4072
//
sl@0
  4073
sl@0
  4074
void DoExceptionInAnotherThread(void)
sl@0
  4075
	{
sl@0
  4076
	TRequestStatus	theStatus;
sl@0
  4077
	RThread			theThread;
sl@0
  4078
	
sl@0
  4079
	TInt ret = theThread.Create(KTestBlank,PerformExceptionThread,KDefaultStackSize,NULL,NULL);
sl@0
  4080
	test(ret == KErrNone);
sl@0
  4081
	theThread.Logon(theStatus);
sl@0
  4082
	RUNTEST1(theStatus == KRequestPending);	
sl@0
  4083
	theThread.Resume();
sl@0
  4084
	theThread.Close();
sl@0
  4085
	User::WaitForRequest(theStatus);
sl@0
  4086
	}
sl@0
  4087
sl@0
  4088
//
sl@0
  4089
// DoTestD_Exc
sl@0
  4090
//
sl@0
  4091
// Test the d_exc and minkda functionality with faulting processes.
sl@0
  4092
//
sl@0
  4093
sl@0
  4094
TInt DoTestD_Exc()
sl@0
  4095
	{
sl@0
  4096
	if (!TestSilent)
sl@0
  4097
		{
sl@0
  4098
		test.Next(_L("DoTestD_Exc : d_exc check test."));
sl@0
  4099
		}
sl@0
  4100
	DBGS_PRINT((_L("%S : DoTestD_Exc start...\n"), &TestNameBuffer));	
sl@0
  4101
	// first we need to spawn d_exc.exe
sl@0
  4102
	RProcess dexcProcess;
sl@0
  4103
	TInt ret = dexcProcess.Create(_L("d_exc.exe"),_L("-b"));
sl@0
  4104
	RUNTEST1(KErrNone == ret);
sl@0
  4105
	TRequestStatus dexcStatus;
sl@0
  4106
	dexcProcess.Logon(dexcStatus);
sl@0
  4107
	RUNTEST1(dexcStatus == KRequestPending);	
sl@0
  4108
	dexcProcess.Resume();
sl@0
  4109
sl@0
  4110
	DBGS_PRINT((_L("%S : DoTestD_Exc started d_exc.exe\n"), &TestNameBuffer));	
sl@0
  4111
sl@0
  4112
	DoExceptionInAnotherThread();
sl@0
  4113
sl@0
  4114
	DBGS_PRINT((_L("%S : DoTestD_Exc test completed\n"), &TestNameBuffer));	
sl@0
  4115
	// check that d_exc and minkda don't die!
sl@0
  4116
	RUNTEST1(dexcProcess.ExitType() == EExitPending);
sl@0
  4117
sl@0
  4118
	DBGS_PRINT((_L("%S : DoTestD_Exc d_exc still running\n"), &TestNameBuffer));	
sl@0
  4119
	
sl@0
  4120
	// kill off d_exc!
sl@0
  4121
	dexcProcess.Kill(KErrNone);
sl@0
  4122
	dexcProcess.Close();
sl@0
  4123
	User::WaitForRequest(dexcStatus);
sl@0
  4124
	DBGS_PRINT((_L("%S : DoTestD_Exc d_exc killed and exiting\n"), &TestNameBuffer));	
sl@0
  4125
	return KErrNone;
sl@0
  4126
	}
sl@0
  4127
sl@0
  4128
/**
sl@0
  4129
	Get name of the hash file used for an EXE or DLL which has been
sl@0
  4130
	copied to writable media.
sl@0
  4131
sl@0
  4132
	@param	aOrigName		Name of EXE or DLL which has been copied to
sl@0
  4133
							writable media.  This does not have to be
sl@0
  4134
							qualified because only the name and extension
sl@0
  4135
							are used.
sl@0
  4136
	@param	aHashName		On return this is set to the absolute filename
sl@0
  4137
							which should contain the file's hash.  This
sl@0
  4138
							function does not create the file, or its containing
sl@0
  4139
							directory.
sl@0
  4140
 */
sl@0
  4141
sl@0
  4142
static void GetHashFileName(const TDesC& aOrigName, TDes& aHashName)
sl@0
  4143
	{
sl@0
  4144
	aHashName.Copy(KSysHash);
sl@0
  4145
	aHashName[0] = (TUint8) RFs::GetSystemDriveChar();
sl@0
  4146
	const TParsePtrC ppc(aOrigName);
sl@0
  4147
	aHashName.Append(ppc.NameAndExt());
sl@0
  4148
	}
sl@0
  4149
sl@0
  4150
//
sl@0
  4151
// HashFile
sl@0
  4152
// take hash of files require full drive:/path/name.ext
sl@0
  4153
//
sl@0
  4154
sl@0
  4155
void HashFile(const TDesC& aFileName, RFs& aFs)
sl@0
  4156
	{
sl@0
  4157
	CSHA1* sha1 = CSHA1::NewL();
sl@0
  4158
	CleanupStack::PushL(sha1);
sl@0
  4159
	
sl@0
  4160
	TBuf<50> hashfile;
sl@0
  4161
	hashfile = KSysHash;
sl@0
  4162
	hashfile[0] = (TUint8) RFs::GetSystemDriveChar();
sl@0
  4163
	
sl@0
  4164
	TInt r = aFs.MkDirAll(hashfile);
sl@0
  4165
	RUNTEST1(r==KErrNone || r==KErrAlreadyExists);
sl@0
  4166
sl@0
  4167
	RFile fDest;
sl@0
  4168
	r = fDest.Open(aFs, aFileName, EFileRead | EFileStream);
sl@0
  4169
	if (r != KErrNone)
sl@0
  4170
		{
sl@0
  4171
		if (TestingReaper && (r == KErrInUse))
sl@0
  4172
			{
sl@0
  4173
			TBool whinged = EFalse;
sl@0
  4174
			while (r == KErrInUse)
sl@0
  4175
				{
sl@0
  4176
				User::After(2000000);
sl@0
  4177
				if (!whinged)
sl@0
  4178
					{
sl@0
  4179
					DBGS_PRINT((_L("HashFile() retrying Open for %S (%d)\n"), &aFileName, r));
sl@0
  4180
					whinged = ETrue;
sl@0
  4181
					}
sl@0
  4182
				r = fDest.Open(aFs, aFileName, EFileRead | EFileStream);
sl@0
  4183
				}
sl@0
  4184
sl@0
  4185
			}
sl@0
  4186
		else
sl@0
  4187
			{
sl@0
  4188
			DBGS_PRINT((_L("fDest.Open returned %d\n"), r));
sl@0
  4189
			}
sl@0
  4190
		}
sl@0
  4191
	User::LeaveIfError(r);
sl@0
  4192
	CleanupClosePushL(fDest);
sl@0
  4193
sl@0
  4194
	TBool done;
sl@0
  4195
	TBuf8<512> content;
sl@0
  4196
	do
sl@0
  4197
		{
sl@0
  4198
		r = fDest.Read(content);
sl@0
  4199
		if (r!=KErrNone)
sl@0
  4200
			DBGS_PRINT((_L("fDest.Read returned %d\n"), r));	
sl@0
  4201
		User::LeaveIfError(r);
sl@0
  4202
		done = (content.Length() == 0);
sl@0
  4203
		if (! done)
sl@0
  4204
			sha1->Update(content);
sl@0
  4205
		} while (! done);
sl@0
  4206
	CleanupStack::PopAndDestroy(&fDest);
sl@0
  4207
sl@0
  4208
	// write hash to \sys\hash
sl@0
  4209
	TBuf8<SHA1_HASH> hashVal = sha1->Final();
sl@0
  4210
sl@0
  4211
	TFileName fnSrc(aFileName);
sl@0
  4212
	GetHashFileName(aFileName, fnSrc);
sl@0
  4213
	RFile fHash;
sl@0
  4214
	r = fHash.Replace(aFs, fnSrc, EFileWrite | EFileStream);
sl@0
  4215
	if (r != KErrNone)
sl@0
  4216
		DBGS_PRINT((_L("fHash.Replace returned %d\n"), r));
sl@0
  4217
	User::LeaveIfError(r);
sl@0
  4218
	CleanupClosePushL(fHash);
sl@0
  4219
	r = fHash.Write(hashVal);
sl@0
  4220
	if (r != KErrNone)
sl@0
  4221
		DBGS_PRINT((_L("fHash.Write returned %d\n"), r));
sl@0
  4222
	User::LeaveIfError(r);
sl@0
  4223
sl@0
  4224
	CleanupStack::PopAndDestroy(2, sha1);
sl@0
  4225
	}
sl@0
  4226
sl@0
  4227
//
sl@0
  4228
// CopyFileToMMc
sl@0
  4229
//
sl@0
  4230
// Copy a file to the MMC card and create a hash of it.
sl@0
  4231
//
sl@0
  4232
sl@0
  4233
TInt CopyFileToMMc(RFs& aFs,CFileMan* aFileMan, TPtrC aPath, TPtrC  aOldFilename, TPtrC  aNewFilename)
sl@0
  4234
	{
sl@0
  4235
	TInt retVal = aFs.MkDirAll(aPath);
sl@0
  4236
	RUNTEST1(retVal==KErrNone || retVal==KErrAlreadyExists);
sl@0
  4237
sl@0
  4238
	TFileName newPath;
sl@0
  4239
	TFileName oldPath;
sl@0
  4240
sl@0
  4241
	oldPath.Format(_L("%S%S"),&KRomPath, &aOldFilename);
sl@0
  4242
	newPath.Format(_L("%S%S"),&aPath, &aNewFilename);
sl@0
  4243
	DBGD_PRINT((_L("Copying %S to %S\n"), &oldPath, &newPath));
sl@0
  4244
	retVal = aFileMan->Copy(oldPath, newPath, CFileMan::EOverWrite);
sl@0
  4245
	if (retVal == KErrNone)
sl@0
  4246
		{
sl@0
  4247
		retVal = aFileMan->Attribs(newPath, KEntryAttNormal, KEntryAttReadOnly, 0);
sl@0
  4248
		if (retVal != KErrNone)
sl@0
  4249
			{
sl@0
  4250
			DBGS_PRINT((_L("%S :   Attribs failed (%d)\n"), &newPath, retVal));
sl@0
  4251
			}
sl@0
  4252
		TEntry  anEntry;
sl@0
  4253
		retVal = aFs.Entry(newPath, anEntry);
sl@0
  4254
		if (retVal != KErrNone)
sl@0
  4255
			{
sl@0
  4256
			DBGS_PRINT((_L("%S : aFs.Entry failed (%d)\n"), &newPath, retVal));
sl@0
  4257
			}
sl@0
  4258
		TRAPD(r, HashFile(newPath, aFs));
sl@0
  4259
		RUNTEST1(r == KErrNone);
sl@0
  4260
		}
sl@0
  4261
	else
sl@0
  4262
		DBGS_PRINT((_L("Failed to copy file %d\n"), retVal));
sl@0
  4263
	DBGD_PRINT((_L("%S : now %S (%d)\n"), &newPath, EXISTS(retVal), retVal));
sl@0
  4264
	return retVal;
sl@0
  4265
	}
sl@0
  4266
sl@0
  4267
//
sl@0
  4268
// CopyAndFragmentFiles
sl@0
  4269
//
sl@0
  4270
// Copy the test files to a specified location edeavouring to fragment as much as possible.
sl@0
  4271
//
sl@0
  4272
sl@0
  4273
TBool CopyAndFragmentFiles(RFs& aFs,CFileMan* aFileMan, TPtrC aPath, ETestMediaType aMediaType)
sl@0
  4274
	{
sl@0
  4275
	TInt retVal = aFs.MkDirAll(aPath);
sl@0
  4276
	RUNTEST1(retVal==KErrNone || retVal==KErrAlreadyExists);
sl@0
  4277
#define FILECOUNTMAX (PAGELDRTST_MAX_DLLS + 2)
sl@0
  4278
	RFile	theInFiles[FILECOUNTMAX];
sl@0
  4279
	RFile	theOutFiles[FILECOUNTMAX];
sl@0
  4280
	TInt	inFileSize[FILECOUNTMAX];
sl@0
  4281
	TInt	inFilePos[FILECOUNTMAX];
sl@0
  4282
	TBool	fileOk[FILECOUNTMAX];
sl@0
  4283
sl@0
  4284
	TInt	  index;
sl@0
  4285
	TFileName newPath;
sl@0
  4286
	TFileName oldPath;
sl@0
  4287
sl@0
  4288
	for (index = 0; index < FILECOUNTMAX; index ++)
sl@0
  4289
		{
sl@0
  4290
		inFileSize[index] = 0;
sl@0
  4291
		inFilePos[index] = 0;
sl@0
  4292
		fileOk[index] = EFalse;
sl@0
  4293
sl@0
  4294
		if (index < PAGELDRTST_MAX_DLLS)
sl@0
  4295
			{
sl@0
  4296
			oldPath.Format(_L("%S%S%d%S"), &KRomPath, &KDllBaseName, index, &TestPlExtNames[KTestMediaBase]);
sl@0
  4297
			newPath.Format(_L("%S%S%d%S"), &aPath, &KDllBaseName, index, &TestPlExtNames[aMediaType]);
sl@0
  4298
			}
sl@0
  4299
		else if (index < (PAGELDRTST_MAX_DLLS + 1))
sl@0
  4300
			{
sl@0
  4301
			oldPath.Format(_L("%S%S"), &KRomPath, &TestPsExeNames[KTestMediaBase]);
sl@0
  4302
			newPath.Format(_L("%S%S"), &aPath, &TestPsExeNames[aMediaType]);
sl@0
  4303
			}
sl@0
  4304
		else
sl@0
  4305
			{
sl@0
  4306
			oldPath.Format(_L("%S%S"), &KRomPath, &TestPlExeNames[KTestMediaBase]);
sl@0
  4307
			newPath.Format(_L("%S%S"), &aPath, &TestPlExeNames[aMediaType]);
sl@0
  4308
			}
sl@0
  4309
sl@0
  4310
		retVal = theInFiles[index].Open(aFs, oldPath, EFileRead);
sl@0
  4311
		if (retVal != KErrNone)
sl@0
  4312
			{
sl@0
  4313
			DBGS_PRINT((_L("%S : Failed to open for read (%d)\n"), &oldPath, retVal));
sl@0
  4314
			break;
sl@0
  4315
			}
sl@0
  4316
		retVal = theInFiles[index].Size(inFileSize[index]);
sl@0
  4317
		if (retVal != KErrNone)
sl@0
  4318
			{
sl@0
  4319
			theInFiles[index].Close();
sl@0
  4320
			DBGS_PRINT((_L("%S : Failed to get file size (%d)\n"), &newPath, retVal));
sl@0
  4321
			break;
sl@0
  4322
			}
sl@0
  4323
		retVal = theOutFiles[index].Replace(aFs, newPath, EFileWrite);
sl@0
  4324
		if (retVal != KErrNone)
sl@0
  4325
			{
sl@0
  4326
			theInFiles[index].Close();
sl@0
  4327
			DBGS_PRINT((_L("%S : Failed to open for write (%d)\n"), &newPath, retVal));
sl@0
  4328
			break;
sl@0
  4329
			}
sl@0
  4330
sl@0
  4331
		fileOk[index] = ETrue;
sl@0
  4332
		}
sl@0
  4333
sl@0
  4334
	const TInt KBufferSize = 3333;
sl@0
  4335
	TBuf8<KBufferSize> buffer;
sl@0
  4336
	TBool stillGoing;
sl@0
  4337
sl@0
  4338
	do
sl@0
  4339
		{
sl@0
  4340
		stillGoing = EFalse;
sl@0
  4341
		for (index = 0; index < FILECOUNTMAX; index ++)
sl@0
  4342
			{
sl@0
  4343
			if (!fileOk[index])
sl@0
  4344
				break;
sl@0
  4345
			if (inFilePos[index] < inFileSize[index])
sl@0
  4346
				{
sl@0
  4347
				retVal = theInFiles[index].Read(buffer);
sl@0
  4348
				if (retVal != KErrNone)
sl@0
  4349
					{
sl@0
  4350
					DBGS_PRINT((_L("theInFiles[%d] read failed (%d)\n"), index, retVal));
sl@0
  4351
					break;
sl@0
  4352
					}
sl@0
  4353
				retVal = theOutFiles[index].Write(buffer);
sl@0
  4354
				if (retVal != KErrNone)
sl@0
  4355
					{
sl@0
  4356
					DBGS_PRINT((_L("theOutFiles[%d] Write failed (%d)\n"), index, retVal));
sl@0
  4357
					break;
sl@0
  4358
					}
sl@0
  4359
				retVal = theOutFiles[index].Flush();
sl@0
  4360
				if (retVal != KErrNone)
sl@0
  4361
					{
sl@0
  4362
					DBGS_PRINT((_L("theOutFiles[%d] flush failed (%d)\n"), index, retVal));
sl@0
  4363
					break;
sl@0
  4364
					}
sl@0
  4365
				inFilePos[index] += buffer.Length();
sl@0
  4366
				if (inFilePos[index] < inFileSize[index])
sl@0
  4367
					stillGoing = ETrue;
sl@0
  4368
				}
sl@0
  4369
			}
sl@0
  4370
		}
sl@0
  4371
	while (stillGoing);
sl@0
  4372
sl@0
  4373
	TBool allOk = retVal == KErrNone;
sl@0
  4374
	for (index = 0; index < FILECOUNTMAX; index ++)
sl@0
  4375
		{
sl@0
  4376
		if (!fileOk[index])
sl@0
  4377
			{
sl@0
  4378
			allOk = EFalse;
sl@0
  4379
			break;
sl@0
  4380
			}
sl@0
  4381
		theInFiles[index].Close();
sl@0
  4382
		theOutFiles[index].Close();
sl@0
  4383
		if (index < PAGELDRTST_MAX_DLLS)
sl@0
  4384
			{
sl@0
  4385
			newPath.Format(_L("%S%S%d%S"), &aPath, &KDllBaseName, index, &TestPlExtNames[aMediaType]);
sl@0
  4386
			}
sl@0
  4387
		else if (index < (PAGELDRTST_MAX_DLLS + 1))
sl@0
  4388
			{
sl@0
  4389
			newPath.Format(_L("%S%S"), &aPath, &TestPsExeNames[aMediaType]);
sl@0
  4390
			}
sl@0
  4391
		else
sl@0
  4392
			{
sl@0
  4393
			newPath.Format(_L("%S%S"), &aPath, &TestPlExeNames[aMediaType]);
sl@0
  4394
			}
sl@0
  4395
sl@0
  4396
		retVal = aFileMan->Attribs(newPath, KEntryAttNormal, KEntryAttReadOnly, 0);
sl@0
  4397
		if (retVal != KErrNone)
sl@0
  4398
			{
sl@0
  4399
			DBGS_PRINT((_L("%S : Attribs failed (%d)\n"), &newPath, retVal));
sl@0
  4400
			allOk = EFalse;
sl@0
  4401
			}
sl@0
  4402
		TEntry  anEntry;
sl@0
  4403
		retVal = aFs.Entry(newPath, anEntry);
sl@0
  4404
		if (retVal != KErrNone)
sl@0
  4405
			{
sl@0
  4406
			DBGS_PRINT((_L("%S : aFs.Entry failed (%d)\n"), &newPath, retVal));
sl@0
  4407
			allOk = EFalse;
sl@0
  4408
			}
sl@0
  4409
		TRAPD(r, HashFile(newPath, aFs));
sl@0
  4410
		if (r != KErrNone)
sl@0
  4411
			{
sl@0
  4412
			allOk = EFalse;
sl@0
  4413
			}
sl@0
  4414
		DBGD_PRINT((_L("%S : %S!\n"), &newPath, EXISTS(!allOk)));
sl@0
  4415
		}
sl@0
  4416
	return allOk;
sl@0
  4417
	}
sl@0
  4418
sl@0
  4419
//
sl@0
  4420
// CheckFilePresence
sl@0
  4421
//
sl@0
  4422
// Checks all the files required for the test are present and copies some tests to the MMC card
sl@0
  4423
//
sl@0
  4424
sl@0
  4425
void CheckFilePresence(TBool aDoFileCopy)
sl@0
  4426
	{
sl@0
  4427
	TUint start = User::TickCount();
sl@0
  4428
sl@0
  4429
	RFs fs;
sl@0
  4430
	if (KErrNone != fs.Connect())
sl@0
  4431
		{
sl@0
  4432
		DBGS_PRINT(_L("CheckFilePresence : Can't connect to the FS\n"));
sl@0
  4433
		return ;
sl@0
  4434
		}
sl@0
  4435
sl@0
  4436
	TFileName filename;
sl@0
  4437
	TFileName newFilename;
sl@0
  4438
	TEntry anEntry;
sl@0
  4439
	TInt   index;
sl@0
  4440
	TInt   retVal;
sl@0
  4441
	TInt   dllIndex;
sl@0
  4442
sl@0
  4443
	// now we need to add the MMC files
sl@0
  4444
	TInt drvNum = FindMMCDriveNumber(fs);
sl@0
  4445
	TBuf<32>	mmcPath;
sl@0
  4446
	mmcPath.Format(_L("%S"),&KMmcDefaultPath);
sl@0
  4447
	if (drvNum >= 0)
sl@0
  4448
		mmcPath[0] = 'a' + drvNum;
sl@0
  4449
sl@0
  4450
	TBool	allOk;
sl@0
  4451
	//TInt  indexMax = aDoFileCopy ? KTestMediaMmc : KTestMediaCOUNT; 
sl@0
  4452
	for (index = 0; index < TEST_MEDIA_COUNT_HACK; index ++)
sl@0
  4453
		{
sl@0
  4454
		allOk = ETrue;	
sl@0
  4455
		filename.Format(_L("%S%S"),(index == KTestMediaMmc) ? & mmcPath : &KRomPath, &TestPsExeNames[index]);
sl@0
  4456
		if (KErrNone != fs.Entry(filename, anEntry))
sl@0
  4457
			allOk = EFalse;
sl@0
  4458
sl@0
  4459
		filename.Format(_L("%S%S"),(index == KTestMediaMmc) ? & mmcPath : &KRomPath, &TestPlExeNames[index]);
sl@0
  4460
		if (KErrNone != fs.Entry(filename, anEntry))
sl@0
  4461
			allOk = EFalse;
sl@0
  4462
sl@0
  4463
		for (dllIndex = 0; dllIndex < PAGELDRTST_MAX_DLLS; dllIndex ++)
sl@0
  4464
			{
sl@0
  4465
			filename.Format(_L("%S%S%d%S"), (index == KTestMediaMmc) ? & mmcPath : &KRomPath, &KDllBaseName, dllIndex, &TestPlExtNames[index]);
sl@0
  4466
			if (KErrNone != fs.Entry(filename, anEntry))
sl@0
  4467
				allOk = EFalse;
sl@0
  4468
			}
sl@0
  4469
		TestDllExesExist[index] = allOk;
sl@0
  4470
		DBGS_PRINT((_L("%S : %S!\n"), &TestPsExeNames[index], EXISTS(!TestDllExesExist[index])));
sl@0
  4471
		}
sl@0
  4472
	TInt nandDrvNum = FindFsNANDDrive(fs);
sl@0
  4473
	if (aDoFileCopy && (drvNum >= 0) && (nandDrvNum >= 0))
sl@0
  4474
		{
sl@0
  4475
		CTrapCleanup* cleanupStack = CTrapCleanup::New();
sl@0
  4476
		if(!cleanupStack)
sl@0
  4477
			DBGS_PRINT((_L("Cleanup stack failed\n")));	
sl@0
  4478
		CFileMan* pFileMan = NULL;
sl@0
  4479
		TRAP(retVal, pFileMan = CFileMan::NewL(fs));
sl@0
  4480
	
sl@0
  4481
		// First make a clean copy of the DLLs to the MMC card.
sl@0
  4482
		allOk = ETrue;			
sl@0
  4483
		if (KErrNone != CopyFileToMMc(fs, pFileMan, mmcPath, TestPsExeNames[KTestMediaBase], TestPsExeNames[KTestMediaMmc]))
sl@0
  4484
			allOk = EFalse;
sl@0
  4485
		if (KErrNone != CopyFileToMMc(fs, pFileMan, mmcPath, TestPlExeNames[KTestMediaBase], TestPlExeNames[KTestMediaMmc]))
sl@0
  4486
			allOk = EFalse;
sl@0
  4487
		for (dllIndex = 0; dllIndex < PAGELDRTST_MAX_DLLS; dllIndex ++)
sl@0
  4488
			{
sl@0
  4489
			filename.Format(_L("%S%d%S"), &KDllBaseName, dllIndex, &TestPlExtNames[KTestMediaBase]);
sl@0
  4490
			newFilename.Format(_L("%S%d%S"), &KDllBaseName, dllIndex, &TestPlExtNames[KTestMediaMmc]);
sl@0
  4491
			if (KErrNone != CopyFileToMMc(fs, pFileMan, mmcPath, filename, newFilename))
sl@0
  4492
				allOk = EFalse;
sl@0
  4493
			}
sl@0
  4494
		TestDllExesExist[KTestMediaMmc] = allOk;
sl@0
  4495
		DBGS_PRINT((_L("%S : %S! (Drive %c)\n"), &TestPsExeNames[index], EXISTS(!TestDllExesExist[index]), mmcPath[0]));
sl@0
  4496
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
  4497
		//now make some fragmented files on the MMC card.
sl@0
  4498
		TestDllExesExist[KTestMediaMmcFrag] = CopyAndFragmentFiles(fs, pFileMan, mmcPath, KTestMediaMmcFrag);
sl@0
  4499
		DBGS_PRINT((_L("%S : %S! (Drive %c)\n"), &TestPsExeNames[KTestMediaMmcFrag], EXISTS(!TestDllExesExist[KTestMediaMmcFrag]), mmcPath[0]));
sl@0
  4500
sl@0
  4501
		//now make some fragmented files on the NAND card.
sl@0
  4502
		if (nandDrvNum >= 0)
sl@0
  4503
			{
sl@0
  4504
			mmcPath[0] = 'a' + nandDrvNum;
sl@0
  4505
			TestDllExesExist[KTestMediaNandFrag] = CopyAndFragmentFiles(fs, pFileMan, mmcPath, KTestMediaNandFrag);
sl@0
  4506
			DBGS_PRINT((_L("%S : %S! (Drive %c)\n"), &TestPsExeNames[KTestMediaNandFrag], EXISTS(!TestDllExesExist[KTestMediaNandFrag]), mmcPath[0]));
sl@0
  4507
			}
sl@0
  4508
		else
sl@0
  4509
			DBGS_PRINT((_L("CheckFilePresence : Failed to get NAND drive number\n")));
sl@0
  4510
#endif // TEST_ADD_FRAGD_MEDIA
sl@0
  4511
		delete pFileMan; pFileMan = NULL;
sl@0
  4512
		delete cleanupStack; cleanupStack = NULL;
sl@0
  4513
		}
sl@0
  4514
sl@0
  4515
	fs.Close();
sl@0
  4516
sl@0
  4517
	TUint end = User::TickCount();
sl@0
  4518
	TUint time = TUint((TUint64)(end-start)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  4519
	DBGS_PRINT((_L("CheckFilePresence : %d secs elapsed\n"), time));
sl@0
  4520
	}
sl@0
  4521
sl@0
  4522
//
sl@0
  4523
// DoDeleteFile
sl@0
  4524
//
sl@0
  4525
// Delete a file and remove the hash
sl@0
  4526
//
sl@0
  4527
sl@0
  4528
void DoDeleteFile(CFileMan* aFileMan, TBool aSilent,TFileName& aFileName )
sl@0
  4529
	{
sl@0
  4530
	TFileName hashName;
sl@0
  4531
	RLoader l;
sl@0
  4532
	test(l.Connect() == KErrNone);
sl@0
  4533
sl@0
  4534
	DBGD_PRINT((_L("Deleting %S ...\n"), &aFileName));
sl@0
  4535
	if (!aSilent)
sl@0
  4536
		DBGD_PRINT((_L("Deleting %S\n"), &aFileName));
sl@0
  4537
	TInt retVal = aFileMan->Delete(aFileName);
sl@0
  4538
	if (retVal != KErrNone)
sl@0
  4539
		{
sl@0
  4540
		if (TestingReaper)
sl@0
  4541
			{
sl@0
  4542
			aFileMan->Attribs(aFileName, KEntryAttNormal, KEntryAttReadOnly, 0);
sl@0
  4543
			retVal = l.Delete(aFileName);
sl@0
  4544
			if (retVal != KErrNone)
sl@0
  4545
				{
sl@0
  4546
				DBGS_PRINT((_L("RLoader::Delete %S Failed %d\n"), &aFileName, retVal));
sl@0
  4547
				}
sl@0
  4548
			}
sl@0
  4549
		else
sl@0
  4550
			{
sl@0
  4551
			if (!aSilent)
sl@0
  4552
				DBGS_PRINT((_L("Deleting %S Failed %d\n"), &aFileName, retVal));
sl@0
  4553
			}
sl@0
  4554
		}
sl@0
  4555
	GetHashFileName(aFileName, hashName);
sl@0
  4556
	retVal = aFileMan->Delete(hashName);
sl@0
  4557
	if (retVal != KErrNone)
sl@0
  4558
		{
sl@0
  4559
		if (TestingReaper && (retVal == KErrInUse))
sl@0
  4560
			{
sl@0
  4561
			retVal = l.Delete(hashName);
sl@0
  4562
			if (retVal != KErrNone)
sl@0
  4563
				{
sl@0
  4564
				DBGS_PRINT((_L("RLoader::Delete %S Failed %d\n"), &hashName, retVal));
sl@0
  4565
				}
sl@0
  4566
			}
sl@0
  4567
		else
sl@0
  4568
			{
sl@0
  4569
			if (!aSilent)
sl@0
  4570
				DBGS_PRINT((_L("Deleting %S Failed %d\n"), &hashName, retVal));
sl@0
  4571
			}
sl@0
  4572
		}
sl@0
  4573
	l.Close();
sl@0
  4574
	}
sl@0
  4575
sl@0
  4576
//
sl@0
  4577
// CleanupFiles
sl@0
  4578
//
sl@0
  4579
// Remove any copied files and created directories.
sl@0
  4580
//
sl@0
  4581
sl@0
  4582
void CleanupFiles(TBool silent)
sl@0
  4583
	{
sl@0
  4584
	TUint start = User::TickCount();
sl@0
  4585
sl@0
  4586
	RFs fs;
sl@0
  4587
	if (KErrNone != fs.Connect())
sl@0
  4588
		{
sl@0
  4589
		DBGS_PRINT(_L("CleanupFiles : Can't connect to the FS\n"));
sl@0
  4590
		return ;
sl@0
  4591
		}
sl@0
  4592
sl@0
  4593
	CTrapCleanup* cleanupStack = CTrapCleanup::New();
sl@0
  4594
	if(!cleanupStack)
sl@0
  4595
		if (!silent)
sl@0
  4596
			DBGS_PRINT((_L("Cleanup stack failed\n")));	
sl@0
  4597
	
sl@0
  4598
	CFileMan* pFileMan = NULL;
sl@0
  4599
	TInt retVal;
sl@0
  4600
	TRAP(retVal, pFileMan = CFileMan::NewL(fs));
sl@0
  4601
	
sl@0
  4602
	TFileName newPath;
sl@0
  4603
	TInt index;
sl@0
  4604
	TInt dllIndex;
sl@0
  4605
sl@0
  4606
	TBuf<32>	path;
sl@0
  4607
	path.Format(_L("%S"),&KMmcDefaultPath);
sl@0
  4608
	TInt mmcDrvNum = FindMMCDriveNumber(fs);
sl@0
  4609
	TInt nandDrvNum = FindFsNANDDrive(fs);
sl@0
  4610
	for (index = KTestMediaMmc; index < KTestMediaCOUNT; index ++)
sl@0
  4611
		{
sl@0
  4612
#ifdef TEST_ADD_FRAGD_MEDIA
sl@0
  4613
		if (index == KTestMediaNandFrag)
sl@0
  4614
			{
sl@0
  4615
			if (nandDrvNum < 0)
sl@0
  4616
				continue;
sl@0
  4617
			path[0] = 'a' + nandDrvNum;
sl@0
  4618
			}
sl@0
  4619
		else
sl@0
  4620
			{
sl@0
  4621
			if (mmcDrvNum < 0)
sl@0
  4622
				continue;
sl@0
  4623
			path[0] = 'a' + mmcDrvNum;
sl@0
  4624
			}
sl@0
  4625
#else
sl@0
  4626
		path[0] = 'a' + mmcDrvNum;
sl@0
  4627
#endif
sl@0
  4628
		newPath.Format(_L("%S%S"),&path, &TestPsExeNames[index]);
sl@0
  4629
		DoDeleteFile(pFileMan, silent,  newPath);
sl@0
  4630
sl@0
  4631
		newPath.Format(_L("%S%S"),&path, &TestPlExeNames[index]);
sl@0
  4632
		DoDeleteFile(pFileMan, silent,  newPath);
sl@0
  4633
		
sl@0
  4634
		for (dllIndex = 0; dllIndex < PAGELDRTST_MAX_DLLS; dllIndex ++)
sl@0
  4635
			{
sl@0
  4636
			newPath.Format(_L("%S%S%d%S"), &path, &KDllBaseName, dllIndex, &TestPlExtNames[index]);
sl@0
  4637
			DoDeleteFile(pFileMan, silent,  newPath);
sl@0
  4638
			}
sl@0
  4639
		}
sl@0
  4640
	if (nandDrvNum >= 0)
sl@0
  4641
		{
sl@0
  4642
		path[0] = 'a' + nandDrvNum;
sl@0
  4643
		fs.RmDir(path);
sl@0
  4644
		}
sl@0
  4645
	if (mmcDrvNum >= 0)
sl@0
  4646
		{
sl@0
  4647
		path[0] = 'a' + mmcDrvNum;
sl@0
  4648
		fs.RmDir(path);
sl@0
  4649
		}
sl@0
  4650
sl@0
  4651
	delete pFileMan; pFileMan = NULL;
sl@0
  4652
	delete cleanupStack; cleanupStack = NULL;
sl@0
  4653
	fs.Close();
sl@0
  4654
	TUint end = User::TickCount();
sl@0
  4655
	TUint time = TUint((TUint64)(end-start)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  4656
	DBGS_PRINT((_L("CleanupFiles : %d secs elapsed\n"), time));
sl@0
  4657
	}
sl@0
  4658
sl@0
  4659
#ifdef _DEBUG
sl@0
  4660
sl@0
  4661
//
sl@0
  4662
// FindLocalDriveNumber
sl@0
  4663
//
sl@0
  4664
// Find the local drive
sl@0
  4665
//
sl@0
  4666
sl@0
  4667
TInt FindLocalDriveNumber(RFs &aFs, TInt aFsDrvNum)
sl@0
  4668
	{
sl@0
  4669
	RFile file;
sl@0
  4670
	TBuf<256> fileName;	
sl@0
  4671
	fileName.Append((TChar)('A' + aFsDrvNum));
sl@0
  4672
	fileName+=_L(":\\f32-tst\\");
sl@0
  4673
	TInt r=aFs.MkDirAll(fileName);
sl@0
  4674
	TInt locDriveNumber = -1;
sl@0
  4675
	if (r==KErrNone || r== KErrAlreadyExists)
sl@0
  4676
		{
sl@0
  4677
		fileName += _L("tempy.txt");
sl@0
  4678
		r=file.Replace(aFs,fileName,EFileWrite);
sl@0
  4679
		if (r!=KErrNone)
sl@0
  4680
			DBGS_PRINT((_L("FindLocalDriveNumber : Error %d: file '%S' could not be created\n"),r,&fileName));
sl@0
  4681
		RUNTEST1(r==KErrNone);
sl@0
  4682
		r=file.Write(_L8("Flies as big as sparrows indoletly buzzing in the warm air, heavy with the stench of rotting carcasses"));
sl@0
  4683
		if (r!=KErrNone)
sl@0
  4684
			{
sl@0
  4685
			DBGS_PRINT((_L("FindLocalDriveNumber : Error %d: could not write to file %d (%S)\n"),r,aFsDrvNum, &fileName));
sl@0
  4686
			}
sl@0
  4687
		else
sl@0
  4688
			{
sl@0
  4689
			// write caching may be enabled to flush the cache...
sl@0
  4690
			TRequestStatus flushStatus;
sl@0
  4691
			file.Flush(flushStatus);
sl@0
  4692
			User::WaitForRequest(flushStatus);
sl@0
  4693
			// get the block map
sl@0
  4694
			SBlockMapInfo info;
sl@0
  4695
			TInt64 start=0;
sl@0
  4696
			r=file.BlockMap(info, start, -1,ETestDebug);
sl@0
  4697
			if (r==KErrNone || r==KErrCompletion)
sl@0
  4698
				{
sl@0
  4699
				locDriveNumber=info.iLocalDriveNumber;
sl@0
  4700
				DBGD_PRINT((_L("FindLocalDriveNumber : locDriveNumber  %d\n"), locDriveNumber));
sl@0
  4701
				}
sl@0
  4702
			else
sl@0
  4703
				DBGS_PRINT((_L("FindLocalDriveNumber : Error %d: error getting blockmap for drive %d (%S)\n"),r,aFsDrvNum, &fileName));
sl@0
  4704
			}
sl@0
  4705
		aFs.Delete(fileName);
sl@0
  4706
		file.Close();
sl@0
  4707
		}
sl@0
  4708
	else
sl@0
  4709
		DBGS_PRINT((_L("FindLocalDriveNumber : Error %d: error creating dir	\n"),r));
sl@0
  4710
	return locDriveNumber;
sl@0
  4711
	}
sl@0
  4712
sl@0
  4713
//
sl@0
  4714
// ResetConcurrencyStats
sl@0
  4715
//
sl@0
  4716
// Reset the stats
sl@0
  4717
//
sl@0
  4718
sl@0
  4719
void ResetConcurrencyStats(RFs& aFs)
sl@0
  4720
	{
sl@0
  4721
	if(TestBootedFromMmc)
sl@0
  4722
		{
sl@0
  4723
		TInt fsDriveNum = FindMMCDriveNumber(aFs);
sl@0
  4724
		if (fsDriveNum >= 0)
sl@0
  4725
			{
sl@0
  4726
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4727
			if (locDriveNumber >= 0)
sl@0
  4728
				{
sl@0
  4729
				RUNTEST(PagingInfo::ResetConcurrency(locDriveNumber,EMediaPagingStatsRomAndCode),KErrNone);
sl@0
  4730
				}
sl@0
  4731
			else
sl@0
  4732
				DBGS_PRINT((_L("ResetConcurrencyStats MMC : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4733
			}
sl@0
  4734
		else
sl@0
  4735
			DBGS_PRINT((_L("ResetConcurrencyStats MMC : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4736
		}
sl@0
  4737
	else
sl@0
  4738
		{
sl@0
  4739
		TInt fsDriveNum = FindFsNANDDrive(aFs);
sl@0
  4740
		if (fsDriveNum >= 0)
sl@0
  4741
			{
sl@0
  4742
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4743
			if (locDriveNumber >= 0)
sl@0
  4744
				{
sl@0
  4745
				RUNTEST(PagingInfo::ResetConcurrency(locDriveNumber,EMediaPagingStatsRomAndCode),KErrNone);
sl@0
  4746
				}
sl@0
  4747
			else
sl@0
  4748
				DBGS_PRINT((_L("ResetConcurrencyStats NAND : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4749
			}
sl@0
  4750
		else
sl@0
  4751
			DBGS_PRINT((_L("ResetConcurrencyStats NAND : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4752
		}
sl@0
  4753
	}
sl@0
  4754
sl@0
  4755
//
sl@0
  4756
// ResetBenchmarks
sl@0
  4757
//
sl@0
  4758
// Reset the stats
sl@0
  4759
//
sl@0
  4760
sl@0
  4761
void ResetBenchmarks(RFs& aFs)
sl@0
  4762
	{
sl@0
  4763
	if(TestBootedFromMmc)
sl@0
  4764
		{
sl@0
  4765
		TInt fsDriveNum = FindMMCDriveNumber(aFs);
sl@0
  4766
		if (fsDriveNum >= 0)
sl@0
  4767
			{
sl@0
  4768
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4769
			if (locDriveNumber >= 0)
sl@0
  4770
				{
sl@0
  4771
				RUNTEST(PagingInfo::ResetBenchmarks(locDriveNumber,EMediaPagingStatsRomAndCode),KErrNone);
sl@0
  4772
				}
sl@0
  4773
			else
sl@0
  4774
				DBGS_PRINT((_L("ResetBenchmarks MMC : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4775
			}
sl@0
  4776
		else
sl@0
  4777
			DBGS_PRINT((_L("ResetBenchmarks MMC : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4778
		}
sl@0
  4779
	else
sl@0
  4780
		{
sl@0
  4781
		TInt fsDriveNum = FindFsNANDDrive(aFs);
sl@0
  4782
		if (fsDriveNum >= 0)
sl@0
  4783
			{
sl@0
  4784
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4785
			if (locDriveNumber >= 0)
sl@0
  4786
				{
sl@0
  4787
				RUNTEST(PagingInfo::ResetBenchmarks(locDriveNumber,EMediaPagingStatsRomAndCode),KErrNone);
sl@0
  4788
				}
sl@0
  4789
			else
sl@0
  4790
				DBGS_PRINT((_L("ResetBenchmarks NAND : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4791
			}
sl@0
  4792
		else
sl@0
  4793
			DBGS_PRINT((_L("ResetBenchmarks NAND : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4794
		}
sl@0
  4795
	}
sl@0
  4796
sl@0
  4797
//
sl@0
  4798
// DisplayConcurrencyStats
sl@0
  4799
//
sl@0
  4800
// Display the stats
sl@0
  4801
//
sl@0
  4802
sl@0
  4803
void DisplayConcurrencyStats(RFs& aFs)
sl@0
  4804
	{
sl@0
  4805
	if(TestBootedFromMmc)
sl@0
  4806
		{
sl@0
  4807
		TInt fsDriveNum = FindMMCDriveNumber(aFs);
sl@0
  4808
		if (fsDriveNum >= 0)
sl@0
  4809
			{
sl@0
  4810
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4811
			if (locDriveNumber >= 0)
sl@0
  4812
				{
sl@0
  4813
				DBGS_PRINT((_L("MMC stats\n")));
sl@0
  4814
				RUNTEST1(PagingInfo::PrintConcurrency(locDriveNumber,EMediaPagingStatsRomAndCode)==KErrNone);
sl@0
  4815
				}
sl@0
  4816
			else
sl@0
  4817
				DBGS_PRINT((_L("DisplayConcurrencyStats MMC : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4818
			}
sl@0
  4819
		else
sl@0
  4820
			DBGS_PRINT((_L("DisplayConcurrencyStats MMC : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4821
		}
sl@0
  4822
	else
sl@0
  4823
		{
sl@0
  4824
		TInt fsDriveNum = FindFsNANDDrive(aFs);
sl@0
  4825
		if (fsDriveNum >= 0)
sl@0
  4826
			{
sl@0
  4827
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4828
sl@0
  4829
			if (locDriveNumber >= 0)
sl@0
  4830
				{
sl@0
  4831
				DBGS_PRINT((_L("NAND stats\n")));
sl@0
  4832
				RUNTEST1(PagingInfo::PrintConcurrency(locDriveNumber,EMediaPagingStatsRomAndCode)==KErrNone);
sl@0
  4833
				}
sl@0
  4834
			else
sl@0
  4835
				DBGS_PRINT((_L("DisplayConcurrencyStats NAND : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4836
			}
sl@0
  4837
		else
sl@0
  4838
			DBGS_PRINT((_L("DisplayConcurrencyStats NAND : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4839
		}
sl@0
  4840
	}
sl@0
  4841
sl@0
  4842
void DisplayBenchmarks(RFs& aFs)
sl@0
  4843
	{
sl@0
  4844
	if(TestBootedFromMmc)
sl@0
  4845
		{
sl@0
  4846
		TInt fsDriveNum = FindMMCDriveNumber(aFs);
sl@0
  4847
		if (fsDriveNum >= 0)
sl@0
  4848
			{
sl@0
  4849
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4850
			if(locDriveNumber>=0)
sl@0
  4851
				{
sl@0
  4852
				DBGS_PRINT((_L("MMC benchmarks\n")));
sl@0
  4853
				RUNTEST1(PagingInfo::PrintBenchmarks(locDriveNumber,EMediaPagingStatsRomAndCode)==KErrNone);
sl@0
  4854
				}
sl@0
  4855
			else
sl@0
  4856
				DBGS_PRINT((_L("DisplayBenchmarks MMC : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4857
			}
sl@0
  4858
		else
sl@0
  4859
			DBGS_PRINT((_L("DisplayBenchmarks MMC : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4860
		}
sl@0
  4861
	else
sl@0
  4862
		{
sl@0
  4863
		TInt fsDriveNum = FindFsNANDDrive(aFs);
sl@0
  4864
		if (fsDriveNum >= 0)
sl@0
  4865
			{
sl@0
  4866
			TInt locDriveNumber = FindLocalDriveNumber(aFs, fsDriveNum);
sl@0
  4867
			if(locDriveNumber>=0)
sl@0
  4868
				{
sl@0
  4869
				DBGS_PRINT((_L("NAND benchmarks\n")));
sl@0
  4870
				RUNTEST1(PagingInfo::PrintBenchmarks(locDriveNumber,EMediaPagingStatsRomAndCode)==KErrNone);
sl@0
  4871
				}
sl@0
  4872
			else
sl@0
  4873
				DBGS_PRINT((_L("DisplayBenchmarks NAND : Failed to get locDriveNumber %d (%d)\n"), locDriveNumber, fsDriveNum));
sl@0
  4874
			}
sl@0
  4875
		else
sl@0
  4876
			DBGS_PRINT((_L("DisplayBenchmarks NAND : Failed to get fsDriveNum %d\n"), fsDriveNum));
sl@0
  4877
		}
sl@0
  4878
	}
sl@0
  4879
sl@0
  4880
#endif
sl@0
  4881
sl@0
  4882
void DoStats()
sl@0
  4883
	{
sl@0
  4884
	if (TestIsDemandPaged)
sl@0
  4885
		{
sl@0
  4886
		SVMCacheInfo  tempPages;
sl@0
  4887
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  4888
		DBGS_PRINT((_L("DPC : min %d max %d curr %d\n"), 
sl@0
  4889
					tempPages.iMinSize, tempPages.iMaxSize, tempPages.iCurrentSize));
sl@0
  4890
		DBGS_PRINT((_L("    : maxFree %d freeRam %d\n"),
sl@0
  4891
					tempPages.iMaxFreeSize, FreeRam()));
sl@0
  4892
		}
sl@0
  4893
sl@0
  4894
#ifdef _DEBUG
sl@0
  4895
	if (TestWeAreTheTestBase && !TestSilent)
sl@0
  4896
		{
sl@0
  4897
		RFs fs;
sl@0
  4898
		if (KErrNone != fs.Connect())
sl@0
  4899
			{
sl@0
  4900
			DBGS_PRINT(_L("ResetConcurrencyStats : Can't connect to the FS\n"));
sl@0
  4901
			return;
sl@0
  4902
			}
sl@0
  4903
sl@0
  4904
#ifndef TEST_MINIMAL_STATS
sl@0
  4905
		DisplayConcurrencyStats(fs);
sl@0
  4906
		DisplayBenchmarks(fs);
sl@0
  4907
#endif
sl@0
  4908
#ifndef TEST_DONT_RESET_STATS
sl@0
  4909
		ResetConcurrencyStats(fs);
sl@0
  4910
		ResetBenchmarks(fs);
sl@0
  4911
#endif
sl@0
  4912
		fs.Close();
sl@0
  4913
		}
sl@0
  4914
#endif
sl@0
  4915
	}
sl@0
  4916
sl@0
  4917
sl@0
  4918
//
sl@0
  4919
// E32Main
sl@0
  4920
//
sl@0
  4921
// Main entry point.
sl@0
  4922
//
sl@0
  4923
sl@0
  4924
TInt E32Main()
sl@0
  4925
	{
sl@0
  4926
#ifndef TEST_ON_UNPAGED
sl@0
  4927
	TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress();
sl@0
  4928
	if(!romHeader->iPageableRomStart)
sl@0
  4929
		{
sl@0
  4930
		TestIsDemandPaged = EFalse;
sl@0
  4931
		}
sl@0
  4932
#endif
sl@0
  4933
	// Turn off lazy dll unloading
sl@0
  4934
	RLoader l;
sl@0
  4935
	if (l.Connect() == KErrNone)
sl@0
  4936
		{
sl@0
  4937
		l.CancelLazyDllUnload();
sl@0
  4938
		l.Close();
sl@0
  4939
		}
sl@0
  4940
	
sl@0
  4941
	HAL::Get(HAL::ESystemTickPeriod, TickPeriod);
sl@0
  4942
sl@0
  4943
	SVMCacheInfo  tempPages;
sl@0
  4944
	memset(&tempPages, 0, sizeof(tempPages));
sl@0
  4945
sl@0
  4946
	TBool parseResult = ParseCommandLine();
sl@0
  4947
sl@0
  4948
	if (TestExit)
sl@0
  4949
		{
sl@0
  4950
		return KErrNone;
sl@0
  4951
		}
sl@0
  4952
sl@0
  4953
	TUint start = User::TickCount();
sl@0
  4954
	
sl@0
  4955
	AreWeTheTestBase();	
sl@0
  4956
sl@0
  4957
	if (TestIsDemandPaged)
sl@0
  4958
		{
sl@0
  4959
		TInt  minSize = TestMinCacheSize;
sl@0
  4960
		TInt  maxSize = TestMaxCacheSize;
sl@0
  4961
sl@0
  4962
		SVMCacheInfo  tempPages;
sl@0
  4963
sl@0
  4964
		// get the old cache info
sl@0
  4965
		UserSvr::HalFunction(EHalGroupVM,EVMHalGetCacheSize,&tempPages,0);
sl@0
  4966
		// set the cache to our test value
sl@0
  4967
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  4968
		}
sl@0
  4969
	if (!TestSilent)
sl@0
  4970
		{
sl@0
  4971
		test.Title();
sl@0
  4972
		test.Start(_L("Demand Paging loader stress tests..."));
sl@0
  4973
		test.Printf(_L("%S (%d)\n"), &TestNameBuffer, TestWeAreTheTestBase);
sl@0
  4974
		test.Printf(_L("TestBootedFromMmc %d\n"), TestBootedFromMmc);
sl@0
  4975
sl@0
  4976
		if (TestWeAreTheTestBase)
sl@0
  4977
			CleanupFiles(ETrue);
sl@0
  4978
sl@0
  4979
		CheckFilePresence(TestWeAreTheTestBase);
sl@0
  4980
		}
sl@0
  4981
sl@0
  4982
	if (parseResult)
sl@0
  4983
		{
sl@0
  4984
		if (TestLowMem)
sl@0
  4985
			{
sl@0
  4986
			DoLowMemTest(ETrue);
sl@0
  4987
			}
sl@0
  4988
		if (TestSingle)
sl@0
  4989
			{
sl@0
  4990
			RUNTEST(DoSingleTest(),KErrNone);
sl@0
  4991
			}
sl@0
  4992
		if (TestMultiple)
sl@0
  4993
			{
sl@0
  4994
			RUNTEST(DoMultipleTest(),KErrNone);
sl@0
  4995
			}
sl@0
  4996
		if (TestD_Exc)
sl@0
  4997
			{
sl@0
  4998
			RUNTEST(DoTestD_Exc(),KErrNone);
sl@0
  4999
			}
sl@0
  5000
		if (TestChunks)
sl@0
  5001
			{
sl@0
  5002
			DoChunkTests();
sl@0
  5003
			}
sl@0
  5004
		if (TestReaper)
sl@0
  5005
			{
sl@0
  5006
			DoReaperTests();
sl@0
  5007
			}
sl@0
  5008
		if (TestBtrace)
sl@0
  5009
			{
sl@0
  5010
			DoBtraceTest();
sl@0
  5011
			}
sl@0
  5012
		if (TestDefrag)
sl@0
  5013
			{
sl@0
  5014
			DoDefragTest();
sl@0
  5015
			}
sl@0
  5016
		}
sl@0
  5017
	else
sl@0
  5018
		{
sl@0
  5019
#ifdef _DEBUG
sl@0
  5020
		if (TestWeAreTheTestBase)
sl@0
  5021
			{
sl@0
  5022
			RFs fs;
sl@0
  5023
			if (KErrNone == fs.Connect())
sl@0
  5024
				{
sl@0
  5025
				//fs.SetDebugRegister(KCACHE);
sl@0
  5026
				ResetConcurrencyStats(fs);
sl@0
  5027
				ResetBenchmarks(fs);
sl@0
  5028
				fs.Close();
sl@0
  5029
				}
sl@0
  5030
			}
sl@0
  5031
#endif
sl@0
  5032
sl@0
  5033
		while (1)
sl@0
  5034
			{
sl@0
  5035
			if (TestIsDemandPaged)
sl@0
  5036
				{
sl@0
  5037
#ifdef TEST_RUN_AUTOTEST
sl@0
  5038
				PerformAutoTest();
sl@0
  5039
#endif //TEST_RUN_AUTOTEST
sl@0
  5040
sl@0
  5041
#ifndef	TEST_SHORT_TEST
sl@0
  5042
#ifdef TEST_RUN_LOWMEMTEST
sl@0
  5043
				DoLowMemTest(ETrue);
sl@0
  5044
#endif //TEST_RUN_LOWMEMTEST
sl@0
  5045
#ifdef TEST_RUN_CHUNKTEST
sl@0
  5046
				DoChunkTests();
sl@0
  5047
#endif //TEST_RUN_CHUNKTEST
sl@0
  5048
#ifdef TEST_RUN_REAPERTEST
sl@0
  5049
				DoReaperTests();
sl@0
  5050
#endif //TEST_RUN_REAPERTEST
sl@0
  5051
#endif //TEST_SHORT_TEST
sl@0
  5052
				}
sl@0
  5053
sl@0
  5054
#ifdef TEST_RUN_DEFRAGTEST
sl@0
  5055
			DoDefragTest();
sl@0
  5056
#endif //TEST_RUN_DEFRAGTEST
sl@0
  5057
sl@0
  5058
			if (TestStressFree)
sl@0
  5059
				{
sl@0
  5060
				TInt minSize = 512 * 4096;
sl@0
  5061
				TInt maxSize = 32767 * 4096;
sl@0
  5062
				UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  5063
sl@0
  5064
				test.Printf(_L("%S Stress Free!!\n"), &TestNameBuffer, TestWeAreTheTestBase);
sl@0
  5065
				TestStressFree = EFalse;
sl@0
  5066
				}
sl@0
  5067
			else
sl@0
  5068
				{
sl@0
  5069
				break;
sl@0
  5070
				}
sl@0
  5071
			}
sl@0
  5072
sl@0
  5073
#ifndef TEST_SHORT_TEST
sl@0
  5074
#ifndef TEST_NO_DEXC_IN_AUTO
sl@0
  5075
#ifdef TEST_RUN_D_EXCTEST
sl@0
  5076
		RUNTEST(DoTestD_Exc(),KErrNone);
sl@0
  5077
#endif //TEST_RUN_D_EXCTEST
sl@0
  5078
#endif //TEST_NO_DEXC_IN_AUTO
sl@0
  5079
		if (TestWeAreTheTestBase && TestFullAutoTest && TestIsDemandPaged)
sl@0
  5080
			{
sl@0
  5081
			RProcess		theProcess;
sl@0
  5082
			TRequestStatus	status;
sl@0
  5083
sl@0
  5084
			TInt retVal = theProcess.Create(_L("t_pageldrtst_rom.exe"),_L("fullauto"));
sl@0
  5085
			if (retVal != KErrNotFound)
sl@0
  5086
				{
sl@0
  5087
				RUNTEST1(KErrNone == retVal);
sl@0
  5088
				theProcess.Logon(status);
sl@0
  5089
				RUNTEST1(status == KRequestPending);	
sl@0
  5090
				theProcess.Resume();
sl@0
  5091
#ifdef TEST_THRASHING_TEST
sl@0
  5092
				while (1)
sl@0
  5093
					{
sl@0
  5094
					if (theProcess.ExitType() != EExitPending)
sl@0
  5095
						{
sl@0
  5096
						RUNTEST1(theProcess.ExitType() != EExitPanic);
sl@0
  5097
						break;
sl@0
  5098
						}
sl@0
  5099
					User::AfterHighRes(1);
sl@0
  5100
					}
sl@0
  5101
				User::WaitForRequest(status);
sl@0
  5102
#else
sl@0
  5103
				User::WaitForRequest(status);
sl@0
  5104
				if (theProcess.ExitType() != EExitPending)
sl@0
  5105
					{
sl@0
  5106
					RUNTEST1(theProcess.ExitType() != EExitPanic);
sl@0
  5107
					}
sl@0
  5108
#endif //TEST_THRASHING_TEST
sl@0
  5109
				theProcess.Close();
sl@0
  5110
				}
sl@0
  5111
			}
sl@0
  5112
#endif //TEST_SHORT_TEST
sl@0
  5113
#ifdef _DEBUG
sl@0
  5114
		if (TestWeAreTheTestBase && !TestSilent)
sl@0
  5115
			{
sl@0
  5116
			RFs fs;
sl@0
  5117
			if (KErrNone == fs.Connect())
sl@0
  5118
				{
sl@0
  5119
				DisplayConcurrencyStats(fs);
sl@0
  5120
				DisplayBenchmarks(fs);
sl@0
  5121
				fs.Close();
sl@0
  5122
				}
sl@0
  5123
			}
sl@0
  5124
#endif
sl@0
  5125
		}
sl@0
  5126
sl@0
  5127
	if (TestWeAreTheTestBase && !TestNoClean)
sl@0
  5128
		CleanupFiles(EFalse);
sl@0
  5129
sl@0
  5130
	if (TestIsDemandPaged)
sl@0
  5131
		{
sl@0
  5132
		TInt minSize = tempPages.iMinSize;
sl@0
  5133
		TInt maxSize = tempPages.iMaxSize;
sl@0
  5134
		// put the cache back to the the original values.
sl@0
  5135
		UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
sl@0
  5136
		}
sl@0
  5137
	if (!TestSilent)
sl@0
  5138
		{
sl@0
  5139
		TUint end = User::TickCount();
sl@0
  5140
		TUint time = TUint((TUint64)(end-start)*(TUint64)TickPeriod/(TUint64)1000000);
sl@0
  5141
		test.Printf(_L("%S : Complete (%u seconds)\n"), &TestNameBuffer, time);	
sl@0
  5142
		test.End();
sl@0
  5143
		}
sl@0
  5144
	return KErrNone;
sl@0
  5145
	}