Commit fed3dad2 authored by ulan@chromium.org's avatar ulan@chromium.org

Make more GCs in idle notification handler.

When counting GCs in idle round, count only GC that were directly triggered by the idle notification handler.

R=hpayer@chromium.org
BUG=241815

Review URL: https://chromiumcodereview.appspot.com/15737007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14879 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 8b1bee05
......@@ -152,7 +152,6 @@ Heap::Heap()
last_idle_notification_gc_count_(0),
last_idle_notification_gc_count_init_(false),
mark_sweeps_since_idle_round_started_(0),
ms_count_at_last_idle_notification_(0),
gc_count_at_last_idle_gc_(0),
scavenges_since_last_idle_round_(kIdleScavengeThreshold),
gcs_since_last_deopt_(0),
......@@ -5770,6 +5769,7 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) {
uncommit = true;
}
CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental");
mark_sweeps_since_idle_round_started_++;
gc_count_at_last_idle_gc_ = gc_count_;
if (uncommit) {
new_space_.Shrink();
......@@ -5845,18 +5845,9 @@ bool Heap::IdleNotification(int hint) {
}
}
int new_mark_sweeps = ms_count_ - ms_count_at_last_idle_notification_;
mark_sweeps_since_idle_round_started_ += new_mark_sweeps;
ms_count_at_last_idle_notification_ = ms_count_;
int remaining_mark_sweeps = kMaxMarkSweepsInIdleRound -
mark_sweeps_since_idle_round_started_;
if (remaining_mark_sweeps <= 0) {
FinishIdleRound();
return true;
}
if (incremental_marking()->IsStopped()) {
// If there are no more than two GCs left in this idle round and we are
// allowed to do a full GC, then make those GCs full in order to compact
......@@ -5866,6 +5857,7 @@ bool Heap::IdleNotification(int hint) {
if (remaining_mark_sweeps <= 2 && hint >= kMinHintForFullGC) {
CollectAllGarbage(kReduceMemoryFootprintMask,
"idle notification: finalize idle round");
mark_sweeps_since_idle_round_started_++;
} else {
incremental_marking()->Start();
}
......@@ -5873,6 +5865,12 @@ bool Heap::IdleNotification(int hint) {
if (!incremental_marking()->IsStopped()) {
AdvanceIdleIncrementalMarking(step_size);
}
if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) {
FinishIdleRound();
return true;
}
return false;
}
......
......@@ -2266,7 +2266,6 @@ class Heap {
void StartIdleRound() {
mark_sweeps_since_idle_round_started_ = 0;
ms_count_at_last_idle_notification_ = ms_count_;
}
void FinishIdleRound() {
......@@ -2343,7 +2342,6 @@ class Heap {
bool last_idle_notification_gc_count_init_;
int mark_sweeps_since_idle_round_started_;
int ms_count_at_last_idle_notification_;
unsigned int gc_count_at_last_idle_gc_;
int scavenges_since_last_idle_round_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment