Index: src/spaces.cc |
=================================================================== |
--- src/spaces.cc (revision 2682) |
+++ src/spaces.cc (working copy) |
@@ -726,47 +726,25 @@ |
Page* top_page = AllocationTopPage(); |
ASSERT(top_page->is_valid()); |
- // Loop over the pages from the top page to the end of the space to count |
- // the number of pages to keep and find the last page to keep. |
- int free_pages = 0; |
- int pages_to_keep = 0; // Of the free pages. |
- Page* last_page_to_keep = top_page; |
- Page* current_page = top_page->next_page(); |
- // Loop over the pages to the end of the space. |
- while (current_page->is_valid()) { |
-#if defined(ANDROID) |
- // Free all chunks if possible |
-#else |
- // Advance last_page_to_keep every other step to end up at the midpoint. |
- if ((free_pages & 0x1) == 1) { |
- pages_to_keep++; |
- last_page_to_keep = last_page_to_keep->next_page(); |
- } |
-#endif |
- free_pages++; |
- current_page = current_page->next_page(); |
+ // Count the number of pages we would like to free. |
+ int pages_to_free = 0; |
+ for (Page* p = top_page->next_page(); p->is_valid(); p = p->next_page()) { |
+ pages_to_free++; |
} |
- // Free pages after last_page_to_keep, and adjust the next_page link. |
- Page* p = MemoryAllocator::FreePages(last_page_to_keep->next_page()); |
- MemoryAllocator::SetNextPage(last_page_to_keep, p); |
+ // Free pages after top_page. |
+ Page* p = MemoryAllocator::FreePages(top_page->next_page()); |
+ MemoryAllocator::SetNextPage(top_page, p); |
- // Since pages are only freed in whole chunks, we may have kept more |
- // than pages_to_keep. Count the extra pages and cache the new last |
- // page in the space. |
- last_page_ = last_page_to_keep; |
- while (p->is_valid()) { |
- pages_to_keep++; |
+ // Find out how many pages we failed to free and update last_page_. |
+ // Please note pages can only be freed in whole chunks. |
+ last_page_ = top_page; |
+ for (Page* p = top_page->next_page(); p->is_valid(); p = p->next_page()) { |
+ pages_to_free--; |
last_page_ = p; |
- p = p->next_page(); |
} |
- // The difference between free_pages and pages_to_keep is the number of |
- // pages actually freed. |
- ASSERT(pages_to_keep <= free_pages); |
- int bytes_freed = (free_pages - pages_to_keep) * Page::kObjectAreaSize; |
- accounting_stats_.ShrinkSpace(bytes_freed); |
- |
+ accounting_stats_.ShrinkSpace(pages_to_free * Page::kObjectAreaSize); |
ASSERT(Capacity() == CountTotalPages() * Page::kObjectAreaSize); |
} |