Index: src/heap/marking.h |
diff --git a/src/heap/marking.h b/src/heap/marking.h |
index ab98a124bc4c77c63f4815b93453a088aad8fae6..b20a4d86f149bb7012d648563e47b90613c9fd5b 100644 |
--- a/src/heap/marking.h |
+++ b/src/heap/marking.h |
@@ -38,16 +38,12 @@ |
} |
} |
- // The function returns true if it succeeded to |
- // transition the bit from 0 to 1. |
template <AccessMode mode = NON_ATOMIC> |
inline bool Set(); |
template <AccessMode mode = NON_ATOMIC> |
inline bool Get(); |
- // The function returns true if it succeeded to |
- // transition the bit from 1 to 0. |
template <AccessMode mode = NON_ATOMIC> |
inline bool Clear(); |
@@ -61,9 +57,8 @@ |
template <> |
inline bool MarkBit::Set<MarkBit::NON_ATOMIC>() { |
- base::Atomic32 old_value = *cell_; |
- *cell_ = old_value | mask_; |
- return (old_value & mask_) == 0; |
+ *cell_ |= mask_; |
+ return true; |
} |
template <> |
@@ -91,9 +86,8 @@ |
template <> |
inline bool MarkBit::Clear<MarkBit::NON_ATOMIC>() { |
- base::Atomic32 old_value = *cell_; |
- *cell_ = old_value & ~mask_; |
- return (old_value & mask_) == mask_; |
+ *cell_ &= ~mask_; |
+ return true; |
} |
template <> |
@@ -418,17 +412,24 @@ |
template <MarkBit::AccessMode mode = MarkBit::NON_ATOMIC> |
INLINE(static bool WhiteToGrey(MarkBit markbit)) { |
+ DCHECK(mode == MarkBit::ATOMIC || IsWhite(markbit)); |
return markbit.Set<mode>(); |
} |
- template <MarkBit::AccessMode mode = MarkBit::NON_ATOMIC> |
- INLINE(static bool WhiteToBlack(MarkBit markbit)) { |
- return markbit.Set<mode>() && markbit.Next().Set<mode>(); |
+ // Warning: this method is not safe in general in concurrent scenarios. |
+ // If you know that nobody else will change the bits on the given location |
+ // then you may use it. |
+ template <MarkBit::AccessMode mode = MarkBit::NON_ATOMIC> |
+ INLINE(static void WhiteToBlack(MarkBit markbit)) { |
+ DCHECK(mode == MarkBit::ATOMIC || IsWhite(markbit)); |
+ markbit.Set<mode>(); |
+ markbit.Next().Set<mode>(); |
} |
template <MarkBit::AccessMode mode = MarkBit::NON_ATOMIC> |
INLINE(static bool GreyToBlack(MarkBit markbit)) { |
- return markbit.Get<mode>() && markbit.Next().Set<mode>(); |
+ DCHECK(mode == MarkBit::ATOMIC || IsGrey(markbit)); |
+ return markbit.Next().Set<mode>(); |
} |
enum ObjectColor { |