Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(939)

Unified Diff: vm/pages.cc

Issue 10093010: - Free completely empty pages as part of sweep. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « vm/pages.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « vm/pages.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698