diff options
author | Ian Rogers <irogers@google.com> | 2014-05-20 16:40:37 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-05-20 21:17:03 -0700 |
commit | 3e5cf305db800b2989ad57b7cde8fb3cc9fa1b9e (patch) | |
tree | 52a737323ebd505cf37ca0e4b2dcee6524fba07f /runtime/gc/accounting/atomic_stack.h | |
parent | 27a2b70f612af9afc0fb5392fb10059f6a0a3569 (diff) | |
download | art-3e5cf305db800b2989ad57b7cde8fb3cc9fa1b9e.zip art-3e5cf305db800b2989ad57b7cde8fb3cc9fa1b9e.tar.gz art-3e5cf305db800b2989ad57b7cde8fb3cc9fa1b9e.tar.bz2 |
Begin migration of art::Atomic to std::atomic.
Change-Id: I4858d9cbed95e5ca560956b9dabd976cebe68333
Diffstat (limited to 'runtime/gc/accounting/atomic_stack.h')
-rw-r--r-- | runtime/gc/accounting/atomic_stack.h | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/runtime/gc/accounting/atomic_stack.h b/runtime/gc/accounting/atomic_stack.h index f3ed8d3..979970c 100644 --- a/runtime/gc/accounting/atomic_stack.h +++ b/runtime/gc/accounting/atomic_stack.h @@ -46,8 +46,8 @@ class AtomicStack { void Reset() { DCHECK(mem_map_.get() != NULL); DCHECK(begin_ != NULL); - front_index_ = 0; - back_index_ = 0; + front_index_.StoreRelaxed(0); + back_index_.StoreRelaxed(0); debug_is_sorted_ = true; int result = madvise(begin_, sizeof(T) * capacity_, MADV_DONTNEED); if (result == -1) { @@ -64,12 +64,12 @@ class AtomicStack { } int32_t index; do { - index = back_index_; + index = back_index_.LoadRelaxed(); if (UNLIKELY(static_cast<size_t>(index) >= capacity_)) { // Stack overflow. return false; } - } while (!back_index_.CompareAndSwap(index, index + 1)); + } while (!back_index_.CompareExchangeWeakRelaxed(index, index + 1)); begin_[index] = value; return true; } @@ -83,13 +83,13 @@ class AtomicStack { int32_t index; int32_t new_index; do { - index = back_index_; + index = back_index_.LoadRelaxed(); new_index = index + num_slots; if (UNLIKELY(static_cast<size_t>(new_index) >= capacity_)) { // Stack overflow. return false; } - } while (!back_index_.CompareAndSwap(index, new_index)); + } while (!back_index_.CompareExchangeWeakRelaxed(index, new_index)); *start_address = &begin_[index]; *end_address = &begin_[new_index]; if (kIsDebugBuild) { @@ -114,31 +114,31 @@ class AtomicStack { if (kIsDebugBuild) { debug_is_sorted_ = false; } - int32_t index = back_index_; + int32_t index = back_index_.LoadRelaxed(); DCHECK_LT(static_cast<size_t>(index), capacity_); - back_index_ = index + 1; + back_index_.StoreRelaxed(index + 1); begin_[index] = value; } T PopBack() { - DCHECK_GT(back_index_, front_index_); + DCHECK_GT(back_index_.LoadRelaxed(), front_index_.LoadRelaxed()); // Decrement the back index non atomically. - back_index_ = back_index_ - 1; - return begin_[back_index_]; + back_index_.StoreRelaxed(back_index_.LoadRelaxed() - 1); + return begin_[back_index_.LoadRelaxed()]; } // Take an item from the front of the stack. T PopFront() { - int32_t index = front_index_; - DCHECK_LT(index, back_index_.Load()); - front_index_ = front_index_ + 1; + int32_t index = front_index_.LoadRelaxed(); + DCHECK_LT(index, back_index_.LoadRelaxed()); + front_index_.StoreRelaxed(index + 1); return begin_[index]; } // Pop a number of elements. void PopBackCount(int32_t n) { DCHECK_GE(Size(), static_cast<size_t>(n)); - back_index_.FetchAndSub(n); + back_index_.FetchAndSubSequentiallyConsistent(n); } bool IsEmpty() const { @@ -146,16 +146,16 @@ class AtomicStack { } size_t Size() const { - DCHECK_LE(front_index_, back_index_); - return back_index_ - front_index_; + DCHECK_LE(front_index_.LoadRelaxed(), back_index_.LoadRelaxed()); + return back_index_.LoadRelaxed() - front_index_.LoadRelaxed(); } T* Begin() const { - return const_cast<T*>(begin_ + front_index_); + return const_cast<T*>(begin_ + front_index_.LoadRelaxed()); } T* End() const { - return const_cast<T*>(begin_ + back_index_); + return const_cast<T*>(begin_ + back_index_.LoadRelaxed()); } size_t Capacity() const { @@ -169,11 +169,11 @@ class AtomicStack { } void Sort() { - int32_t start_back_index = back_index_.Load(); - int32_t start_front_index = front_index_.Load(); + int32_t start_back_index = back_index_.LoadRelaxed(); + int32_t start_front_index = front_index_.LoadRelaxed(); std::sort(Begin(), End()); - CHECK_EQ(start_back_index, back_index_.Load()); - CHECK_EQ(start_front_index, front_index_.Load()); + CHECK_EQ(start_back_index, back_index_.LoadRelaxed()); + CHECK_EQ(start_front_index, front_index_.LoadRelaxed()); if (kIsDebugBuild) { debug_is_sorted_ = true; } |