Index: src/heap.h |
diff --git a/src/heap.h b/src/heap.h |
index 74e5a31b190f46c73b842b8c29a7dc7c7b1b3e0f..b67418e059889b52adb9b0a1af74700d6987b626 100644 |
--- a/src/heap.h |
+++ b/src/heap.h |
@@ -206,6 +206,10 @@ class HeapStats; |
typedef String* (*ExternalStringTableUpdaterCallback)(Object** pointer); |
+typedef bool (*DirtyRegionCallback)(Address start, |
+ Address end, |
+ ObjectSlotCallback copy_object_func); |
+ |
// The all static Heap captures the interface to the global object heap. |
// All JavaScript contexts by this process share the same object heap. |
@@ -740,17 +744,54 @@ class Heap : public AllStatic { |
// Iterates over all the other roots in the heap. |
static void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); |
- // Iterates remembered set of an old space. |
- static void IterateRSet(PagedSpace* space, ObjectSlotCallback callback); |
+ enum ExpectedPageWatermarkState { |
+ WATERMARK_SHOULD_BE_VALID, |
+ WATERMARK_CAN_BE_INVALID |
+ }; |
+ |
+ // For each dirty region on a page in use from an old space call |
+ // visit_dirty_region callback. |
+ // If either visit_dirty_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. |
+ // All pages will be marked as having invalid watermark upon |
+ // iteration completion. |
+ static void IterateDirtyRegions( |
+ PagedSpace* space, |
+ DirtyRegionCallback visit_dirty_region, |
+ ObjectSlotCallback callback, |
+ ExpectedPageWatermarkState expected_page_watermark_state); |
+ |
+ // Interpret marks as a bitvector of dirty marks for regions of size |
+ // Page::kRegionSize aligned by Page::kRegionAlignmentMask and covering |
+ // memory interval from start to top. For each dirty region call a |
+ // visit_dirty_region callback. Return updated bitvector of dirty marks. |
+ static uint32_t IterateDirtyRegions(uint32_t marks, |
+ Address start, |
+ Address end, |
+ DirtyRegionCallback visit_dirty_region, |
+ ObjectSlotCallback callback); |
+ |
+ // Iterate pointers to new space found in memory interval from start to end. |
+ // Update dirty marks for page containing start address. |
+ static void IterateAndMarkPointersToNewSpace(Address start, |
+ Address end, |
+ ObjectSlotCallback callback); |
+ |
+ // Iterate pointers to new space found in memory interval from start to end. |
+ // Return true if pointers to new space was found. |
+ static bool IteratePointersInDirtyRegion(Address start, |
+ Address end, |
+ ObjectSlotCallback callback); |
+ |
+ |
+ // Iterate pointers to new space found in memory interval from start to end. |
+ // This interval is considered to belong to the map space. |
+ // Return true if pointers to new space was found. |
+ static bool IteratePointersInDirtyMapsRegion(Address start, |
+ Address end, |
+ ObjectSlotCallback callback); |
- // Iterates a range of remembered set addresses starting with rset_start |
- // corresponding to the range of allocated pointers |
- // [object_start, object_end). |
- // Returns the number of bits that were set. |
- static int IterateRSetRange(Address object_start, |
- Address object_end, |
- Address rset_start, |
- ObjectSlotCallback copy_object_func); |
// Returns whether the object resides in new space. |
static inline bool InNewSpace(Object* object); |
@@ -852,17 +893,6 @@ class Heap : public AllStatic { |
static void ScavengePointer(HeapObject** p); |
static inline void ScavengeObject(HeapObject** p, HeapObject* object); |
- // Clear a range of remembered set addresses corresponding to the object |
- // area address 'start' with size 'size_in_bytes', eg, when adding blocks |
- // to the free list. |
- static void ClearRSetRange(Address start, int size_in_bytes); |
- |
- // Rebuild remembered set in old and map spaces. |
- static void RebuildRSets(); |
- |
- // Update an old object's remembered set |
- static int UpdateRSet(HeapObject* obj); |
- |
// Commits from space if it is uncommitted. |
static void EnsureFromSpaceIsCommitted(); |
@@ -955,11 +985,19 @@ class Heap : public AllStatic { |
// Copy block of memory from src to dst. Size of block should be aligned |
// by pointer size. |
- static inline void CopyBlock(Object** dst, Object** src, int byte_size); |
+ static inline void CopyBlock(Address dst, Address src, int byte_size); |
+ |
+ static inline void CopyBlockToOldSpaceAndUpdateRegionMarks(Address dst, |
+ Address src, |
+ int byte_size); |
// Optimized version of memmove for blocks with pointer size aligned sizes and |
// pointer size aligned addresses. |
- static inline void MoveBlock(Object** dst, Object** src, int byte_size); |
+ static inline void MoveBlock(Address dst, Address src, int byte_size); |
+ |
+ static inline void MoveBlockToOldSpaceAndUpdateRegionMarks(Address dst, |
+ Address src, |
+ int byte_size); |
// Check new space expansion criteria and expand semispaces if it was hit. |
static void CheckNewSpaceExpansionCriteria(); |
@@ -1207,12 +1245,6 @@ class Heap : public AllStatic { |
static void ReportStatisticsAfterGC(); |
#endif |
- // Rebuild remembered set in an old space. |
- static void RebuildRSets(PagedSpace* space); |
- |
- // Rebuild remembered set in the large object space. |
- static void RebuildRSets(LargeObjectSpace* space); |
- |
// Slow part of scavenge object. |
static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); |
@@ -1301,11 +1333,11 @@ class LinearAllocationScope { |
#ifdef DEBUG |
-// Visitor class to verify interior pointers that do not have remembered set |
-// bits. All heap object pointers have to point into the heap to a location |
-// that has a map pointer at its first word. Caveat: Heap::Contains is an |
-// approximation because it can return true for objects in a heap space but |
-// above the allocation pointer. |
+// Visitor class to verify interior pointers in spaces that do not contain |
+// or care about intergenerational references. All heap object pointers have to |
+// point into the heap to a location that has a map pointer at its first word. |
+// Caveat: Heap::Contains is an approximation because it can return true for |
+// objects in a heap space but above the allocation pointer. |
class VerifyPointersVisitor: public ObjectVisitor { |
public: |
void VisitPointers(Object** start, Object** end) { |
@@ -1320,10 +1352,11 @@ class VerifyPointersVisitor: public ObjectVisitor { |
}; |
-// Visitor class to verify interior pointers that have remembered set bits. |
-// As VerifyPointersVisitor but also checks that remembered set bits are |
-// always set for pointers into new space. |
-class VerifyPointersAndRSetVisitor: public ObjectVisitor { |
+// Visitor class to verify interior pointers in spaces that use region marks |
+// to keep track of intergenerational references. |
+// As VerifyPointersVisitor but also checks that dirty marks are set |
+// for regions covering intergenerational references. |
+class VerifyPointersAndDirtyRegionsVisitor: public ObjectVisitor { |
public: |
void VisitPointers(Object** start, Object** end) { |
for (Object** current = start; current < end; current++) { |
@@ -1332,7 +1365,9 @@ class VerifyPointersAndRSetVisitor: public ObjectVisitor { |
ASSERT(Heap::Contains(object)); |
ASSERT(object->map()->IsMap()); |
if (Heap::InNewSpace(object)) { |
- ASSERT(Page::IsRSetSet(reinterpret_cast<Address>(current), 0)); |
+ ASSERT(Heap::InToSpace(object)); |
+ Address addr = reinterpret_cast<Address>(current); |
+ ASSERT(Page::FromAddress(addr)->IsRegionDirty(addr)); |
} |
} |
} |