summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/winapi/test/run/interlocked.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/winapi/test/run/interlocked.cpp')
-rw-r--r--src/boost/libs/winapi/test/run/interlocked.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/boost/libs/winapi/test/run/interlocked.cpp b/src/boost/libs/winapi/test/run/interlocked.cpp
new file mode 100644
index 000000000..cfaf62c9e
--- /dev/null
+++ b/src/boost/libs/winapi/test/run/interlocked.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright Andrey Semashev 2019.
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ */
+/*!
+ * \file interlocked.cpp
+ * \author Andrey Semashev
+ * \date 10.07.2019
+ *
+ * \brief This file contains test for interlocked.hpp
+ */
+
+#include <boost/detail/interlocked.hpp>
+#include <windows.h> // include to test there are no conflicts with Windows SDK
+#include <boost/cstdint.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+void test_int32()
+{
+ boost::int32_t n = 0, r = 0;
+
+ r = BOOST_INTERLOCKED_INCREMENT(&n);
+ BOOST_TEST_EQ(n, 1);
+ BOOST_TEST_EQ(r, 1);
+ r = BOOST_INTERLOCKED_DECREMENT(&n);
+ BOOST_TEST_EQ(n, 0);
+ BOOST_TEST_EQ(r, 0);
+ r = BOOST_INTERLOCKED_COMPARE_EXCHANGE(&n, 2, 0);
+ BOOST_TEST_EQ(n, 2);
+ BOOST_TEST_EQ(r, 0);
+ r = BOOST_INTERLOCKED_EXCHANGE(&n, 3);
+ BOOST_TEST_EQ(n, 3);
+ BOOST_TEST_EQ(r, 2);
+ r = BOOST_INTERLOCKED_EXCHANGE_ADD(&n, 10);
+ BOOST_TEST_EQ(n, 13);
+ BOOST_TEST_EQ(r, 3);
+}
+
+void test_pointer()
+{
+ void* p = 0;
+ void* q = 0;
+
+ q = BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(&p, (void*)&q, (void*)0);
+ BOOST_TEST_EQ(p, (void*)&q);
+ BOOST_TEST_EQ(q, (void*)0);
+ q = BOOST_INTERLOCKED_EXCHANGE_POINTER(&p, (void*)0);
+ BOOST_TEST_EQ(p, (void*)0);
+ BOOST_TEST_EQ(q, (void*)&q);
+}
+
+int main()
+{
+ test_int32();
+ test_pointer();
+
+ return boost::report_errors();
+}