OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_MARKING_H | 5 #ifndef V8_MARKING_H |
6 #define V8_MARKING_H | 6 #define V8_MARKING_H |
7 | 7 |
8 #include "src/base/atomic-utils.h" | 8 #include "src/base/atomic-utils.h" |
9 #include "src/utils.h" | 9 #include "src/utils.h" |
10 | 10 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 base::Atomic32 old_value = *cell_; | 64 base::Atomic32 old_value = *cell_; |
65 *cell_ = old_value | mask_; | 65 *cell_ = old_value | mask_; |
66 return (old_value & mask_) == 0; | 66 return (old_value & mask_) == 0; |
67 } | 67 } |
68 | 68 |
69 template <> | 69 template <> |
70 inline bool MarkBit::Set<MarkBit::ATOMIC>() { | 70 inline bool MarkBit::Set<MarkBit::ATOMIC>() { |
71 base::Atomic32 old_value; | 71 base::Atomic32 old_value; |
72 base::Atomic32 new_value; | 72 base::Atomic32 new_value; |
73 do { | 73 do { |
74 old_value = base::NoBarrier_Load(cell_); | 74 old_value = base::Relaxed_Load(cell_); |
75 if (old_value & mask_) return false; | 75 if (old_value & mask_) return false; |
76 new_value = old_value | mask_; | 76 new_value = old_value | mask_; |
77 } while (base::Release_CompareAndSwap(cell_, old_value, new_value) != | 77 } while (base::Release_CompareAndSwap(cell_, old_value, new_value) != |
78 old_value); | 78 old_value); |
79 return true; | 79 return true; |
80 } | 80 } |
81 | 81 |
82 template <> | 82 template <> |
83 inline bool MarkBit::Get<MarkBit::NON_ATOMIC>() { | 83 inline bool MarkBit::Get<MarkBit::NON_ATOMIC>() { |
84 return (base::NoBarrier_Load(cell_) & mask_) != 0; | 84 return (base::Relaxed_Load(cell_) & mask_) != 0; |
85 } | 85 } |
86 | 86 |
87 template <> | 87 template <> |
88 inline bool MarkBit::Get<MarkBit::ATOMIC>() { | 88 inline bool MarkBit::Get<MarkBit::ATOMIC>() { |
89 return (base::Acquire_Load(cell_) & mask_) != 0; | 89 return (base::Acquire_Load(cell_) & mask_) != 0; |
90 } | 90 } |
91 | 91 |
92 template <> | 92 template <> |
93 inline bool MarkBit::Clear<MarkBit::NON_ATOMIC>() { | 93 inline bool MarkBit::Clear<MarkBit::NON_ATOMIC>() { |
94 base::Atomic32 old_value = *cell_; | 94 base::Atomic32 old_value = *cell_; |
95 *cell_ = old_value & ~mask_; | 95 *cell_ = old_value & ~mask_; |
96 return (old_value & mask_) == mask_; | 96 return (old_value & mask_) == mask_; |
97 } | 97 } |
98 | 98 |
99 template <> | 99 template <> |
100 inline bool MarkBit::Clear<MarkBit::ATOMIC>() { | 100 inline bool MarkBit::Clear<MarkBit::ATOMIC>() { |
101 base::Atomic32 old_value; | 101 base::Atomic32 old_value; |
102 base::Atomic32 new_value; | 102 base::Atomic32 new_value; |
103 do { | 103 do { |
104 old_value = base::NoBarrier_Load(cell_); | 104 old_value = base::Relaxed_Load(cell_); |
105 if (!(old_value & mask_)) return false; | 105 if (!(old_value & mask_)) return false; |
106 new_value = old_value & ~mask_; | 106 new_value = old_value & ~mask_; |
107 } while (base::Release_CompareAndSwap(cell_, old_value, new_value) != | 107 } while (base::Release_CompareAndSwap(cell_, old_value, new_value) != |
108 old_value); | 108 old_value); |
109 return true; | 109 return true; |
110 } | 110 } |
111 | 111 |
112 // Bitmap is a sequence of cells each containing fixed number of bits. | 112 // Bitmap is a sequence of cells each containing fixed number of bits. |
113 class Bitmap { | 113 class Bitmap { |
114 public: | 114 public: |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 } | 460 } |
461 | 461 |
462 private: | 462 private: |
463 DISALLOW_IMPLICIT_CONSTRUCTORS(Marking); | 463 DISALLOW_IMPLICIT_CONSTRUCTORS(Marking); |
464 }; | 464 }; |
465 | 465 |
466 } // namespace internal | 466 } // namespace internal |
467 } // namespace v8 | 467 } // namespace v8 |
468 | 468 |
469 #endif // V8_MARKING_H_ | 469 #endif // V8_MARKING_H_ |
OLD | NEW |