kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp
branchRCL_3
changeset 41 0ffb4e86fcc9
parent 39 2bb754abd467
child 43 c1f20ce4abcf
equal deleted inserted replaced
39:2bb754abd467 41:0ffb4e86fcc9
   927 	TBool moveDirty = (aMoveDisFlags & M::EMoveDisMoveDirty) != 0;
   927 	TBool moveDirty = (aMoveDisFlags & M::EMoveDisMoveDirty) != 0;
   928 	TBool blockRest = (aMoveDisFlags & M::EMoveDisBlockRest) != 0;
   928 	TBool blockRest = (aMoveDisFlags & M::EMoveDisBlockRest) != 0;
   929 
   929 
   930 	if (!DiscardCanStealPage(aOldPageInfo, moveDirty))
   930 	if (!DiscardCanStealPage(aOldPageInfo, moveDirty))
   931 		{
   931 		{
       
   932 		// Page must be managed if it is pinned or dirty.
       
   933 		__NK_ASSERT_DEBUG(aOldPageInfo->Type()==SPageInfo::EManaged);
   932 		// The page is pinned or is dirty and this is a general defrag so move the page.
   934 		// The page is pinned or is dirty and this is a general defrag so move the page.
   933 		DMemoryObject* memory = aOldPageInfo->Owner();
   935 		DMemoryObject* memory = aOldPageInfo->Owner();
   934 		// Page must be managed if it is pinned or dirty.
   936 		memory->Open();
   935 		__NK_ASSERT_DEBUG(aOldPageInfo->Type()==SPageInfo::EManaged);
       
   936 		__NK_ASSERT_DEBUG(memory);
       
   937 		MmuLock::Unlock();
       
   938 		TPhysAddr newAddr;
   937 		TPhysAddr newAddr;
   939 		TRACE2(("DPager::DiscardPage delegating pinned/dirty page to manager"));
   938 		TRACE2(("DPager::DiscardPage delegating pinned/dirty page to manager"));
   940 		TInt r = memory->iManager->MovePage(memory, aOldPageInfo, newAddr, aBlockZoneId, blockRest);
   939 		TInt r = memory->iManager->MovePage(memory, aOldPageInfo, newAddr, aBlockZoneId, blockRest);
   941 		TRACE(("< DPager::DiscardPage %d", r));
   940 		TRACE(("< DPager::DiscardPage %d", r));
       
   941 		memory->AsyncClose();
   942 		return r;
   942 		return r;
   943 		}
   943 		}
   944 
   944 
   945 	TInt r = KErrNone;
   945 	TInt r = KErrNone;
   946 	SPageInfo* newPageInfo = NULL;
   946 	SPageInfo* newPageInfo = NULL;
  1033 		// else can touch it.
  1033 		// else can touch it.
  1034 		if (iNumberOfFreePages == 0)
  1034 		if (iNumberOfFreePages == 0)
  1035 			AddAsFreePage(newPageInfo);
  1035 			AddAsFreePage(newPageInfo);
  1036 		else
  1036 		else
  1037 			ReturnPageToSystem(*newPageInfo);   // temporarily releases MmuLock
  1037 			ReturnPageToSystem(*newPageInfo);   // temporarily releases MmuLock
  1038 		}
  1038 		}	
       
  1039 	MmuLock::Unlock();
  1039 
  1040 
  1040 	if (havePageCleaningLock)
  1041 	if (havePageCleaningLock)
  1041 		{
  1042 		{
  1042 		// Release the page cleaning mutex
  1043 		// Release the page cleaning mutex
  1043 		MmuLock::Unlock();
       
  1044 		PageCleaningLock::Unlock();
  1044 		PageCleaningLock::Unlock();
  1045 		MmuLock::Lock();
  1045 		}
  1046 		}	
  1046 
  1047 	
       
  1048 	MmuLock::Unlock();
       
  1049 	TRACE(("< DPager::DiscardPage returns %d", r));
  1047 	TRACE(("< DPager::DiscardPage returns %d", r));
  1050 	return r;	
  1048 	return r;	
  1051 	}
  1049 	}
  1052 
  1050 
  1053 
  1051