Merge branch 'master' into scmaster
[nova-tt.git] / testsuite / rw_mutex_test.cpp
blob2faade94cb525af86944e7305c62dba5bc42bf5f
1 #define BOOST_TEST_MAIN
2 #include <boost/test/included/unit_test.hpp>
4 #include <boost/shared_ptr.hpp>
5 #include <boost/thread.hpp>
7 #include "rw_mutex.hpp"
9 using namespace nova;
11 const int thread_count = 8;
12 const int total_count = 30000;
14 template <typename Mutex>
15 void nonrecursive_tests(void)
17 Mutex mut;
19 typedef boost::shared_lock<Mutex> scoped_read_lock;
21 mut.lock_shared();
22 mut.lock_shared();
23 BOOST_REQUIRE_EQUAL( mut.try_lock(), false );
24 BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true );
26 scoped_read_lock lock(mut);
28 mut.unlock_shared();
29 mut.unlock_shared();
30 mut.unlock_shared();
32 BOOST_REQUIRE_EQUAL( mut.try_lock(), true );
33 mut.unlock();
34 BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true );
35 mut.unlock_shared();
38 template <typename Mutex>
39 void recursive_tests(void)
41 Mutex mut;
43 typedef typename Mutex::shared_lock scoped_read_lock;
45 mut.lock_shared();
46 mut.lock_shared();
47 BOOST_REQUIRE_EQUAL( mut.try_lock(), false );
48 BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true );
50 scoped_read_lock lock(mut);
52 mut.unlock_shared();
53 mut.unlock_shared();
54 mut.unlock_shared();
56 BOOST_REQUIRE_EQUAL( mut.try_lock(), true );
57 mut.lock();
58 mut.lock();
59 BOOST_REQUIRE_EQUAL( mut.try_lock_shared(), true );
60 mut.unlock_shared();
61 mut.unlock();
62 mut.unlock();
63 mut.unlock();
66 BOOST_AUTO_TEST_CASE( rw_mutex_test )
68 nonrecursive_tests<rw_mutex>();
69 nonrecursive_tests<nonrecursive_rw_mutex>();
72 namespace
74 rw_mutex mut;
75 typedef boost::shared_lock<rw_mutex> scoped_read_lock;
76 typedef boost::unique_lock<rw_mutex> scoped_write_lock;
78 void sleep ()
80 boost::thread::yield();
83 void test_fn(void)
85 static rw_mutex mut;
87 for (int i = 0; i != total_count; ++i)
89 /* recursive read locks */
91 scoped_read_lock lock(mut);
92 sleep();
94 scoped_read_lock lock(mut);
95 sleep();
97 sleep();
100 /* recursive write locks */
102 scoped_write_lock lock(mut);
103 sleep();
105 scoped_write_lock lock(mut);
106 sleep();
108 sleep();
111 /* nested read / write locks */
113 scoped_write_lock lock(mut);
114 sleep();
116 scoped_read_lock lock(mut);
117 sleep();
119 sleep();
127 BOOST_AUTO_TEST_CASE( rw_mutex_test_2 )
129 boost::thread_group threads;
130 for (int i = 0; i != thread_count; ++i)
131 threads.create_thread(&test_fn);
133 threads.join_all();