From b446406a8ccf21b640d1359aee0e9f285a87245c Mon Sep 17 00:00:00 2001 From: Nathan Bronson Date: Mon, 2 Feb 2015 08:46:18 -0800 Subject: [PATCH] add some missing methods to DeterministicAtomic Summary: fetch_and and fetch_or are actually required in some instances, since the operation they perform isn't reversible. This also adds some other missing functions, ^= and fetch_{add,sub,xor}. Test Plan: use from other code's unit tests Reviewed By: mssarang@fb.com Subscribers: yfeldblum, folly-diffs@ FB internal diff: D1798924 Signature: t1:1798924:1422892374:a9859039075ddcac54f75259b9bc6a29bb963a09 --- folly/test/DeterministicSchedule.h | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/folly/test/DeterministicSchedule.h b/folly/test/DeterministicSchedule.h index 4862ac9f..57ab5bd2 100644 --- a/folly/test/DeterministicSchedule.h +++ b/folly/test/DeterministicSchedule.h @@ -248,6 +248,14 @@ struct DeterministicAtomic { return rv; } + T fetch_add(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = data; + data += v; + DeterministicSchedule::afterSharedAccess(); + return rv; + } + T operator-= (T v) noexcept { DeterministicSchedule::beforeSharedAccess(); T rv = (data -= v); @@ -255,6 +263,14 @@ struct DeterministicAtomic { return rv; } + T fetch_sub(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = data; + data -= v; + DeterministicSchedule::afterSharedAccess(); + return rv; + } + T operator&= (T v) noexcept { DeterministicSchedule::beforeSharedAccess(); T rv = (data &= v); @@ -262,12 +278,43 @@ struct DeterministicAtomic { return rv; } + T fetch_and(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = data; + data &= v; + DeterministicSchedule::afterSharedAccess(); + return rv; + } + T operator|= (T v) noexcept { DeterministicSchedule::beforeSharedAccess(); T rv = (data |= v); DeterministicSchedule::afterSharedAccess(); return rv; } + + T fetch_or(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = data; + data |= v; + DeterministicSchedule::afterSharedAccess(); + return rv; + } + + T operator^= (T v) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = (data ^= v); + DeterministicSchedule::afterSharedAccess(); + return rv; + } + + T fetch_xor(T v, std::memory_order mo = std::memory_order_seq_cst) noexcept { + DeterministicSchedule::beforeSharedAccess(); + T rv = data; + data ^= v; + DeterministicSchedule::afterSharedAccess(); + return rv; + } }; }} // namespace folly::test -- 2.34.1