| Index: src/spaces-inl.h
|
| ===================================================================
|
| --- src/spaces-inl.h (revision 6554)
|
| +++ src/spaces-inl.h (working copy)
|
| @@ -83,7 +83,7 @@
|
| // into the promotion queue to process it later.
|
| // If space for object was allocated somewhere beyond allocation
|
| // watermark this might cause garbage pointers to appear under allocation
|
| - // watermark. To avoid visiting them during dirty regions iteration
|
| + // watermark. To avoid visiting them during pointer-to-newspace iteration
|
| // which might be still in progress we store a valid allocation watermark
|
| // value and mark this page as having an invalid watermark.
|
| SetCachedAllocationWatermark(AllocationWatermark());
|
| @@ -107,128 +107,6 @@
|
| }
|
|
|
|
|
| -uint32_t Page::GetRegionMarks() {
|
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| - return dirty_regions_;
|
| -#else
|
| - return kAllRegionsDirtyMarks;
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Page::SetRegionMarks(uint32_t marks) {
|
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| - dirty_regions_ = marks;
|
| -#endif
|
| -}
|
| -
|
| -
|
| -int Page::GetRegionNumberForAddress(Address addr) {
|
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| - // Each page is divided into 256 byte regions. Each region has a corresponding
|
| - // dirty mark bit in the page header. Region can contain intergenerational
|
| - // references iff its dirty mark is set.
|
| - // A normal 8K page contains exactly 32 regions so all region marks fit
|
| - // into 32-bit integer field. To calculate a region number we just divide
|
| - // offset inside page by region size.
|
| - // A large page can contain more then 32 regions. But we want to avoid
|
| - // additional write barrier code for distinguishing between large and normal
|
| - // pages so we just ignore the fact that addr points into a large page and
|
| - // calculate region number as if addr pointed into a normal 8K page. This way
|
| - // we get a region number modulo 32 so for large pages several regions might
|
| - // be mapped to a single dirty mark.
|
| - ASSERT_PAGE_ALIGNED(this->address());
|
| - STATIC_ASSERT((kPageAlignmentMask >> kRegionSizeLog2) < kBitsPerInt);
|
| -
|
| - // We are using masking with kPageAlignmentMask instead of Page::Offset()
|
| - // to get an offset to the beginning of 8K page containing addr not to the
|
| - // beginning of actual page which can be bigger then 8K.
|
| - intptr_t offset_inside_normal_page = OffsetFrom(addr) & kPageAlignmentMask;
|
| - return static_cast<int>(offset_inside_normal_page >> kRegionSizeLog2);
|
| -#else
|
| - return 0;
|
| -#endif
|
| -}
|
| -
|
| -
|
| -uint32_t Page::GetRegionMaskForAddress(Address addr) {
|
| - return 1 << GetRegionNumberForAddress(addr);
|
| -}
|
| -
|
| -
|
| -uint32_t Page::GetRegionMaskForSpan(Address start, int length_in_bytes) {
|
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| - uint32_t result = 0;
|
| - if (length_in_bytes >= kPageSize) {
|
| - result = kAllRegionsDirtyMarks;
|
| - } else if (length_in_bytes > 0) {
|
| - int start_region = GetRegionNumberForAddress(start);
|
| - int end_region =
|
| - GetRegionNumberForAddress(start + length_in_bytes - kPointerSize);
|
| - uint32_t start_mask = (~0) << start_region;
|
| - uint32_t end_mask = ~((~1) << end_region);
|
| - result = start_mask & end_mask;
|
| - // if end_region < start_region, the mask is ored.
|
| - if (result == 0) result = start_mask | end_mask;
|
| - }
|
| -#ifdef DEBUG
|
| - if (FLAG_enable_slow_asserts) {
|
| - uint32_t expected = 0;
|
| - for (Address a = start; a < start + length_in_bytes; a += kPointerSize) {
|
| - expected |= GetRegionMaskForAddress(a);
|
| - }
|
| - ASSERT(expected == result);
|
| - }
|
| -#endif
|
| - return result;
|
| -#else
|
| - return Page::kAllRegionsDirtyMarks;
|
| -#endif
|
| -}
|
| -
|
| -
|
| -void Page::MarkRegionDirty(Address address) {
|
| - SetRegionMarks(GetRegionMarks() | GetRegionMaskForAddress(address));
|
| -}
|
| -
|
| -
|
| -bool Page::IsRegionDirty(Address address) {
|
| - return GetRegionMarks() & GetRegionMaskForAddress(address);
|
| -}
|
| -
|
| -
|
| -void Page::ClearRegionMarks(Address start, Address end, bool reaches_limit) {
|
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| - int rstart = GetRegionNumberForAddress(start);
|
| - int rend = GetRegionNumberForAddress(end);
|
| -
|
| - if (reaches_limit) {
|
| - end += 1;
|
| - }
|
| -
|
| - if ((rend - rstart) == 0) {
|
| - return;
|
| - }
|
| -
|
| - uint32_t bitmask = 0;
|
| -
|
| - if ((OffsetFrom(start) & kRegionAlignmentMask) == 0
|
| - || (start == ObjectAreaStart())) {
|
| - // First region is fully covered
|
| - bitmask = 1 << rstart;
|
| - }
|
| -
|
| - while (++rstart < rend) {
|
| - bitmask |= 1 << rstart;
|
| - }
|
| -
|
| - if (bitmask) {
|
| - SetRegionMarks(GetRegionMarks() & ~bitmask);
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -
|
| void Page::FlipMeaningOfInvalidatedWatermarkFlag() {
|
| watermark_invalidated_mark_ ^= 1 << WATERMARK_INVALIDATED;
|
| }
|
| @@ -258,7 +136,6 @@
|
| if (Heap::gc_state() == Heap::SCAVENGE) {
|
| SetCachedAllocationWatermark(ObjectAreaStart());
|
| }
|
| - SetRegionMarks(kAllRegionsCleanMarks);
|
| }
|
|
|
|
|
|
|