• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>
operator ()slot_counter21   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 
myslot()38 void myslot()
39 {
40 }
41 
42 template<typename signal_type>
simple_test()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:
recursion_checking_dummy_mutex()56   recursion_checking_dummy_mutex(): recursion_count(0)
57   {}
lock()58   void lock()
59   {
60     BOOST_REQUIRE(recursion_count == 0);
61     ++recursion_count;
62   }
try_lock()63   bool try_lock()
64   {
65     lock();
66     return true;
67   }
unlock()68   void unlock()
69   {
70     --recursion_count;
71     BOOST_REQUIRE(recursion_count == 0);
72   }
73 };
74 
BOOST_AUTO_TEST_CASE(test_main)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