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 |