Chromium Code Reviews| Index: src/heap.h |
| diff --git a/src/heap.h b/src/heap.h |
| index f488b8cda276316df11e6df8b3e645a533c8b111..366f7a235dbf927b4e6039d7b8b39d86fd23b97b 100644 |
| --- a/src/heap.h |
| +++ b/src/heap.h |
| @@ -1268,8 +1268,8 @@ class Heap { |
| return Min(limit, halfway_to_the_max); |
| } |
| - // Can be called when the embedding application is idle. |
| - bool IdleNotification(); |
| + // Implements the corresponding V8 API function. |
| + bool IdleNotification(int hint); |
| // Declare all the root indices. |
| enum RootListIndex { |
| @@ -1392,6 +1392,17 @@ class Heap { |
| return &incremental_marking_; |
| } |
| + bool IsSweepingComplete() { |
| + return old_data_space()->IsSweepingComplete() && |
| + old_pointer_space()->IsSweepingComplete(); |
| + } |
| + |
| + bool AdvanceSweepers(int step_size) { |
| + bool sweeping_complete = old_data_space()->AdvanceSweeper(step_size); |
| + sweeping_complete &= old_pointer_space()->AdvanceSweeper(step_size); |
| + return sweeping_complete; |
| + } |
| + |
| ExternalStringTable* external_string_table() { |
| return &external_string_table_; |
| } |
| @@ -1427,6 +1438,10 @@ class Heap { |
| // The roots that have an index less than this are always in old space. |
| static const int kOldSpaceRoots = 0x20; |
| + bool idle_notification_will_schedule_next_gc() { |
| + return idle_notification_will_schedule_next_gc_; |
| + } |
| + |
| private: |
| Heap(); |
| @@ -1752,6 +1767,30 @@ class Heap { |
| void SelectScavengingVisitorsTable(); |
| + void StartIdleRound() { |
| + mark_sweeps_since_idle_round_started_ = 0; |
| + ms_count_at_last_idle_notification_ = ms_count_; |
| + } |
| + |
| + void FinishIdleRound() { |
| + mark_sweeps_since_idle_round_started_ = kMaxMarkSweepsInIdleRound; |
| + scavenges_since_last_idle_round_ = 0; |
| + } |
| + |
| + bool EnoughGarbageSinceLastIdleRound() { |
| + return (scavenges_since_last_idle_round_ >= kIdleScavengeThreshold); |
|
ulan
2011/11/23 16:18:06
The previous version would fail to start the idle
|
| + } |
| + |
| + bool WorthStartingGCWhenIdle() { |
| + if (contexts_disposed_ > 0) { |
| + return true; |
| + } |
| + return incremental_marking()->WorthActivating() && NextGCIsLikelyToBeFull(); |
| + } |
| + |
| + // Returns true if no more GC work is left. |
| + bool IdleGlobalGC(); |
| + |
| static const int kInitialSymbolTableSize = 2048; |
| static const int kInitialEvalCacheSize = 64; |
| @@ -1781,6 +1820,15 @@ class Heap { |
| unsigned int last_idle_notification_gc_count_; |
| bool last_idle_notification_gc_count_init_; |
| + bool idle_notification_will_schedule_next_gc_; |
| + 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_; |
| + |
| + static const int kMaxMarkSweepsInIdleRound = 7; |
| + static const int kIdleScavengeThreshold = 5; |
| + |
| // Shared state read by the scavenge collector and set by ScavengeObject. |
| PromotionQueue promotion_queue_; |