diff -r 2bb754abd467 -r 0ffb4e86fcc9 kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp --- a/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp Mon Jun 21 17:12:14 2010 +0300 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp Thu Jul 15 20:11:42 2010 +0300 @@ -929,16 +929,16 @@ if (!DiscardCanStealPage(aOldPageInfo, moveDirty)) { + // Page must be managed if it is pinned or dirty. + __NK_ASSERT_DEBUG(aOldPageInfo->Type()==SPageInfo::EManaged); // The page is pinned or is dirty and this is a general defrag so move the page. DMemoryObject* memory = aOldPageInfo->Owner(); - // Page must be managed if it is pinned or dirty. - __NK_ASSERT_DEBUG(aOldPageInfo->Type()==SPageInfo::EManaged); - __NK_ASSERT_DEBUG(memory); - MmuLock::Unlock(); + memory->Open(); TPhysAddr newAddr; TRACE2(("DPager::DiscardPage delegating pinned/dirty page to manager")); TInt r = memory->iManager->MovePage(memory, aOldPageInfo, newAddr, aBlockZoneId, blockRest); TRACE(("< DPager::DiscardPage %d", r)); + memory->AsyncClose(); return r; } @@ -1035,17 +1035,15 @@ AddAsFreePage(newPageInfo); else ReturnPageToSystem(*newPageInfo); // temporarily releases MmuLock - } + } + MmuLock::Unlock(); if (havePageCleaningLock) { // Release the page cleaning mutex - MmuLock::Unlock(); PageCleaningLock::Unlock(); - MmuLock::Lock(); - } - - MmuLock::Unlock(); + } + TRACE(("< DPager::DiscardPage returns %d", r)); return r; }