summaryrefslogtreecommitdiffstats
path: root/raul/AtomicPtr.hpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-09-17 18:39:05 +0000
committerDavid Robillard <d@drobilla.net>2011-09-17 18:39:05 +0000
commit2f749a2e0d38c5aae58fbf9947e9386e46ea1836 (patch)
tree129e7dcd3dc10526e9dca09f289e6c43b1f7a461 /raul/AtomicPtr.hpp
parent0b3655422c4ab955bb67014405efd715b1ff7d69 (diff)
downloadraul-2f749a2e0d38c5aae58fbf9947e9386e46ea1836.tar.gz
raul-2f749a2e0d38c5aae58fbf9947e9386e46ea1836.tar.bz2
raul-2f749a2e0d38c5aae58fbf9947e9386e46ea1836.zip
C++0x AtomicInt and AtomicPtr implementation.
git-svn-id: http://svn.drobilla.net/lad/trunk/raul@3468 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'raul/AtomicPtr.hpp')
-rw-r--r--raul/AtomicPtr.hpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/raul/AtomicPtr.hpp b/raul/AtomicPtr.hpp
index 9c13271..28797de 100644
--- a/raul/AtomicPtr.hpp
+++ b/raul/AtomicPtr.hpp
@@ -18,6 +18,39 @@
#ifndef RAUL_ATOMIC_PTR_HPP
#define RAUL_ATOMIC_PTR_HPP
+#ifdef RAUL_CPP0x
+
+#include <atomic>
+
+namespace Raul {
+
+/** Atomic pointer.
+ * \ingroup raul
+ */
+template<typename T>
+class AtomicPtr {
+public:
+ inline AtomicPtr() : _val(NULL) {}
+
+ inline AtomicPtr(const AtomicPtr& copy) : _val(copy.get()) {}
+
+ inline T* get() const { return static_cast<T*>(_val.load()); }
+
+ inline void operator=(T* val) { _val = val; }
+
+ /** Set value to newval iff current value is oldval */
+ inline bool compare_and_exchange(void* oldval, void* newval) {
+ return _val.compare_exchange_strong(oldval, newval);
+ }
+
+private:
+ std::atomic<void*> _val;
+};
+
+} // namespace Raul
+
+#else // !RAUL_CPP0x
+
#include <glib.h>
namespace Raul {
@@ -51,4 +84,6 @@ private:
} // namespace Raul
+#endif // RAUL_CPP0x
+
#endif // RAUL_ATOMIC_PTR_HPP