| 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);
|
|
|
|
|