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; |
} |