Index: src/heap/gc-idle-time-handler.h |
diff --git a/src/heap/gc-idle-time-handler.h b/src/heap/gc-idle-time-handler.h |
index cf43b9b0700c0340d855616f0cd8be3ef6b0cf3a..77443d891f30e102fa292c5169b06c004d7b8784 100644 |
--- a/src/heap/gc-idle-time-handler.h |
+++ b/src/heap/gc-idle-time-handler.h |
@@ -10,13 +10,50 @@ |
namespace v8 { |
namespace internal { |
+enum GCIdleTimeActionType { |
+ DO_NOTHING, |
+ DO_INCREMENTAL_MARKING, |
+ DO_SCAVENGE, |
+ DO_FULL_GC |
+}; |
+ |
+ |
+struct GCIdleTimeAction { |
Hannes Payer (out of office)
2014/08/20 18:24:11
According to the style guide, this should be a cla
ulan
2014/08/21 08:45:19
Done.
|
+ static GCIdleTimeAction Nothing() { |
+ GCIdleTimeAction result; |
+ result.type = DO_NOTHING; |
+ result.parameter = 0; |
+ return result; |
+ } |
+ static GCIdleTimeAction IncrementalMarking(intptr_t step_size) { |
+ GCIdleTimeAction result; |
+ result.type = DO_INCREMENTAL_MARKING; |
+ result.parameter = step_size; |
+ return result; |
+ } |
+ static GCIdleTimeAction Scavenge() { |
+ GCIdleTimeAction result; |
+ result.type = DO_SCAVENGE; |
+ result.parameter = 0; |
+ return result; |
+ } |
+ static GCIdleTimeAction FullGC() { |
+ GCIdleTimeAction result; |
+ result.type = DO_FULL_GC; |
+ result.parameter = 0; |
+ return result; |
+ } |
+ |
+ GCIdleTimeActionType type; |
+ intptr_t parameter; |
+}; |
+ |
+class GCTracer; |
+ |
// The idle time handler makes decisions about which garbage collection |
// operations are executing during IdleNotification. |
class GCIdleTimeHandler { |
public: |
- static intptr_t EstimateMarkingStepSize( |
- int idle_time_in_ms, intptr_t marking_speed_in_bytes_per_ms); |
- |
// If we haven't recorded any incremental marking events yet, we carefully |
// mark with a conservative lower bound for the marking speed. |
static const intptr_t kInitialConservativeMarkingSpeed = 100 * KB; |
@@ -25,7 +62,46 @@ class GCIdleTimeHandler { |
// idle_time_in_ms. Hence, we conservatively prune our workload estimate. |
static const double kConservativeTimeRatio; |
+ GCIdleTimeHandler() |
+ : mark_sweeps_since_idle_round_started_(0), |
+ scavenges_since_last_idle_round_(0) {} |
+ |
+ GCIdleTimeAction Compute(int idle_time_in_ms, int contexts_disposed, |
+ intptr_t size_of_objects, |
+ bool incremental_marking_stopped, |
+ GCTracer* gc_tracer); |
+ |
+ void NotifyIdleFullGC() { |
Hannes Payer (out of office)
2014/08/20 18:24:11
In the gc tracer we refer to the event as mark com
ulan
2014/08/21 08:45:19
Done.
|
+ if (mark_sweeps_since_idle_round_started_ < kMaxMarkSweepsInIdleRound) { |
+ ++mark_sweeps_since_idle_round_started_; |
+ if (mark_sweeps_since_idle_round_started_ == kMaxMarkSweepsInIdleRound) { |
+ scavenges_since_last_idle_round_ = 0; |
+ } |
+ } |
+ } |
+ |
+ void NotifyScavenge() { ++scavenges_since_last_idle_round_; } |
+ |
+ static intptr_t EstimateMarkingStepSize( |
+ int idle_time_in_ms, intptr_t mark_sweep_speed_in_bytes_per_ms); |
+ |
+ static int EstimateMarkSweepTime(intptr_t size_of_objects, |
+ intptr_t mark_sweep_speed_in_bytes_per_ms); |
+ |
private: |
+ void StartIdleRound() { mark_sweeps_since_idle_round_started_ = 0; } |
+ bool IsIdleRoundFinished() { |
+ return mark_sweeps_since_idle_round_started_ == kMaxMarkSweepsInIdleRound; |
+ } |
+ bool EnoughGarbageSinceLastIdleRound() { |
+ return scavenges_since_last_idle_round_ >= kIdleScavengeThreshold; |
+ } |
+ |
+ static const int kMaxMarkSweepsInIdleRound = 7; |
Hannes Payer (out of office)
2014/08/20 18:24:11
kMaxMarkSweepsInIdleRound -> kMaxMarkCompactsInIdl
ulan
2014/08/21 08:45:19
Done.
|
+ static const int kIdleScavengeThreshold = 5; |
+ int mark_sweeps_since_idle_round_started_; |
Hannes Payer (out of office)
2014/08/20 18:24:11
mark_sweeps_since_idle_round_started_ -> mark_comp
|
+ int scavenges_since_last_idle_round_; |
+ |
DISALLOW_COPY_AND_ASSIGN(GCIdleTimeHandler); |
}; |