| Index: runtime/vm/pages.h
|
| ===================================================================
|
| --- runtime/vm/pages.h (revision 34741)
|
| +++ runtime/vm/pages.h (working copy)
|
| @@ -7,6 +7,7 @@
|
|
|
| #include "vm/freelist.h"
|
| #include "vm/globals.h"
|
| +#include "vm/spaces.h"
|
| #include "vm/virtual_memory.h"
|
|
|
| namespace dart {
|
| @@ -116,14 +117,18 @@
|
| int garbage_collection_time_ratio);
|
| ~PageSpaceController();
|
|
|
| - bool CanGrowPageSpace(intptr_t size_in_bytes);
|
| + // Returns whether growing to 'after' should trigger a GC.
|
| + // This method can be called before allocation (e.g., pretenuring) or after
|
| + // (e.g., promotion), as it does not change the state of the controller.
|
| + bool NeedsGarbageCollection(SpaceUsage after) const;
|
|
|
| + // Should be called after each collection to update the controller state.
|
| // A garbage collection is considered as successful if more than
|
| // heap_growth_ratio % of memory got deallocated by the garbage collector.
|
| // In this case garbage collection will be performed next time. Otherwise
|
| // the heap will grow.
|
| - void EvaluateGarbageCollection(intptr_t used_before_in_words,
|
| - intptr_t used_after_in_words,
|
| + void EvaluateGarbageCollection(SpaceUsage before,
|
| + SpaceUsage after,
|
| int64_t start, int64_t end);
|
|
|
| int64_t last_code_collection_in_us() { return last_code_collection_in_us_; }
|
| @@ -141,6 +146,9 @@
|
| private:
|
| bool is_enabled_;
|
|
|
| + // Usage after last evaluated GC.
|
| + SpaceUsage last_usage_;
|
| +
|
| // Heap growth control variable.
|
| intptr_t grow_heap_;
|
|
|
| @@ -186,11 +194,16 @@
|
| HeapPage::PageType type = HeapPage::kData,
|
| GrowthPolicy growth_policy = kControlGrowth);
|
|
|
| - intptr_t UsedInWords() const { return used_in_words_; }
|
| - intptr_t CapacityInWords() const { return capacity_in_words_; }
|
| + bool NeedsGarbageCollection() const {
|
| + return page_space_controller_.NeedsGarbageCollection(usage_);
|
| + }
|
| +
|
| + intptr_t UsedInWords() const { return usage_.used_in_words; }
|
| + intptr_t CapacityInWords() const { return usage_.capacity_in_words; }
|
| intptr_t ExternalInWords() const {
|
| - return external_in_words_;
|
| + return usage_.external_in_words;
|
| }
|
| + SpaceUsage GetCurrentUsage() const { return usage_; }
|
|
|
| bool Contains(uword addr) const;
|
| bool Contains(uword addr, HeapPage::PageType type) const;
|
| @@ -222,7 +235,7 @@
|
| }
|
|
|
| bool NeedExternalGC() {
|
| - return used_in_words_ + ExternalInWords() > max_capacity_in_words_;
|
| + return UsedInWords() + ExternalInWords() > max_capacity_in_words_;
|
| }
|
|
|
| void WriteProtect(bool read_only);
|
| @@ -275,8 +288,8 @@
|
| static intptr_t LargePageSizeInWordsFor(intptr_t size);
|
|
|
| bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
|
| - ASSERT(capacity_in_words_ <= max_capacity_in_words_);
|
| - return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_);
|
| + ASSERT(CapacityInWords() <= max_capacity_in_words_);
|
| + return increase_in_words <= (max_capacity_in_words_ - CapacityInWords());
|
| }
|
|
|
| FreeList freelist_[HeapPage::kNumPageTypes];
|
| @@ -289,9 +302,7 @@
|
|
|
| // Various sizes being tracked for this generation.
|
| intptr_t max_capacity_in_words_;
|
| - intptr_t capacity_in_words_;
|
| - intptr_t used_in_words_;
|
| - intptr_t external_in_words_;
|
| + SpaceUsage usage_;
|
|
|
| // Keep track whether a MarkSweep is currently running.
|
| bool sweeping_;
|
|
|