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

Unified Diff: runtime/vm/heap.cc

Issue 502823004: - Introduce a synchronous GC before throwing OOM. (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
« no previous file with comments | « no previous file | runtime/vm/pages.cc » ('j') | runtime/vm/pages.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/heap.cc
===================================================================
--- runtime/vm/heap.cc (revision 39601)
+++ runtime/vm/heap.cc (working copy)
@@ -89,7 +89,7 @@
{
MonitorLocker ml(old_space_->tasks_lock());
addr = old_space_->TryAllocate(size, type);
- while ((addr == 0) && (old_space_->tasks())) {
+ while ((addr == 0) && (old_space_->tasks() > 0)) {
ml.Wait();
addr = old_space_->TryAllocate(size, type);
}
@@ -97,25 +97,42 @@
if (addr != 0) {
return addr;
}
- // All GC tasks finished without allocating successfully. Run a full GC.
- CollectAllGarbage();
- addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+ // All GC tasks finished without allocating successfully. Run an old GC.
+ CollectGarbage(kOld);
+ addr = old_space_->TryAllocate(size, type);
if (addr != 0) {
return addr;
}
// Wait for all of the concurrent tasks to finish before giving up.
{
MonitorLocker ml(old_space_->tasks_lock());
- addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
- while ((addr == 0) && (old_space_->tasks())) {
+ addr = old_space_->TryAllocate(size, type);
+ while ((addr == 0) && (old_space_->tasks() > 0)) {
ml.Wait();
- addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+ addr = old_space_->TryAllocate(size, type);
}
}
if (addr != 0) {
return addr;
}
- // Giving up allocating this object.
+ // Force growth before attempting a synchronous GC.
+ addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+ if (addr != 0) {
+ return addr;
+ }
+ // Before throwing an out-of-memory error try a synchronous GC.
+ CollectAllGarbage();
+ {
+ MonitorLocker ml(old_space_->tasks_lock());
+ while (old_space_->tasks() > 0) {
+ ml.Wait();
+ }
+ }
+ addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+ if (addr != 0) {
+ return addr;
+ }
+ // Give up allocating this object.
OS::PrintErr(
"Exhausted heap space, trying to allocate %" Pd " bytes.\n", size);
return 0;
« no previous file with comments | « no previous file | runtime/vm/pages.cc » ('j') | runtime/vm/pages.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698