Add LoggedAtomic<> debug class 44/67944/6
authorDave Rigby <daver@couchbase.com>
Fri, 23 Sep 2016 10:29:54 +0000 (11:29 +0100)
committerDave Rigby <daver@couchbase.com>
Fri, 30 Sep 2016 09:06:14 +0000 (09:06 +0000)
A Debugging wrapper around std::atomic which print all accesses to the
atomic value to stderr.

Drop-in compatible with AtomicValue for simple use-cases - currently
only implements load() / store().

Change-Id: I78cec4d8bad55588900573f201d81a38f16f97ee
Reviewed-on: http://review.couchbase.org/67944
Tested-by: buildbot <build@couchbase.com>
Reviewed-by: Daniel Owen <owend@couchbase.com>
src/atomic.h

index 98f2f03..55cb63e 100644 (file)
@@ -329,4 +329,33 @@ private:
     T *value;
 };
 
+
+/**
+ * Debugging wrapper around std::atomic which print all accesses to the atomic
+ * value to stderr.
+ */
+template <typename T>
+class LoggedAtomic {
+public:
+    LoggedAtomic(T initial)
+        : value(initial) {
+        std::cerr << "LoggedAtomic[" << this << "]::LoggedAtomic: " << value.load() << std::endl;
+
+    }
+
+    T load() const {
+        auto result = value.load();
+        std::cerr << "LoggedAtomic[" << this << "]::load: " << result << std::endl;
+        return result;
+    }
+
+    void store(T desired) {
+        value.store(desired);
+        std::cerr << "LoggedAtomic[" << this << "]::store: " << value.load() << std::endl;
+    }
+
+protected:
+    std::atomic<T> value;
+};
+
 #endif  // SRC_ATOMIC_H_