summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/signals2/test/threading_models_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/signals2/test/threading_models_test.cpp')
-rw-r--r--src/boost/libs/signals2/test/threading_models_test.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/boost/libs/signals2/test/threading_models_test.cpp b/src/boost/libs/signals2/test/threading_models_test.cpp
new file mode 100644
index 00000000..d9bf00c2
--- /dev/null
+++ b/src/boost/libs/signals2/test/threading_models_test.cpp
@@ -0,0 +1,90 @@
+// thread_safe_signals library
+// basic test for alternate threading models
+
+// Copyright Frank Mori Hess 2008
+// Use, modification and
+// distribution is subject to 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)
+
+// For more information, see http://www.boost.org
+
+// note boost/test/minimal.hpp can cause windows.h to get included, which
+// can screw up our checks of _WIN32_WINNT if it is included
+// after boost/signals2/mutex.hpp. Frank Hess 2009-03-07.
+#include <boost/test/minimal.hpp>
+
+#include <boost/signals2.hpp>
+#include <boost/thread/mutex.hpp>
+
+// combiner that returns the number of slots invoked
+struct slot_counter {
+ typedef unsigned result_type;
+ template<typename InputIterator>
+ unsigned operator()(InputIterator first, InputIterator last) const
+ {
+ unsigned count = 0;
+ for (; first != last; ++first)
+ {
+ try
+ {
+ *first;
+ ++count;
+ }
+ catch(const boost::bad_weak_ptr &)
+ {}
+ }
+ return count;
+ }
+};
+
+void myslot()
+{
+}
+
+template<typename signal_type>
+void simple_test()
+{
+ signal_type sig;
+ sig.connect(typename signal_type::slot_type(&myslot));
+ BOOST_CHECK(sig() == 1);
+ sig.disconnect(&myslot);
+ BOOST_CHECK(sig() == 0);
+}
+
+class recursion_checking_dummy_mutex
+{
+ int recursion_count;
+public:
+ recursion_checking_dummy_mutex(): recursion_count(0)
+ {}
+ void lock()
+ {
+ BOOST_REQUIRE(recursion_count == 0);
+ ++recursion_count;
+ }
+ bool try_lock()
+ {
+ lock();
+ return true;
+ }
+ void unlock()
+ {
+ --recursion_count;
+ BOOST_REQUIRE(recursion_count == 0);
+ }
+};
+
+int test_main(int, char*[])
+{
+ typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
+ boost::function<void (const boost::signals2::connection &)>, recursion_checking_dummy_mutex> sig0_rc_type;
+ simple_test<sig0_rc_type>();
+ typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
+ boost::function<void (const boost::signals2::connection &)>, boost::mutex> sig0_mt_type;
+ simple_test<sig0_mt_type>();
+ typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>,
+ boost::function<void (const boost::signals2::connection &)>, boost::signals2::dummy_mutex> sig0_st_type;
+ simple_test<sig0_st_type>();
+ return 0;
+}