kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp
changeset 176 af6ec97d9189
parent 132 e4a7b1cbe40c
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp	Wed Jun 23 11:59:44 2010 +0100
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp	Wed Jun 23 12:52:28 2010 +0100
@@ -115,14 +115,14 @@
 	RamAllocLock::Lock();
 
 	// Move the page to any RAM zone.
-	r = M::MovePage(aOld, aNew, KRamZoneInvalidId, EFalse);
+	r = M::MovePage(aOld, aNew, KRamZoneInvalidId, 0);
 
 	RamAllocLock::Unlock();
 	return r;
 	}
 
 
-TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest)
+TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
 	// Returns this when page is not paged or managed or free but is a real RAM page.
 	TInt r = KErrNotSupported;
@@ -130,26 +130,22 @@
 	// get memory object corresponding to the page...
 	DMemoryObject* memory = 0;
 	MmuLock::Lock();
-	SPageInfo* pi = SPageInfo::SafeFromPhysAddr(aOld&~KPageMask);
-	if(pi)
+	SPageInfo* pi = SPageInfo::SafeFromPhysAddr(aOld & ~KPageMask);
+	if (pi)
 		{
 		if (pi->PagedState() != SPageInfo::EUnpaged)
 			{// The page is paged so let the pager handle it.
-			return ThePager.DiscardPage(pi, aBlockZoneId, aBlockRest);
+			return ThePager.DiscardPage(pi, aBlockZoneId, aMoveDisFlags);
 			}
 		switch (pi->Type())
 			{
 			case SPageInfo::EManaged:
 				memory = pi->Owner();
-				// Note, whilst we hold the RamAllocLock the page can't change it's use
-				// and we can safely assume that it still belongs to the memory object
-				// at a fixed page index.
-				// Also, as memory objects can't be destroyed whilst they still own pages
-				// we can safely access this object without taking an explicit reference,
-				// i.e. we don't need to Open() the memory object.
-				MmuLock::Unlock();
-				// move page...
-				r = memory->iManager->MovePage(memory, pi, aNew, aBlockZoneId, aBlockRest);
+				memory->Open();
+				// move page, this will release the mmu lock.
+				r = memory->iManager->MovePage(	memory, pi, aNew, aBlockZoneId, 
+												(aMoveDisFlags & M::EMoveDisBlockRest)!=0);
+				memory->AsyncClose();
 				break;
 			case SPageInfo::EUnused:
 				r = KErrNotFound;	// This page is free so nothing to do.
@@ -186,15 +182,10 @@
 			{
 			case SPageInfo::EManaged:
 				memory = pi->Owner();
-				// Note, whilst we hold the RamAllocLock the page can't change it's use
-				// and we can safely assume that it still belongs to the memory object
-				// at a fixed page index.
-				// Also, as memory objects can't be destroyed whilst they still own pages
-				// we can safely access this object without taking an explicit referernce,
-				// i.e. we don't need to Open() the memory object.
-				MmuLock::Unlock();
-				// move page...
+				memory->Open();
+				// move page, this will release the mmu lock.
 				r = memory->iManager->MoveAndAllocPage(memory, pi, aPageType);
+				memory->AsyncClose();
 				break;
 			case SPageInfo::EUnused:
 				r = KErrNone;	// This page is free so nothing to do.