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

Unified Diff: runtime/vm/heap.cc

Issue 226973003: Simpler, more consistent triggering of old GC; also, use external in policy. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 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
Index: runtime/vm/heap.cc
===================================================================
--- runtime/vm/heap.cc (revision 35145)
+++ runtime/vm/heap.cc (working copy)
@@ -104,6 +104,9 @@
} else {
ASSERT(space == kOld);
old_space_->AllocateExternal(size);
+ if (old_space_->NeedsGarbageCollection()) {
+ CollectGarbage(kOld);
+ }
}
}
@@ -116,6 +119,11 @@
}
}
+void Heap::PromoteExternal(intptr_t size) {
+ new_space_->FreeExternal(size);
+ old_space_->AllocateExternal(size);
+}
+
bool Heap::Contains(uword addr) const {
return new_space_->Contains(addr) ||
old_space_->Contains(addr);
@@ -203,31 +211,30 @@
}
-void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
+void Heap::CollectGarbage(Space space,
+ ApiCallbacks api_callbacks,
+ GCReason reason) {
Isolate* isolate = Isolate::Current();
TIMERSCOPE(isolate, time_gc);
bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
switch (space) {
case kNew: {
VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
- RecordBeforeGC(kNew, kNewSpace);
+ RecordBeforeGC(kNew, reason);
UpdateClassHeapStatsBeforeGC(kNew);
new_space_->Scavenge(invoke_api_callbacks);
RecordAfterGC();
PrintStats();
- // TODO(koda): Replace promotion failure tracking with
- // old_space_->NeedsGarbageCollection.
- if (new_space_->HadPromotionFailure() || old_space_->NeedExternalGC()) {
+ if (old_space_->NeedsGarbageCollection()) {
// Old collections should call the API callbacks.
- CollectGarbage(kOld, kInvokeApiCallbacks);
+ CollectGarbage(kOld, kInvokeApiCallbacks, kPromotion);
}
break;
}
case kOld:
case kCode: {
VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
- bool promotion_failure = new_space_->HadPromotionFailure();
- RecordBeforeGC(kOld, promotion_failure ? kPromotionFailure : kOldSpace);
+ RecordBeforeGC(kOld, reason);
UpdateClassHeapStatsBeforeGC(kOld);
old_space_->MarkSweep(invoke_api_callbacks);
RecordAfterGC();
@@ -252,13 +259,12 @@
void Heap::CollectGarbage(Space space) {
- ApiCallbacks api_callbacks;
if (space == kOld) {
- api_callbacks = kInvokeApiCallbacks;
+ CollectGarbage(space, kInvokeApiCallbacks, kOldSpace);
} else {
- api_callbacks = kIgnoreApiCallbacks;
+ ASSERT(space == kNew);
+ CollectGarbage(space, kIgnoreApiCallbacks, kNewSpace);
}
- CollectGarbage(space, api_callbacks);
}
@@ -408,8 +414,8 @@
switch (gc_reason) {
case kNewSpace:
return "new space";
- case kPromotionFailure:
- return "promotion failure";
+ case kPromotion:
+ return "promotion";
case kOldSpace:
return "old space";
case kFull:
« runtime/vm/dart_api_impl_test.cc ('K') | « runtime/vm/heap.h ('k') | runtime/vm/pages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698