Commit 0240d202 authored by hpayer's avatar hpayer Committed by Commit bot

Reland of [heap] Cleanup mark bit usage. (patchset #1 id:1 of...

Reland of [heap] Cleanup mark bit usage. (patchset #1 id:1 of https://codereview.chromium.org/1490753003/ )

Reason for revert:
Reland after fixing the potential root cause of the canary crasher.

Original issue's description:
> Revert of [heap] Cleanup mark bit usage. (patchset #1 id:1 of https://codereview.chromium.org/1474203003/ )
>
> Reason for revert:
> Still investigating bad canary.
>
> Original issue's description:
> > [heap] Cleanup mark bit usage.
> >
> > BUG=
> >
> > Committed: https://crrev.com/5874ac783ff9bc4bb4b2fda81f5077f06619f96c
> > Cr-Commit-Position: refs/heads/master@{#32362}
>
> TBR=mlippautz@chromium.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=
>
> Committed: https://crrev.com/d3faef8658598e68331208b5a1846ac1c250cb49
> Cr-Commit-Position: refs/heads/master@{#32461}

TBR=mlippautz@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=

Review URL: https://codereview.chromium.org/1488393003

Cr-Commit-Position: refs/heads/master@{#32502}
parent 7ea8ac98
...@@ -1439,8 +1439,9 @@ typedef StringTableCleaner<true> ExternalStringTableCleaner; ...@@ -1439,8 +1439,9 @@ typedef StringTableCleaner<true> ExternalStringTableCleaner;
class MarkCompactWeakObjectRetainer : public WeakObjectRetainer { class MarkCompactWeakObjectRetainer : public WeakObjectRetainer {
public: public:
virtual Object* RetainAs(Object* object) { virtual Object* RetainAs(Object* object) {
if (Marking::IsBlackOrGrey( MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::cast(object));
Marking::MarkBitFrom(HeapObject::cast(object)))) { DCHECK(!Marking::IsGrey(mark_bit));
if (Marking::IsBlack(mark_bit)) {
return object; return object;
} else if (object->IsAllocationSite() && } else if (object->IsAllocationSite() &&
!(AllocationSite::cast(object)->IsZombie())) { !(AllocationSite::cast(object)->IsZombie())) {
...@@ -2370,8 +2371,8 @@ void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map) { ...@@ -2370,8 +2371,8 @@ void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map) {
// Follow back pointer, check whether we are dealing with a map transition // Follow back pointer, check whether we are dealing with a map transition
// from a live map to a dead path and in case clear transitions of parent. // from a live map to a dead path and in case clear transitions of parent.
DCHECK(!Marking::IsBlackOrGrey(Marking::MarkBitFrom(map))); DCHECK(!Marking::IsGrey(Marking::MarkBitFrom(map)));
bool parent_is_alive = Marking::IsBlackOrGrey(Marking::MarkBitFrom(parent)); bool parent_is_alive = Marking::IsBlack(Marking::MarkBitFrom(parent));
if (parent_is_alive) { if (parent_is_alive) {
ClearMapTransitions(parent, map); ClearMapTransitions(parent, map);
} }
...@@ -2381,7 +2382,8 @@ void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map) { ...@@ -2381,7 +2382,8 @@ void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map) {
// Clear a possible back pointer in case the transition leads to a dead map. // Clear a possible back pointer in case the transition leads to a dead map.
// Return true in case a back pointer has been cleared and false otherwise. // Return true in case a back pointer has been cleared and false otherwise.
bool MarkCompactCollector::ClearMapBackPointer(Map* target) { bool MarkCompactCollector::ClearMapBackPointer(Map* target) {
if (Marking::IsBlackOrGrey(Marking::MarkBitFrom(target))) return false; DCHECK(!Marking::IsGrey(Marking::MarkBitFrom(target)));
if (Marking::IsBlack(Marking::MarkBitFrom(target))) return false;
target->SetBackPointer(heap_->undefined_value(), SKIP_WRITE_BARRIER); target->SetBackPointer(heap_->undefined_value(), SKIP_WRITE_BARRIER);
return true; return true;
} }
......
...@@ -83,12 +83,6 @@ class Marking : public AllStatic { ...@@ -83,12 +83,6 @@ class Marking : public AllStatic {
markbit.Clear(); markbit.Clear();
} }
INLINE(static void GreyToWhite(MarkBit markbit)) {
DCHECK(IsGrey(markbit));
markbit.Clear();
markbit.Next().Clear();
}
INLINE(static void BlackToGrey(MarkBit markbit)) { INLINE(static void BlackToGrey(MarkBit markbit)) {
DCHECK(IsBlack(markbit)); DCHECK(IsBlack(markbit));
markbit.Next().Set(); markbit.Next().Set();
......
...@@ -3146,7 +3146,7 @@ void LargeObjectSpace::ClearMarkingStateOfLiveObjects() { ...@@ -3146,7 +3146,7 @@ void LargeObjectSpace::ClearMarkingStateOfLiveObjects() {
while (current != NULL) { while (current != NULL) {
HeapObject* object = current->GetObject(); HeapObject* object = current->GetObject();
MarkBit mark_bit = Marking::MarkBitFrom(object); MarkBit mark_bit = Marking::MarkBitFrom(object);
DCHECK(Marking::IsBlackOrGrey(mark_bit)); DCHECK(Marking::IsBlack(mark_bit));
Marking::BlackToWhite(mark_bit); Marking::BlackToWhite(mark_bit);
Page::FromAddress(object->address())->ResetProgressBar(); Page::FromAddress(object->address())->ResetProgressBar();
Page::FromAddress(object->address())->ResetLiveBytes(); Page::FromAddress(object->address())->ResetLiveBytes();
...@@ -3161,7 +3161,8 @@ void LargeObjectSpace::FreeUnmarkedObjects() { ...@@ -3161,7 +3161,8 @@ void LargeObjectSpace::FreeUnmarkedObjects() {
while (current != NULL) { while (current != NULL) {
HeapObject* object = current->GetObject(); HeapObject* object = current->GetObject();
MarkBit mark_bit = Marking::MarkBitFrom(object); MarkBit mark_bit = Marking::MarkBitFrom(object);
if (Marking::IsBlackOrGrey(mark_bit)) { DCHECK(!Marking::IsGrey(mark_bit));
if (Marking::IsBlack(mark_bit)) {
previous = current; previous = current;
current = current->next_page(); current = current->next_page();
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment