| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index f63d6725ec2981afdf13b294c8a7de8a76d51f31..68664885349b21822a3fc0ab9049899952929ad1 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -1110,11 +1110,35 @@ bool HeapObject::IsMarked() {
|
| }
|
|
|
|
|
| -void HeapObject::SetMark() {
|
| - ASSERT(!IsMarked());
|
| +bool HeapObject::SetMark() {
|
| MapWord first_word = map_word();
|
| - first_word.SetMark();
|
| - set_map_word(first_word);
|
| +
|
| + if (!first_word.IsMarked()) {
|
| + first_word.SetMark();
|
| + set_map_word(first_word);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +
|
| +bool HeapObject::SetMarkExclusively() {
|
| + MapWord first_word = map_word();
|
| +
|
| + if (!first_word.IsMarked()) {
|
| + MapWord new_first_word = first_word;
|
| + new_first_word.SetMark();
|
| +
|
| + AtomicWord* map_word_slot =
|
| + reinterpret_cast<AtomicWord*>(this->address() + kMapOffset);
|
| +
|
| + return AtomicCompareAndSwap(map_word_slot,
|
| + static_cast<AtomicWord>(first_word.value_),
|
| + static_cast<AtomicWord>(new_first_word.value_));
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
|
|
|
|