| 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 {
|
|
|