1 // Copyright (C) 2011 Tim Blechmann
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
8 #include <boost/thread.hpp>
9 #include <boost/lockfree/stack.hpp>
11 #define BOOST_TEST_MAIN
12 #ifdef BOOST_LOCKFREE_INCLUDE_TESTS
13 #include <boost/test/included/unit_test.hpp>
15 #include <boost/test/unit_test.hpp>
18 #include "test_helpers.hpp"
20 BOOST_AUTO_TEST_CASE( simple_stack_test
)
22 boost::lockfree::stack
<long> stk(128);
27 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
28 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
29 BOOST_REQUIRE(!stk
.pop(out
));
32 BOOST_AUTO_TEST_CASE( unsafe_stack_test
)
34 boost::lockfree::stack
<long> stk(128);
36 stk
.unsynchronized_push(1);
37 stk
.unsynchronized_push(2);
39 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
40 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
41 BOOST_REQUIRE(!stk
.unsynchronized_pop(out
));
44 BOOST_AUTO_TEST_CASE( ranged_push_test
)
46 boost::lockfree::stack
<long> stk(128);
48 long data
[2] = {1, 2};
50 BOOST_REQUIRE_EQUAL(stk
.push(data
, data
+ 2), data
+ 2);
53 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
54 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
55 BOOST_REQUIRE(!stk
.unsynchronized_pop(out
));
58 BOOST_AUTO_TEST_CASE( ranged_unsynchronized_push_test
)
60 boost::lockfree::stack
<long> stk(128);
62 long data
[2] = {1, 2};
64 BOOST_REQUIRE_EQUAL(stk
.unsynchronized_push(data
, data
+ 2), data
+ 2);
67 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
68 BOOST_REQUIRE(stk
.unsynchronized_pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
69 BOOST_REQUIRE(!stk
.unsynchronized_pop(out
));
72 BOOST_AUTO_TEST_CASE( fixed_size_stack_test
)
74 boost::lockfree::stack
<long, boost::lockfree::capacity
<128> > stk
;
79 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
80 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
81 BOOST_REQUIRE(!stk
.pop(out
));
82 BOOST_REQUIRE(stk
.empty());
85 BOOST_AUTO_TEST_CASE( fixed_size_stack_test_exhausted
)
87 boost::lockfree::stack
<long, boost::lockfree::capacity
<2> > stk
;
91 BOOST_REQUIRE(!stk
.push(3));
93 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
94 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
95 BOOST_REQUIRE(!stk
.pop(out
));
96 BOOST_REQUIRE(stk
.empty());
99 BOOST_AUTO_TEST_CASE( bounded_stack_test_exhausted
)
101 boost::lockfree::stack
<long> stk(2);
105 BOOST_REQUIRE(!stk
.bounded_push(3));
107 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 2);
108 BOOST_REQUIRE(stk
.pop(out
)); BOOST_REQUIRE_EQUAL(out
, 1);
109 BOOST_REQUIRE(!stk
.pop(out
));
110 BOOST_REQUIRE(stk
.empty());
113 BOOST_AUTO_TEST_CASE( stack_consume_one_test
)
115 boost::lockfree::stack
<int> f(64);
117 BOOST_WARN(f
.is_lock_free());
118 BOOST_REQUIRE(f
.empty());
123 #ifdef BOOST_NO_CXX11_LAMBDAS
124 bool success1
= f
.consume_one(test_equal(2));
125 bool success2
= f
.consume_one(test_equal(1));
127 bool success1
= f
.consume_one([] (int i
) {
128 BOOST_REQUIRE_EQUAL(i
, 2);
131 bool success2
= f
.consume_one([] (int i
) {
132 BOOST_REQUIRE_EQUAL(i
, 1);
136 BOOST_REQUIRE(success1
);
137 BOOST_REQUIRE(success2
);
139 BOOST_REQUIRE(f
.empty());
142 BOOST_AUTO_TEST_CASE( stack_consume_all_test
)
144 boost::lockfree::stack
<int> f(64);
146 BOOST_WARN(f
.is_lock_free());
147 BOOST_REQUIRE(f
.empty());
152 #ifdef BOOST_NO_CXX11_LAMBDAS
153 size_t consumed
= f
.consume_all(dummy_functor());
155 size_t consumed
= f
.consume_all([] (int i
) {
159 BOOST_REQUIRE_EQUAL(consumed
, 2u);
161 BOOST_REQUIRE(f
.empty());
164 BOOST_AUTO_TEST_CASE( stack_consume_all_atomic_test
)
166 boost::lockfree::stack
<int> f(64);
168 BOOST_WARN(f
.is_lock_free());
169 BOOST_REQUIRE(f
.empty());
175 #ifdef BOOST_NO_CXX11_LAMBDAS
176 size_t consumed
= f
.consume_all_atomic(dummy_functor());
178 size_t consumed
= f
.consume_all_atomic([] (int i
) {
182 BOOST_REQUIRE_EQUAL(consumed
, 3u);
184 BOOST_REQUIRE(f
.empty());
188 BOOST_AUTO_TEST_CASE( stack_consume_all_atomic_reversed_test
)
190 boost::lockfree::stack
<int> f(64);
192 BOOST_WARN(f
.is_lock_free());
193 BOOST_REQUIRE(f
.empty());
199 #ifdef BOOST_NO_CXX11_LAMBDAS
200 size_t consumed
= f
.consume_all_atomic_reversed(dummy_functor());
202 size_t consumed
= f
.consume_all_atomic_reversed([] (int i
) {
206 BOOST_REQUIRE_EQUAL(consumed
, 3u);
208 BOOST_REQUIRE(f
.empty());
212 BOOST_AUTO_TEST_CASE( reserve_test
)
214 typedef boost::lockfree::stack
< void* > memory_stack
;
218 ms
.reserve_unsafe(1);