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; |