1 | // thread_safe_signals library |
2 | // basic test for alternate threading models |
3 | |
4 | // Copyright Frank Mori Hess 2008 |
5 | // Use, modification and |
6 | // distribution is subject to the Boost Software License, Version |
7 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
8 | // http://www.boost.org/LICENSE_1_0.txt) |
9 | |
10 | // For more information, see http://www.boost.org |
11 | |
12 | #include <boost/signals2.hpp> |
13 | #define BOOST_TEST_MODULE threading_models_test |
14 | #include <boost/test/included/unit_test.hpp> |
15 | #include <boost/thread/mutex.hpp> |
16 | |
17 | // combiner that returns the number of slots invoked |
18 | struct slot_counter { |
19 | typedef unsigned result_type; |
20 | template<typename InputIterator> |
21 | unsigned operator()(InputIterator first, InputIterator last) const |
22 | { |
23 | unsigned count = 0; |
24 | for (; first != last; ++first) |
25 | { |
26 | try |
27 | { |
28 | *first; |
29 | ++count; |
30 | } |
31 | catch(const boost::bad_weak_ptr &) |
32 | {} |
33 | } |
34 | return count; |
35 | } |
36 | }; |
37 | |
38 | void myslot() |
39 | { |
40 | } |
41 | |
42 | template<typename signal_type> |
43 | void simple_test() |
44 | { |
45 | signal_type sig; |
46 | sig.connect(typename signal_type::slot_type(&myslot)); |
47 | BOOST_CHECK(sig() == 1); |
48 | sig.disconnect(&myslot); |
49 | BOOST_CHECK(sig() == 0); |
50 | } |
51 | |
52 | class recursion_checking_dummy_mutex |
53 | { |
54 | int recursion_count; |
55 | public: |
56 | recursion_checking_dummy_mutex(): recursion_count(0) |
57 | {} |
58 | void lock() |
59 | { |
60 | BOOST_REQUIRE(recursion_count == 0); |
61 | ++recursion_count; |
62 | } |
63 | bool try_lock() |
64 | { |
65 | lock(); |
66 | return true; |
67 | } |
68 | void unlock() |
69 | { |
70 | --recursion_count; |
71 | BOOST_REQUIRE(recursion_count == 0); |
72 | } |
73 | }; |
74 | |
75 | BOOST_AUTO_TEST_CASE(test_main) |
76 | { |
77 | typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>, |
78 | boost::function<void (const boost::signals2::connection &)>, recursion_checking_dummy_mutex> sig0_rc_type; |
79 | simple_test<sig0_rc_type>(); |
80 | typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>, |
81 | boost::function<void (const boost::signals2::connection &)>, boost::mutex> sig0_mt_type; |
82 | simple_test<sig0_mt_type>(); |
83 | typedef boost::signals2::signal<void (), slot_counter, int, std::less<int>, boost::function<void ()>, |
84 | boost::function<void (const boost::signals2::connection &)>, boost::signals2::dummy_mutex> sig0_st_type; |
85 | simple_test<sig0_st_type>(); |
86 | } |
87 | |