1 #include <boost/lockfree/detail/freelist.hpp>
2 #include <boost/thread.hpp>
5 #define BOOST_TEST_DYN_LINK
6 #define BOOST_TEST_MAIN
7 #include <boost/test/unit_test.hpp>
9 #include <boost/foreach.hpp>
10 #include <boost/static_assert.hpp>
12 #include <boost/type_traits/is_same.hpp>
22 template <typename freelist_type
>
27 std::vector
<dummy
*> nodes
;
29 for (int i
= 0; i
!= 4; ++i
)
30 nodes
.push_back(fl
.allocate());
32 BOOST_FOREACH(dummy
* d
, nodes
)
36 for (int i
= 0; i
!= 4; ++i
)
37 nodes
.push_back(fl
.allocate());
39 BOOST_FOREACH(dummy
* d
, nodes
)
42 for (int i
= 0; i
!= 4; ++i
)
43 nodes
.push_back(fl
.allocate());
46 BOOST_AUTO_TEST_CASE( freelist_tests
)
48 run_test
<boost::lockfree::detail::freelist_stack
<dummy
, true> >();
49 run_test
<boost::lockfree::detail::freelist_stack
<dummy
, false> >();
52 template <typename freelist_type
>
53 struct freelist_tester
55 static const int max_nodes
= 1024;
56 static const int thread_count
= 4;
57 static const int loops_per_thread
= 1024;
59 boost::lockfree::detail::atomic
<int> free_nodes
;
60 boost::thread_group threads
;
64 freelist_tester(void):
65 free_nodes(0), fl(max_nodes
* thread_count
)
67 for (int i
= 0; i
!= thread_count
; ++i
)
68 threads
.create_thread(boost::bind(&freelist_tester::run
, this));
74 std::vector
<dummy
*> nodes
;
75 nodes
.reserve(max_nodes
);
77 for (int i
= 0; i
!= loops_per_thread
; ++i
) {
78 while (nodes
.size() < max_nodes
) {
79 dummy
* node
= fl
.allocate();
82 nodes
.push_back(node
);
85 while (!nodes
.empty()) {
86 dummy
* node
= nodes
.back();
92 BOOST_REQUIRE(nodes
.empty());
96 BOOST_AUTO_TEST_CASE( caching_freelist_test
)
98 freelist_tester
<boost::lockfree::detail::freelist_stack
<dummy
, true> > tester();
101 BOOST_AUTO_TEST_CASE( static_freelist_test
)
103 freelist_tester
<boost::lockfree::detail::freelist_stack
<dummy
, true> > tester();