Chromium Code Reviews| Index: vm/pages.cc |
| =================================================================== |
| --- vm/pages.cc (revision 6528) |
| +++ vm/pages.cc (working copy) |
| @@ -115,6 +115,19 @@ |
| } |
| +void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) { |
| + capacity_ -= page->memory_->size(); |
| + // Remove the page from the list. |
| + if (previous_page != NULL) { |
| + previous_page->set_next(page->next()); |
| + } else { |
| + large_pages_ = page->next(); |
|
Mads Ager (google)
2012/04/16 10:39:09
Shouldn't this be pages_ instead of large_pages_?
Ivan Posva
2012/04/16 13:51:04
pages_tail_ was not really needed. Removed.
|
| + } |
| + // TODO(iposva): Consider adding to a pool of empty pages. |
| + page->Deallocate(); |
| +} |
| + |
| + |
| void PageSpace::FreeLargePage(HeapPage* page, HeapPage* previous_page) { |
| capacity_ -= page->memory_->size(); |
| // Remove the page from the list. |
| @@ -284,14 +297,21 @@ |
| GCSweeper sweeper(heap_); |
| intptr_t in_use = 0; |
| + HeapPage* prev_page = NULL; |
| HeapPage* page = pages_; |
| while (page != NULL) { |
| intptr_t page_in_use = sweeper.SweepPage(page, &freelist_); |
| - in_use += page_in_use; |
| - page = page->next(); |
| + HeapPage* next_page = page->next(); |
| + if (page_in_use == 0) { |
| + FreePage(page, prev_page); |
| + } else { |
| + in_use += page_in_use; |
| + prev_page = page; |
| + } |
| + // Advance to the next page. |
| + page = next_page; |
| } |
| - HeapPage* prev_page = NULL; |
| page = large_pages_; |
| while (page != NULL) { |
| intptr_t page_in_use = sweeper.SweepLargePage(page); |