Removed PageWriteWrapper::CheckRemoveFromShrunkenCache() and moved removing

the page to Done().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35474 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2010-02-15 18:47:45 +00:00
parent a05e4ed330
commit b0f5b17072
+4 -32
View File
@@ -1355,7 +1355,6 @@ public:
~PageWriteWrapper(); ~PageWriteWrapper();
void SetTo(vm_page* page, bool dequeuedPage); void SetTo(vm_page* page, bool dequeuedPage);
void ClearModifiedFlag(); void ClearModifiedFlag();
void CheckRemoveFromShrunkenCache();
void Done(status_t result); void Done(status_t result);
private: private:
@@ -1422,19 +1421,6 @@ PageWriteWrapper::ClearModifiedFlag()
} }
/*! The page's cache must be locked.
*/
void
PageWriteWrapper::CheckRemoveFromShrunkenCache()
{
if (fPage->busy_writing)
return;
vm_remove_all_page_mappings(fPage);
fCache->RemovePage(fPage);
}
/*! The page's cache must be locked. /*! The page's cache must be locked.
The page queues must not be locked. The page queues must not be locked.
*/ */
@@ -1468,20 +1454,20 @@ PageWriteWrapper::Done(status_t result)
// The busy_writing flag was cleared. That means the cache has been // The busy_writing flag was cleared. That means the cache has been
// shrunk while we were trying to write the page and we have to free // shrunk while we were trying to write the page and we have to free
// it now. // it now.
vm_remove_all_page_mappings(fPage);
// TODO: Unmapping should already happen when resizing the cache!
fCache->RemovePage(fPage);
free_page(fPage, false);
// Adjust temporary modified pages count, if necessary. // Adjust temporary modified pages count, if necessary.
if (fDequeuedPage && fCache->temporary) if (fDequeuedPage && fCache->temporary)
atomic_add(&sModifiedTemporaryPages, -1); atomic_add(&sModifiedTemporaryPages, -1);
// free the page
free_page(fPage, false);
} else { } else {
fPage->busy_writing = false; fPage->busy_writing = false;
DEBUG_PAGE_ACCESS_END(fPage); DEBUG_PAGE_ACCESS_END(fPage);
} }
} }
fCache->NotifyPageEvents(fPage, PAGE_EVENT_NOT_BUSY); fCache->NotifyPageEvents(fPage, PAGE_EVENT_NOT_BUSY);
fIsActive = false; fIsActive = false;
} }
@@ -1667,12 +1653,6 @@ PageWriterRun::Go()
PageWriteTransfer& transfer = fTransfers[i]; PageWriteTransfer& transfer = fTransfers[i];
transfer.Cache()->Lock(); transfer.Cache()->Lock();
if (transfer.Status() != B_OK) {
uint32 checkIndex = wrapperIndex;
for (uint32 j = 0; j < transfer.PageCount(); j++)
fWrappers[checkIndex++].CheckRemoveFromShrunkenCache();
}
for (uint32 j = 0; j < transfer.PageCount(); j++) for (uint32 j = 0; j < transfer.PageCount(); j++)
fWrappers[wrapperIndex++].Done(transfer.Status()); fWrappers[wrapperIndex++].Done(transfer.Status());
@@ -2539,14 +2519,6 @@ vm_page_write_modified_page_range(struct VMCache* cache, uint32 firstPage,
status_t status = transfer.Schedule(0); status_t status = transfer.Schedule(0);
cache->Lock(); cache->Lock();
// Before disabling interrupts handle part of the special case that
// writing the page failed due the cache having been shrunk. We need to
// remove the page from the cache and free it.
if (status != B_OK) {
for (int32 i = 0; i < usedWrappers; i++)
wrappers[i]->CheckRemoveFromShrunkenCache();
}
for (int32 i = 0; i < usedWrappers; i++) for (int32 i = 0; i < usedWrappers; i++)
wrappers[i]->Done(status); wrappers[i]->Done(status);