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"
11 const int thread_count
= 8;
12 const int total_count
= 30000;
14 template <typename Mutex
>
15 void nonrecursive_tests(void)
19 typedef boost::shared_lock
<Mutex
> scoped_read_lock
;
23 BOOST_REQUIRE_EQUAL( mut
.try_lock(), false );
24 BOOST_REQUIRE_EQUAL( mut
.try_lock_shared(), true );
26 scoped_read_lock
lock(mut
);
32 BOOST_REQUIRE_EQUAL( mut
.try_lock(), true );
34 BOOST_REQUIRE_EQUAL( mut
.try_lock_shared(), true );
38 template <typename Mutex
>
39 void recursive_tests(void)
43 typedef typename
Mutex::shared_lock scoped_read_lock
;
47 BOOST_REQUIRE_EQUAL( mut
.try_lock(), false );
48 BOOST_REQUIRE_EQUAL( mut
.try_lock_shared(), true );
50 scoped_read_lock
lock(mut
);
56 BOOST_REQUIRE_EQUAL( mut
.try_lock(), true );
59 BOOST_REQUIRE_EQUAL( mut
.try_lock_shared(), true );
66 BOOST_AUTO_TEST_CASE( rw_mutex_test
)
68 nonrecursive_tests
<rw_mutex
>();
69 nonrecursive_tests
<nonrecursive_rw_mutex
>();
75 typedef boost::shared_lock
<rw_mutex
> scoped_read_lock
;
76 typedef boost::unique_lock
<rw_mutex
> scoped_write_lock
;
80 boost::thread::yield();
87 for (int i
= 0; i
!= total_count
; ++i
)
89 /* recursive read locks */
91 scoped_read_lock
lock(mut
);
94 scoped_read_lock
lock(mut
);
100 /* recursive write locks */
102 scoped_write_lock
lock(mut
);
105 scoped_write_lock
lock(mut
);
111 /* nested read / write locks */
113 scoped_write_lock
lock(mut
);
116 scoped_read_lock
lock(mut
);
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
);