kerneltest/e32test/mmu/t_cachechunk.cpp
branchRCL_3
changeset 97 41f0cfe18c80
parent 0 a41df078684a
child 176 af6ec97d9189
equal deleted inserted replaced
89:1df514389a47 97:41f0cfe18c80
    96 TUint8* TestChunkBase;
    96 TUint8* TestChunkBase;
    97 TInt CommitEnd;
    97 TInt CommitEnd;
    98 TInt PageSize;
    98 TInt PageSize;
    99 TInt NoFreeRam;
    99 TInt NoFreeRam;
   100 RTimer Timer;
   100 RTimer Timer;
   101 
   101 TBool gFmm;
   102 
   102 
   103 
   103 
   104 void FillPage(TUint aOffset)
   104 void FillPage(TUint aOffset)
   105 	{
   105 	{
   106 	TUint8* ptr = TestChunkBase+aOffset;
   106 	TUint8* ptr = TestChunkBase+aOffset;
   306 	test_Equal(origChunkSize - PageSize*4, TestChunk.Size());
   306 	test_Equal(origChunkSize - PageSize*4, TestChunk.Size());
   307 	r = TestChunk.Commit(aOffset, PageSize*4);
   307 	r = TestChunk.Commit(aOffset, PageSize*4);
   308 	test_KErrNone(r);
   308 	test_KErrNone(r);
   309 
   309 
   310 	test.Next(_L("Check Decommit on unlocked pages"));
   310 	test.Next(_L("Check Decommit on unlocked pages"));
       
   311 	// Get orignal page cache size
       
   312 	TUint minCache = 0;
       
   313 	TUint maxCache = 0;
       
   314 	TUint oldCache = 0;
       
   315 	TUint newCache = 0;
       
   316 	if (gFmm)
       
   317 		{
       
   318 		r = DPTest::CacheSize(minCache, maxCache, oldCache);
       
   319 		test_KErrNone(r);
       
   320 		}
   311 	r = TestChunk.Unlock(aOffset,PageSize*4);
   321 	r = TestChunk.Unlock(aOffset,PageSize*4);
   312 	test_KErrNone(r);
   322 	test_KErrNone(r);
       
   323 
       
   324 	TUint spareCache = maxCache - oldCache;
       
   325 	if (gFmm && spareCache)
       
   326 		{// Cache wasn't at maximum so should have grown when unlocked pages were added.
       
   327 		r = DPTest::CacheSize(minCache, maxCache, newCache);
       
   328 		test_KErrNone(r);
       
   329 		TUint extraCache = (spareCache > (TUint)PageSize*4)? PageSize*4 : spareCache;
       
   330 		test_Equal(oldCache + extraCache, newCache);
       
   331 		}
   313 	test(FreeRam() >= NoFreeRam+PageSize*4);
   332 	test(FreeRam() >= NoFreeRam+PageSize*4);
   314 	r=TestChunk.Decommit(aOffset, PageSize*4);
   333 	r=TestChunk.Decommit(aOffset, PageSize*4);
   315 	test_KErrNone(r);
   334 	test_KErrNone(r);
   316 	freeRam = FreeRam();
   335 	freeRam = FreeRam();
   317 	test_Compare(freeRam, >=, NoFreeRam+PageSize*4);
   336 	test_Compare(freeRam, >=, NoFreeRam+PageSize*4);
   318 	test_Equal(origChunkSize - PageSize*4, TestChunk.Size());
   337 	test_Equal(origChunkSize - PageSize*4, TestChunk.Size());
       
   338 
       
   339 	if (gFmm)
       
   340 		{// Cache should have shrunk after pages were decommited.
       
   341 		r = DPTest::CacheSize(minCache, maxCache, newCache);
       
   342 		test_KErrNone(r);
       
   343 		test_Equal(oldCache, newCache);
       
   344 		}
   319 	// Restore chunk back to original state
   345 	// Restore chunk back to original state
   320 	r = TestChunk.Commit(aOffset, PageSize*4);
   346 	r = TestChunk.Commit(aOffset, PageSize*4);
   321 	test_KErrNone(r);
   347 	test_KErrNone(r);
   322 	test(FreeRam() == NoFreeRam);
   348 	test_Equal(NoFreeRam, FreeRam());
   323 
   349 
   324 	test.Next(_L("Check Decommit on unlocked and reclaimed pages"));
   350 	test.Next(_L("Check Decommit on unlocked and reclaimed pages"));
   325 	r = TestChunk.Unlock(aOffset,PageSize*4);
   351 	r = TestChunk.Unlock(aOffset,PageSize*4);
   326 	test_KErrNone(r);
   352 	test_KErrNone(r);
   327 	freeRam = FreeRam();
   353 	freeRam = FreeRam();
   348 		FillPage(offset);
   374 		FillPage(offset);
   349 		}
   375 		}
   350 	freeRam = FreeRam();
   376 	freeRam = FreeRam();
   351 	test(freeRam==NoFreeRam);
   377 	test(freeRam==NoFreeRam);
   352 	test_Equal(origChunkSize, TestChunk.Size());
   378 	test_Equal(origChunkSize, TestChunk.Size());
       
   379 
       
   380 	test.Next(_L("Check Decommit on a mixture of locked and unlocked pages"));
       
   381 	// Get orignal page cache size
       
   382 	if (gFmm)
       
   383 		{
       
   384 		r = DPTest::CacheSize(minCache, maxCache, oldCache);
       
   385 		test_KErrNone(r);
       
   386 		}
       
   387 	r = TestChunk.Unlock(aOffset,PageSize);
       
   388 	test_KErrNone(r);
       
   389 	r = TestChunk.Unlock(aOffset + PageSize*2, PageSize);
       
   390 	test_KErrNone(r);
       
   391 
       
   392 	spareCache = maxCache - oldCache;
       
   393 	if (gFmm && spareCache)
       
   394 		{// Cache wasn't at maximum so should have grown when unlocked pages were added.
       
   395 		r = DPTest::CacheSize(minCache, maxCache, newCache);
       
   396 		test_KErrNone(r);
       
   397 		TUint extraCache = (spareCache > (TUint)PageSize*2)? PageSize*2 : spareCache;
       
   398 		test_Equal(oldCache + extraCache, newCache);
       
   399 		}
       
   400 	test(FreeRam() >= NoFreeRam+PageSize*2);
       
   401 	r=TestChunk.Decommit(aOffset, PageSize*4);
       
   402 	test_KErrNone(r);
       
   403 	freeRam = FreeRam();
       
   404 	test_Compare(freeRam, >=, NoFreeRam+PageSize*4);
       
   405 	test_Equal(origChunkSize - PageSize*4, TestChunk.Size());
       
   406 
       
   407 	if (gFmm)
       
   408 		{// Cache should have shrunk after pages were decommited.
       
   409 		r = DPTest::CacheSize(minCache, maxCache, newCache);
       
   410 		test_KErrNone(r);
       
   411 		test_Equal(oldCache, newCache);
       
   412 		}
       
   413 	// Restore chunk back to original state
       
   414 	r = TestChunk.Commit(aOffset, PageSize*4);
       
   415 	test_KErrNone(r);
       
   416 	test_Equal(NoFreeRam, FreeRam());
   353 
   417 
   354 	test.End();
   418 	test.End();
   355 	}
   419 	}
   356 
   420 
   357 
   421 
   448 	if (!HaveVirtMem())
   512 	if (!HaveVirtMem())
   449 		{
   513 		{
   450 		test.Printf(_L("This test requires an MMU\n"));
   514 		test.Printf(_L("This test requires an MMU\n"));
   451 		return KErrNone;
   515 		return KErrNone;
   452 		}
   516 		}
       
   517 	// See if were running on the Flexible Memory Model or newer.
       
   518   	TUint32 memModelAttrib = (TUint32)UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemModelInfo, NULL, NULL);	
       
   519 	gFmm = (memModelAttrib & EMemModelTypeMask) >= EMemModelTypeFlexible;
       
   520 
   453 	test.Start(_L("Initialise test"));
   521 	test.Start(_L("Initialise test"));
   454 	test.Next(_L("Load gobbler LDD"));
   522 	test.Next(_L("Load gobbler LDD"));
   455 	TInt r = User::LoadLogicalDevice(KGobblerLddFileName);
   523 	TInt r = User::LoadLogicalDevice(KGobblerLddFileName);
   456 	test(r==KErrNone || r==KErrAlreadyExists);
   524 	test(r==KErrNone || r==KErrAlreadyExists);
   457 	RGobbler gobbler;
   525 	RGobbler gobbler;