Commit cda0ac8f authored by Doron Roberts-Kedes's avatar Doron Roberts-Kedes Committed by Facebook Github Bot

DeterministicSchedule: Make data field of DeterministicAtomic private and rename to data_

Summary: See title.

Reviewed By: yfeldblum

Differential Revision: D10418223

fbshipit-source-id: 262c92581ba6b36741f647e6cde624a4372436cf
parent c831d06b
...@@ -326,7 +326,7 @@ detail::FutexResult futexWaitImpl( ...@@ -326,7 +326,7 @@ detail::FutexResult futexWaitImpl(
"futexWait(" << futex << ", " << std::hex << expected << ", .., " "futexWait(" << futex << ", " << std::hex << expected << ", .., "
<< std::hex << waitMask << ") beginning.."); << std::hex << waitMask << ") beginning..");
futexLock.lock(); futexLock.lock();
if (futex->data == expected) { if (futex->load_direct() == expected) {
auto& queue = futexQueues[futex]; auto& queue = futexQueues[futex];
queue.emplace_back(waitMask, &awoken); queue.emplace_back(waitMask, &awoken);
auto ours = queue.end(); auto ours = queue.end();
......
...@@ -224,18 +224,16 @@ class DeterministicSchedule : boost::noncopyable { ...@@ -224,18 +224,16 @@ class DeterministicSchedule : boost::noncopyable {
*/ */
template <typename T, typename Schedule = DeterministicSchedule> template <typename T, typename Schedule = DeterministicSchedule>
struct DeterministicAtomicImpl { struct DeterministicAtomicImpl {
std::atomic<T> data;
DeterministicAtomicImpl() = default; DeterministicAtomicImpl() = default;
~DeterministicAtomicImpl() = default; ~DeterministicAtomicImpl() = default;
DeterministicAtomicImpl(DeterministicAtomicImpl<T> const&) = delete; DeterministicAtomicImpl(DeterministicAtomicImpl<T> const&) = delete;
DeterministicAtomicImpl<T>& operator=(DeterministicAtomicImpl<T> const&) = DeterministicAtomicImpl<T>& operator=(DeterministicAtomicImpl<T> const&) =
delete; delete;
constexpr /* implicit */ DeterministicAtomicImpl(T v) noexcept : data(v) {} constexpr /* implicit */ DeterministicAtomicImpl(T v) noexcept : data_(v) {}
bool is_lock_free() const noexcept { bool is_lock_free() const noexcept {
return data.is_lock_free(); return data_.is_lock_free();
} }
bool compare_exchange_strong( bool compare_exchange_strong(
...@@ -252,7 +250,7 @@ struct DeterministicAtomicImpl { ...@@ -252,7 +250,7 @@ struct DeterministicAtomicImpl {
std::memory_order failure) noexcept { std::memory_order failure) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
auto orig = v0; auto orig = v0;
bool rv = data.compare_exchange_strong(v0, v1, success, failure); bool rv = data_.compare_exchange_strong(v0, v1, success, failure);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".compare_exchange_strong(" << std::hex << orig << ", " this << ".compare_exchange_strong(" << std::hex << orig << ", "
<< std::hex << v1 << ") -> " << rv << "," << std::hex << v0); << std::hex << v1 << ") -> " << rv << "," << std::hex << v0);
...@@ -274,7 +272,7 @@ struct DeterministicAtomicImpl { ...@@ -274,7 +272,7 @@ struct DeterministicAtomicImpl {
std::memory_order failure) noexcept { std::memory_order failure) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
auto orig = v0; auto orig = v0;
bool rv = data.compare_exchange_weak(v0, v1, success, failure); bool rv = data_.compare_exchange_weak(v0, v1, success, failure);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".compare_exchange_weak(" << std::hex << orig << ", " this << ".compare_exchange_weak(" << std::hex << orig << ", "
<< std::hex << v1 << ") -> " << rv << "," << std::hex << v0); << std::hex << v1 << ") -> " << rv << "," << std::hex << v0);
...@@ -284,7 +282,7 @@ struct DeterministicAtomicImpl { ...@@ -284,7 +282,7 @@ struct DeterministicAtomicImpl {
T exchange(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T exchange(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.exchange(v, mo); T rv = data_.exchange(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".exchange(" << std::hex << v << ") -> " << std::hex << rv); this << ".exchange(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -293,7 +291,7 @@ struct DeterministicAtomicImpl { ...@@ -293,7 +291,7 @@ struct DeterministicAtomicImpl {
/* implicit */ operator T() const noexcept { /* implicit */ operator T() const noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.operator T(); T rv = data_.operator T();
FOLLY_TEST_DSCHED_VLOG(this << "() -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << "() -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -301,7 +299,7 @@ struct DeterministicAtomicImpl { ...@@ -301,7 +299,7 @@ struct DeterministicAtomicImpl {
T load(std::memory_order mo = std::memory_order_seq_cst) const noexcept { T load(std::memory_order mo = std::memory_order_seq_cst) const noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.load(mo); T rv = data_.load(mo);
FOLLY_TEST_DSCHED_VLOG(this << ".load() -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << ".load() -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -309,7 +307,7 @@ struct DeterministicAtomicImpl { ...@@ -309,7 +307,7 @@ struct DeterministicAtomicImpl {
T operator=(T v) noexcept { T operator=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data = v); T rv = (data_ = v);
FOLLY_TEST_DSCHED_VLOG(this << " = " << std::hex << v); FOLLY_TEST_DSCHED_VLOG(this << " = " << std::hex << v);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -317,14 +315,14 @@ struct DeterministicAtomicImpl { ...@@ -317,14 +315,14 @@ struct DeterministicAtomicImpl {
void store(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { void store(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
data.store(v, mo); data_.store(v, mo);
FOLLY_TEST_DSCHED_VLOG(this << ".store(" << std::hex << v << ")"); FOLLY_TEST_DSCHED_VLOG(this << ".store(" << std::hex << v << ")");
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
} }
T operator++() noexcept { T operator++() noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = ++data; T rv = ++data_;
FOLLY_TEST_DSCHED_VLOG(this << " pre++ -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << " pre++ -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -332,7 +330,7 @@ struct DeterministicAtomicImpl { ...@@ -332,7 +330,7 @@ struct DeterministicAtomicImpl {
T operator++(int /* postDummy */) noexcept { T operator++(int /* postDummy */) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data++; T rv = data_++;
FOLLY_TEST_DSCHED_VLOG(this << " post++ -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << " post++ -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -340,7 +338,7 @@ struct DeterministicAtomicImpl { ...@@ -340,7 +338,7 @@ struct DeterministicAtomicImpl {
T operator--() noexcept { T operator--() noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = --data; T rv = --data_;
FOLLY_TEST_DSCHED_VLOG(this << " pre-- -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << " pre-- -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -348,7 +346,7 @@ struct DeterministicAtomicImpl { ...@@ -348,7 +346,7 @@ struct DeterministicAtomicImpl {
T operator--(int /* postDummy */) noexcept { T operator--(int /* postDummy */) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data--; T rv = data_--;
FOLLY_TEST_DSCHED_VLOG(this << " post-- -> " << std::hex << rv); FOLLY_TEST_DSCHED_VLOG(this << " post-- -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
return rv; return rv;
...@@ -356,7 +354,7 @@ struct DeterministicAtomicImpl { ...@@ -356,7 +354,7 @@ struct DeterministicAtomicImpl {
T operator+=(T v) noexcept { T operator+=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data += v); T rv = (data_ += v);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << " += " << std::hex << v << " -> " << std::hex << rv); this << " += " << std::hex << v << " -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -365,7 +363,7 @@ struct DeterministicAtomicImpl { ...@@ -365,7 +363,7 @@ struct DeterministicAtomicImpl {
T fetch_add(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T fetch_add(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.fetch_add(v, mo); T rv = data_.fetch_add(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_add(" << std::hex << v << ") -> " << std::hex << rv); this << ".fetch_add(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -374,7 +372,7 @@ struct DeterministicAtomicImpl { ...@@ -374,7 +372,7 @@ struct DeterministicAtomicImpl {
T operator-=(T v) noexcept { T operator-=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data -= v); T rv = (data_ -= v);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << " -= " << std::hex << v << " -> " << std::hex << rv); this << " -= " << std::hex << v << " -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -383,7 +381,7 @@ struct DeterministicAtomicImpl { ...@@ -383,7 +381,7 @@ struct DeterministicAtomicImpl {
T fetch_sub(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T fetch_sub(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.fetch_sub(v, mo); T rv = data_.fetch_sub(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_sub(" << std::hex << v << ") -> " << std::hex << rv); this << ".fetch_sub(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -392,7 +390,7 @@ struct DeterministicAtomicImpl { ...@@ -392,7 +390,7 @@ struct DeterministicAtomicImpl {
T operator&=(T v) noexcept { T operator&=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data &= v); T rv = (data_ &= v);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << " &= " << std::hex << v << " -> " << std::hex << rv); this << " &= " << std::hex << v << " -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -401,7 +399,7 @@ struct DeterministicAtomicImpl { ...@@ -401,7 +399,7 @@ struct DeterministicAtomicImpl {
T fetch_and(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T fetch_and(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.fetch_and(v, mo); T rv = data_.fetch_and(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_and(" << std::hex << v << ") -> " << std::hex << rv); this << ".fetch_and(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -410,7 +408,7 @@ struct DeterministicAtomicImpl { ...@@ -410,7 +408,7 @@ struct DeterministicAtomicImpl {
T operator|=(T v) noexcept { T operator|=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data |= v); T rv = (data_ |= v);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << " |= " << std::hex << v << " -> " << std::hex << rv); this << " |= " << std::hex << v << " -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -419,7 +417,7 @@ struct DeterministicAtomicImpl { ...@@ -419,7 +417,7 @@ struct DeterministicAtomicImpl {
T fetch_or(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T fetch_or(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.fetch_or(v, mo); T rv = data_.fetch_or(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_or(" << std::hex << v << ") -> " << std::hex << rv); this << ".fetch_or(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -428,7 +426,7 @@ struct DeterministicAtomicImpl { ...@@ -428,7 +426,7 @@ struct DeterministicAtomicImpl {
T operator^=(T v) noexcept { T operator^=(T v) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = (data ^= v); T rv = (data_ ^= v);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << " ^= " << std::hex << v << " -> " << std::hex << rv); this << " ^= " << std::hex << v << " -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -437,7 +435,7 @@ struct DeterministicAtomicImpl { ...@@ -437,7 +435,7 @@ struct DeterministicAtomicImpl {
T fetch_xor(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { T fetch_xor(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept {
Schedule::beforeSharedAccess(); Schedule::beforeSharedAccess();
T rv = data.fetch_xor(v, mo); T rv = data_.fetch_xor(v, mo);
FOLLY_TEST_DSCHED_VLOG( FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_xor(" << std::hex << v << ") -> " << std::hex << rv); this << ".fetch_xor(" << std::hex << v << ") -> " << std::hex << rv);
Schedule::afterSharedAccess(true); Schedule::afterSharedAccess(true);
...@@ -446,8 +444,11 @@ struct DeterministicAtomicImpl { ...@@ -446,8 +444,11 @@ struct DeterministicAtomicImpl {
/** Read the value of the atomic variable without context switching */ /** Read the value of the atomic variable without context switching */
T load_direct() const noexcept { T load_direct() const noexcept {
return data.load(std::memory_order_relaxed); return data_.load(std::memory_order_relaxed);
} }
private:
std::atomic<T> data_;
}; };
template <typename T> template <typename T>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment