From: Nathan Bronson <ngbronson@fb.com>
Date: Mon, 2 Feb 2015 16:46:18 +0000 (-0800)
Subject: add some missing methods to DeterministicAtomic
X-Git-Tag: v0.23.0~2
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b446406a8ccf21b640d1359aee0e9f285a87245c;p=folly.git

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
---

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