Commit db4d4f29 authored by Aaryaman Sagar's avatar Aaryaman Sagar Committed by Facebook Github Bot

Fix RMW bug in DeterministicSchedule

Summary:
There were some read-modify-write operations that were behaving as read and
then modify.  This is incorrect when you use DeterministicAtomic without a
backing schedule.

This is okay if the test is operating in the presence of a
DeterministicSchedule schedule, but is probably worth fixing anyway.  If using
DeterministicAtomic without a backing schedule is considered a bug, we can add
an assertion in beforeSharedAccess() and afterSharedAccess() so users know not
to try that

Reviewed By: djwatson, nbronson

Differential Revision: D10190682

fbshipit-source-id: 6a3173d904a40bbc5c96b934a76aff90a48c8608
parent 80b2ad02
......@@ -292,7 +292,7 @@ struct DeterministicAtomic {
/* implicit */ operator T() const noexcept {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
T rv = data.operator T();
FOLLY_TEST_DSCHED_VLOG(this << "() -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
return rv;
......@@ -362,12 +362,9 @@ struct DeterministicAtomic {
return rv;
}
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 {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
data += v;
T rv = data.fetch_add(v, mo);
FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_add(" << std::hex << v << ") -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
......@@ -383,12 +380,9 @@ struct DeterministicAtomic {
return rv;
}
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 {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
data -= v;
T rv = data.fetch_sub(v, mo);
FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_sub(" << std::hex << v << ") -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
......@@ -404,12 +398,9 @@ struct DeterministicAtomic {
return rv;
}
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 {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
data &= v;
T rv = data.fetch_and(v, mo);
FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_and(" << std::hex << v << ") -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
......@@ -425,12 +416,9 @@ struct DeterministicAtomic {
return rv;
}
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 {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
data |= v;
T rv = data.fetch_or(v, mo);
FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_or(" << std::hex << v << ") -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
......@@ -446,12 +434,9 @@ struct DeterministicAtomic {
return rv;
}
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 {
DeterministicSchedule::beforeSharedAccess();
T rv = data;
data ^= v;
T rv = data.fetch_xor(v, mo);
FOLLY_TEST_DSCHED_VLOG(
this << ".fetch_xor(" << std::hex << v << ") -> " << std::hex << rv);
DeterministicSchedule::afterSharedAccess(true);
......
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