| Index: src/mark-compact.h
|
| ===================================================================
|
| --- src/mark-compact.h (revision 4686)
|
| +++ src/mark-compact.h (working copy)
|
| @@ -41,8 +41,7 @@
|
| // no attempt to add area to free list is made.
|
| typedef void (*DeallocateFunction)(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
|
|
| // Forward declarations.
|
| @@ -132,7 +131,8 @@
|
| SWEEP_SPACES,
|
| ENCODE_FORWARDING_ADDRESSES,
|
| UPDATE_POINTERS,
|
| - RELOCATE_OBJECTS
|
| + RELOCATE_OBJECTS,
|
| + REBUILD_RSETS
|
| };
|
|
|
| // The current stage of the collector.
|
| @@ -269,22 +269,22 @@
|
| // written to their map word's offset in the inactive
|
| // semispace.
|
| //
|
| - // Bookkeeping data is written to the page header of
|
| + // Bookkeeping data is written to the remembered-set are of
|
| // eached paged-space page that contains live objects after
|
| // compaction:
|
| //
|
| - // The allocation watermark field is used to track the
|
| - // relocation top address, the address of the first word
|
| - // after the end of the last live object in the page after
|
| - // compaction.
|
| + // The 3rd word of the page (first word of the remembered
|
| + // set) contains the relocation top address, the address of
|
| + // the first word after the end of the last live object in
|
| + // the page after compaction.
|
| //
|
| - // The Page::mc_page_index field contains the zero-based index of the
|
| - // page in its space. This word is only used for map space pages, in
|
| + // The 4th word contains the zero-based index of the page in
|
| + // its space. This word is only used for map space pages, in
|
| // order to encode the map addresses in 21 bits to free 11
|
| // bits per map word for the forwarding address.
|
| //
|
| - // The Page::mc_first_forwarded field contains the (nonencoded)
|
| - // forwarding address of the first live object in the page.
|
| + // The 5th word contains the (nonencoded) forwarding address
|
| + // of the first live object in the page.
|
| //
|
| // In both the new space and the paged spaces, a linked list
|
| // of live regions is constructructed (linked through
|
| @@ -319,28 +319,23 @@
|
| // generation.
|
| static void DeallocateOldPointerBlock(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
| static void DeallocateOldDataBlock(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
| static void DeallocateCodeBlock(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
| static void DeallocateMapBlock(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
| static void DeallocateCellBlock(Address start,
|
| int size_in_bytes,
|
| - bool add_to_freelist,
|
| - bool last_on_page);
|
| + bool add_to_freelist);
|
|
|
| // If we are not compacting the heap, we simply sweep the spaces except
|
| // for the large object space, clearing mark bits and adding unmarked
|
| @@ -354,7 +349,9 @@
|
| //
|
| // After: All pointers in live objects, including encoded map
|
| // pointers, are updated to point to their target's new
|
| - // location.
|
| + // location. The remembered set area of each paged-space
|
| + // page containing live objects still contains bookkeeping
|
| + // information.
|
|
|
| friend class UpdatingVisitor; // helper for updating visited objects
|
|
|
| @@ -376,9 +373,13 @@
|
| // Phase 4: Relocating objects.
|
| //
|
| // Before: Pointers to live objects are updated to point to their
|
| - // target's new location.
|
| + // target's new location. The remembered set area of each
|
| + // paged-space page containing live objects still contains
|
| + // bookkeeping information.
|
| //
|
| - // After: Objects have been moved to their new addresses.
|
| + // After: Objects have been moved to their new addresses. The
|
| + // remembered set area of each paged-space page containing
|
| + // live objects still contains bookkeeping information.
|
|
|
| // Relocates objects in all spaces.
|
| static void RelocateObjects();
|
| @@ -407,6 +408,17 @@
|
| // Copy a new object.
|
| static int RelocateNewObject(HeapObject* obj);
|
|
|
| + // -----------------------------------------------------------------------
|
| + // Phase 5: Rebuilding remembered sets.
|
| + //
|
| + // Before: The heap is in a normal state except that remembered sets
|
| + // in the paged spaces are not correct.
|
| + //
|
| + // After: The heap is in a normal state.
|
| +
|
| + // Rebuild remembered set in old and map spaces.
|
| + static void RebuildRSets();
|
| +
|
| #ifdef DEBUG
|
| // -----------------------------------------------------------------------
|
| // Debugging variables, functions and classes
|
|
|