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

Unified Diff: runtime/vm/pages.cc

Issue 488943002: - Stop-the-world sweep uses pre-locked free list access. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 4 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
« runtime/vm/gc_sweeper.cc ('K') | « runtime/vm/gc_sweeper.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/pages.cc
===================================================================
--- runtime/vm/pages.cc (revision 39397)
+++ runtime/vm/pages.cc (working copy)
@@ -565,38 +565,46 @@
freelist_[HeapPage::kExecutable].Reset();
int64_t mid2 = OS::GetCurrentTimeMicros();
+ int64_t mid3 = 0;
GCSweeper sweeper(heap_);
- HeapPage* prev_page = NULL;
- HeapPage* page = pages_;
- while (page != NULL) {
- HeapPage* next_page = page->next();
- bool page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
- if (page_in_use) {
- prev_page = page;
- } else {
- FreePage(page, prev_page);
+ // During stop-the-world phases we should use bulk lock when adding elements
+ // to the free list.
+ {
+ MutexLocker mld(freelist_[HeapPage::kData].mutex());
+ MutexLocker mle(freelist_[HeapPage::kExecutable].mutex());
+
+ HeapPage* prev_page = NULL;
+ HeapPage* page = pages_;
+ while (page != NULL) {
+ HeapPage* next_page = page->next();
+ bool page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
+ if (page_in_use) {
+ prev_page = page;
+ } else {
+ FreePage(page, prev_page);
+ }
+ // Advance to the next page.
+ page = next_page;
}
- // Advance to the next page.
- page = next_page;
- }
- int64_t mid3 = OS::GetCurrentTimeMicros();
+ mid3 = OS::GetCurrentTimeMicros();
- prev_page = NULL;
- page = large_pages_;
- while (page != NULL) {
- HeapPage* next_page = page->next();
- const intptr_t words_to_end = sweeper.SweepLargePage(page);
- if (words_to_end == 0) {
- FreeLargePage(page, prev_page);
- } else {
- TruncateLargePage(page, words_to_end << kWordSizeLog2);
- prev_page = page;
+ prev_page = NULL;
+ page = large_pages_;
+ while (page != NULL) {
+ HeapPage* next_page = page->next();
+ const intptr_t words_to_end = sweeper.SweepLargePage(page);
+ if (words_to_end == 0) {
+ FreeLargePage(page, prev_page);
+ } else {
+ TruncateLargePage(page, words_to_end << kWordSizeLog2);
+ prev_page = page;
+ }
+ // Advance to the next page.
+ page = next_page;
}
- // Advance to the next page.
- page = next_page;
}
koda 2014/08/20 13:52:22 For a large scope like this, it might help readabi
Ivan Posva 2014/08/20 14:10:20 In my experience commenting here is counter-produc
koda 2014/08/20 16:11:19 In any case, keeping method bodies within a reason
// Make code pages read-only.
« runtime/vm/gc_sweeper.cc ('K') | « runtime/vm/gc_sweeper.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698