Index: src/store-buffer.h |
diff --git a/src/store-buffer.h b/src/store-buffer.h |
index 9101c0eb892435d2ba07950d6906416d1fc7610b..20ff6ffdeb3547f50e58fbecb11a6e065af93248 100644 |
--- a/src/store-buffer.h |
+++ b/src/store-buffer.h |
@@ -19,11 +19,6 @@ class StoreBuffer; |
typedef void (*ObjectSlotCallback)(HeapObject** from, HeapObject* to); |
-typedef void (StoreBuffer::*RegionCallback)(Address start, |
- Address end, |
- ObjectSlotCallback slot_callback, |
- bool clear_maps); |
- |
// Used to implement the write barrier by collecting addresses of pointers |
// between spaces. |
class StoreBuffer { |
@@ -68,13 +63,13 @@ class StoreBuffer { |
static const int kStoreBufferOverflowBit = 1 << (14 + kPointerSizeLog2); |
static const int kStoreBufferSize = kStoreBufferOverflowBit; |
static const int kStoreBufferLength = kStoreBufferSize / sizeof(Address); |
- static const int kOldStoreBufferLength = kStoreBufferLength * 16; |
+ static const int kOldRegularStoreBufferLength = kStoreBufferLength * 16; |
static const int kHashSetLengthLog2 = 12; |
static const int kHashSetLength = 1 << kHashSetLengthLog2; |
void Compact(); |
- void GCPrologue(); |
+ void GCPrologue(bool allow_overflow); |
void GCEpilogue(); |
Object*** Limit() { return reinterpret_cast<Object***>(old_limit_); } |
@@ -118,12 +113,27 @@ class StoreBuffer { |
Address* old_start_; |
Address* old_limit_; |
Address* old_top_; |
+ |
+ // The regular limit specifies how big the store buffer may become during |
+ // mutator execution or while scavenging. |
+ Address* old_regular_limit_; |
+ |
+ // The reserved limit is bigger then the regular limit. It should be the size |
+ // of a semi-space to avoid new scan-on-scavenge during new space evacuation |
+ // after sweeping in a full garbage collection. |
Address* old_reserved_limit_; |
+ |
base::VirtualMemory* old_virtual_memory_; |
+ int old_store_buffer_length_; |
bool old_buffer_is_sorted_; |
bool old_buffer_is_filtered_; |
- bool during_gc_; |
+ |
+ // If allow_overflow_ is set, we allow the store buffer to grow until |
+ // old_reserved_limit_. But we will shrink the store buffer in the epilogue to |
+ // stay within the old_regular_limit_. |
+ bool allow_overflow_; |
+ |
// The garbage collector iterates over many pointers to new space that are not |
// handled by the store buffer. This flag indicates whether the pointers |
// found by the callbacks should be added to the store buffer or not. |
@@ -146,6 +156,14 @@ class StoreBuffer { |
void Uniq(); |
void ExemptPopularPages(int prime_sample_step, int threshold); |
+ enum ExemptPopularPagesMode { |
+ ENSURE_SPACE, |
+ SHRINK_TO_REGULAR_SIZE |
+ }; |
+ |
+ template <ExemptPopularPagesMode mode> |
+ void IterativelyExemptPopularPages(intptr_t space_needed); |
+ |
// Set the map field of the object to NULL if contains a map. |
inline void ClearDeadObject(HeapObject *object); |
@@ -156,17 +174,6 @@ class StoreBuffer { |
ObjectSlotCallback slot_callback, |
bool clear_maps); |
- // For each region of pointers on a page in use from an old space call |
- // visit_pointer_region callback. |
- // If either visit_pointer_region or callback can cause an allocation |
- // in old space and changes in allocation watermark then |
- // can_preallocate_during_iteration should be set to true. |
- void IteratePointersOnPage( |
- PagedSpace* space, |
- Page* page, |
- RegionCallback region_callback, |
- ObjectSlotCallback slot_callback); |
- |
void IteratePointersInStoreBuffer(ObjectSlotCallback slot_callback, |
bool clear_maps); |