1c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved. 2c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Redistribution and use in source and binary forms, with or without 3c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// modification, are permitted provided that the following conditions are 4c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// met: 5c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// 6c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// * Redistributions of source code must retain the above copyright 7c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// notice, this list of conditions and the following disclaimer. 8c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// * Redistributions in binary form must reproduce the above 9c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// copyright notice, this list of conditions and the following 10c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// disclaimer in the documentation and/or other materials provided 11c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// with the distribution. 12c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// * Neither the name of Google Inc. nor the names of its 13c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// contributors may be used to endorse or promote products derived 14c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// from this software without specific prior written permission. 15c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// 16c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 28c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifndef V8_STORE_BUFFER_H_ 29c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define V8_STORE_BUFFER_H_ 30c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 31c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "allocation.h" 32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "checks.h" 33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "globals.h" 34c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "platform.h" 35c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "v8globals.h" 36c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 37c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comnamespace v8 { 38c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comnamespace internal { 39c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 40ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgclass Page; 41ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgclass PagedSpace; 42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass StoreBuffer; 43c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 44c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtypedef void (*ObjectSlotCallback)(HeapObject** from, HeapObject* to); 45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 46169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgtypedef void (StoreBuffer::*RegionCallback)(Address start, 47169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Address end, 48169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org ObjectSlotCallback slot_callback, 49169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 50c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 51c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Used to implement the write barrier by collecting addresses of pointers 52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// between spaces. 53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass StoreBuffer { 54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 55c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com explicit StoreBuffer(Heap* heap); 56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 57c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static void StoreBufferOverflow(Isolate* isolate); 58c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 59c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline Address TopAddress(); 60c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 61f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com void SetUp(); 62c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void TearDown(); 63c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 64c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // This is used by the mutator to enter addresses into the store buffer. 65c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void Mark(Address addr); 66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // This is used by the heap traversal to enter the addresses into the store 68c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // buffer that should still be in the store buffer after GC. It enters 69c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // addresses directly into the old buffer because the GC starts by wiping the 70c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // old buffer and thereafter only visits each cell once so there is no need 71c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // to attempt to remove any dupes. During the first part of a GC we 72c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // are using the store buffer to access the old spaces and at the same time 73c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // we are rebuilding the store buffer using this function. There is, however 74c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // no issue of overwriting the buffer we are iterating over, because this 75c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // stage of the scavenge can only reduce the number of addresses in the store 76c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // buffer (some objects are promoted so pointers to them do not need to be in 77c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // the store buffer). The later parts of the GC scan the pages that are 78c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // exempt from the store buffer and process the promotion queue. These steps 79c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // can overflow this buffer. We check for this and on overflow we call the 80c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // callback set up with the StoreBufferRebuildScope object. 81c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void EnterDirectlyIntoStoreBuffer(Address addr); 82c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 83c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Iterates over all pointers that go from old space to new space. It will 84c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // delete the store buffer as it starts so the callback should reenter 85c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // surviving old-to-new pointers into the store buffer to rebuild it. 86c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void IteratePointersToNewSpace(ObjectSlotCallback callback); 87c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 88169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Same as IteratePointersToNewSpace but additonally clears maps in objects 89169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // referenced from the store buffer that do not contain a forwarding pointer. 90169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void IteratePointersToNewSpaceAndClearMaps(ObjectSlotCallback callback); 91169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 92c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org static const int kStoreBufferOverflowBit = 1 << (14 + kPointerSizeLog2); 93c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kStoreBufferSize = kStoreBufferOverflowBit; 94c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kStoreBufferLength = kStoreBufferSize / sizeof(Address); 95c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kOldStoreBufferLength = kStoreBufferLength * 16; 96b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org static const int kHashSetLengthLog2 = 12; 97b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org static const int kHashSetLength = 1 << kHashSetLengthLog2; 98c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 99c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Compact(); 100c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 101c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void GCPrologue(); 102c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void GCEpilogue(); 103c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 104c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** Limit() { return reinterpret_cast<Object***>(old_limit_); } 105c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** Start() { return reinterpret_cast<Object***>(old_start_); } 106c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** Top() { return reinterpret_cast<Object***>(old_top_); } 107c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void SetTop(Object*** top) { 108c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(top >= Start()); 109c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(top <= Limit()); 110c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com old_top_ = reinterpret_cast<Address*>(top); 111c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 112c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 113c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool old_buffer_is_sorted() { return old_buffer_is_sorted_; } 114c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool old_buffer_is_filtered() { return old_buffer_is_filtered_; } 115c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 116c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Goes through the store buffer removing pointers to things that have 117c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // been promoted. Rebuilds the store buffer completely if it overflowed. 118c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void SortUniq(); 119c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 12064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org void EnsureSpace(intptr_t space_needed); 121c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Verify(); 122c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 123c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool PrepareForIteration(); 124c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 125c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifdef DEBUG 126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Clean(); 127c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Slow, for asserts only. 128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool CellIsInStoreBuffer(Address cell); 129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif 130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 131c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Filter(int flag); 132c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 133c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Heap* heap_; 135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The store buffer is divided up into a new buffer that is constantly being 137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // filled by mutator activity and an old buffer that is filled with the data 138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // from the new buffer after compression. 139c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* start_; 140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* limit_; 141c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* old_start_; 143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* old_limit_; 144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* old_top_; 14564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org Address* old_reserved_limit_; 14664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org VirtualMemory* old_virtual_memory_; 147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 148c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool old_buffer_is_sorted_; 149c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool old_buffer_is_filtered_; 150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool during_gc_; 151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The garbage collector iterates over many pointers to new space that are not 152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // handled by the store buffer. This flag indicates whether the pointers 153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // found by the callbacks should be added to the store buffer or not. 154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool store_buffer_rebuilding_enabled_; 155c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferCallback callback_; 156c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool may_move_store_buffer_entries_; 157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com VirtualMemory* virtual_memory_; 159b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org 160b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org // Two hash sets used for filtering. 161b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org // If address is in the hash set then it is guaranteed to be in the 162b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org // old part of the store buffer. 163b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org uintptr_t* hash_set_1_; 164b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org uintptr_t* hash_set_2_; 165b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org bool hash_sets_are_empty_; 166b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org 167b295776b8c02617720d03b6dbcf2f912dfd2c4e7vegorov@chromium.org void ClearFilteringHashSets(); 168c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 16941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org bool SpaceAvailable(intptr_t space_needed); 170c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Uniq(); 171c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void ExemptPopularPages(int prime_sample_step, int threshold); 172c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 173169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // Set the map field of the object to NULL if contains a map. 174169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org inline void ClearDeadObject(HeapObject *object); 175169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 176169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void IteratePointersToNewSpace(ObjectSlotCallback callback, bool clear_maps); 177169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 178c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void FindPointersToNewSpaceInRegion(Address start, 179c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address end, 180169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org ObjectSlotCallback slot_callback, 181169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 183c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // For each region of pointers on a page in use from an old space call 184c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // visit_pointer_region callback. 185c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // If either visit_pointer_region or callback can cause an allocation 186c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // in old space and changes in allocation watermark then 187c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // can_preallocate_during_iteration should be set to true. 188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void IteratePointersOnPage( 189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PagedSpace* space, 190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* page, 191c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RegionCallback region_callback, 192c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ObjectSlotCallback slot_callback); 193c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 194c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void FindPointersToNewSpaceInMaps( 195c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address start, 196c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address end, 197169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org ObjectSlotCallback slot_callback, 198169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 199c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void FindPointersToNewSpaceInMapsRegion( 201c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address start, 202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address end, 203169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org ObjectSlotCallback slot_callback, 204169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 205c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void FindPointersToNewSpaceOnPage( 207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PagedSpace* space, 208c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* page, 209c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RegionCallback region_callback, 210169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org ObjectSlotCallback slot_callback, 211169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 212c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 213169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void IteratePointersInStoreBuffer(ObjectSlotCallback slot_callback, 214169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org bool clear_maps); 215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 216c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 217c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void VerifyPointers(PagedSpace* space, RegionCallback region_callback); 218c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void VerifyPointers(LargeObjectSpace* space); 219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif 220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com friend class StoreBufferRebuildScope; 222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com friend class DontMoveStoreBufferEntriesScope; 223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass StoreBufferRebuildScope { 227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 228c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com explicit StoreBufferRebuildScope(Heap* heap, 229c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer* store_buffer, 230c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferCallback callback) 23183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org : store_buffer_(store_buffer), 232c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com stored_state_(store_buffer->store_buffer_rebuilding_enabled_), 233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com stored_callback_(store_buffer->callback_) { 234c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->store_buffer_rebuilding_enabled_ = true; 235c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->callback_ = callback; 236c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (*callback)(heap, NULL, kStoreBufferStartScanningPagesEvent); 237c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 238c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 239c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ~StoreBufferRebuildScope() { 240c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->callback_ = stored_callback_; 241c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->store_buffer_rebuilding_enabled_ = stored_state_; 242c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 243c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 244c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 245c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer* store_buffer_; 246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool stored_state_; 247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferCallback stored_callback_; 248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 249c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 251c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass DontMoveStoreBufferEntriesScope { 252c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 253c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com explicit DontMoveStoreBufferEntriesScope(StoreBuffer* store_buffer) 254c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : store_buffer_(store_buffer), 255c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com stored_state_(store_buffer->may_move_store_buffer_entries_) { 256c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->may_move_store_buffer_entries_ = false; 257c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 258c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 259c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ~DontMoveStoreBufferEntriesScope() { 260c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->may_move_store_buffer_entries_ = stored_state_; 261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 262c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 263c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 264c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer* store_buffer_; 265c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool stored_state_; 266c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 267c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 268c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} } // namespace v8::internal 269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 270c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif // V8_STORE_BUFFER_H_ 271