21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/thread_pool_sequential.hpp"
27 #include "core/thread_pool_master.hpp"
28 #include "core/thread_pool_workers.hpp"
30 #include <boost/bind/bind.hpp>
32 using namespace libjmmcg;
52 const typename fifo_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type fifo_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
71 const typename lifo_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type lifo_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
90 const typename lifo_lockfree_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type lifo_lockfree_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
109 const typename priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_type::
pool_type::
size_type priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::
pool_size;
111 typedef boost::mpl::list<
112 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
113 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
114 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
115 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
116 lifo_lockfree_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
117 lifo_lockfree_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
118 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
119 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
121 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1>,
122 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1, 2>,
123 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
124 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1>,
125 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1, 2>,
126 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
129 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1>,
130 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1, 2>,
131 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
133 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 2>,
134 fifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
135 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 2>,
136 lifo_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
139 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 2>,
140 priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>
143 typedef boost::mpl::list<
150 fifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
151 fifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
152 lifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
153 lifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
154 priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::nonjoinable, sequential_mode>,
155 priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
158 fifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading>,
159 fifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading, 0, 2>,
160 fifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
161 lifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading>,
162 lifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading, 0, 2>,
163 lifo_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
164 priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading>,
165 priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading, 0, 2>,
166 priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>
167 > infinite_test_types;
189 bool __fastcall operator<(
work_type const &)
const noexcept(
true) {
216 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
218 BOOST_AUTO_TEST_SUITE(all_joinable)
220 BOOST_AUTO_TEST_SUITE(finite)
222 BOOST_AUTO_TEST_CASE_TEMPLATE(one_thread, T, finite_test_types) {
223 typedef typename T::pool_type pool_type;
226 BOOST_CHECK_EQUAL(pool.pool_size(), 1U);
227 BOOST_CHECK_EQUAL(pool.queue_size(), 0U);
228 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::erew_memory_access), 0U);
229 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::erew_memory_access), 0U);
230 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::crew_memory_access), 0U);
231 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::crew_memory_access), 0U);
234 BOOST_AUTO_TEST_CASE_TEMPLATE(n_threads, T, finite_test_types) {
235 typedef typename T::pool_type pool_type;
237 pool_type pool(T::pool_size);
238 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
239 BOOST_CHECK_EQUAL(pool.queue_size(), 0U);
240 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::erew_memory_access), 0U);
241 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::erew_memory_access), 0U);
242 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::crew_memory_access), 0U);
243 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::crew_memory_access), 0U);
246 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work, T, finite_test_types) {
247 typedef typename T::pool_type pool_type;
248 typedef typename pool_type::nonjoinable nonjoinable;
250 pool_type pool(T::pool_size);
252 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
255 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work_boost_bind, T, finite_test_types) {
256 typedef typename T::pool_type pool_type;
257 typedef typename pool_type::nonjoinable nonjoinable;
259 pool_type pool(T::pool_size);
261 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
264 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work_time_critical_simple, T, finite_test_types) {
265 typedef typename T::pool_type pool_type;
266 typedef typename pool_type::nonjoinable nonjoinable;
267 typedef typename pool_type::
template priority<pool_type::api_params_type::time_critical> time_critical;
269 pool_type pool(T::pool_size);
271 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
274 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work, T, finite_test_types) {
275 typedef typename T::pool_type pool_type;
276 typedef typename pool_type::nonjoinable nonjoinable;
278 pool_type pool(T::pool_size);
281 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
284 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work_atonce, T, finite_test_types) {
285 typedef typename T::pool_type pool_type;
286 typedef typename pool_type::nonjoinable nonjoinable;
288 pool_type pool(T::pool_size);
290 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
293 BOOST_AUTO_TEST_SUITE_END()
295 BOOST_AUTO_TEST_SUITE(infinite)
297 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, T, infinite_test_types) {
298 typedef typename T::pool_type pool_type;
301 BOOST_CHECK_EQUAL(pool.queue_size(), 0U);
302 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::erew_memory_access), 0U);
303 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::erew_memory_access), 0U);
304 BOOST_CHECK_EQUAL(pool.min_time(generic_traits::memory_access_modes::crew_memory_access), 0U);
305 BOOST_CHECK_EQUAL(pool.min_processors(generic_traits::memory_access_modes::crew_memory_access), 0U);
308 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work, T, infinite_test_types) {
309 typedef typename T::pool_type pool_type;
310 typedef typename pool_type::nonjoinable nonjoinable;
316 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work_boost_bind, T, infinite_test_types) {
317 typedef typename T::pool_type pool_type;
318 typedef typename pool_type::nonjoinable nonjoinable;
324 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work_time_critical, T, infinite_test_types) {
325 typedef typename T::pool_type pool_type;
326 typedef typename pool_type::nonjoinable nonjoinable;
327 typedef typename pool_type::
template priority<pool_type::api_params_type::time_critical> time_critical;
330 pool<<nonjoinable()<<time_critical()<<
work_type(1
);
333 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work, T, infinite_test_types) {
334 typedef typename T::pool_type pool_type;
335 typedef typename pool_type::nonjoinable nonjoinable;
342 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work_atonce, T, infinite_test_types) {
343 typedef typename T::pool_type pool_type;
344 typedef typename pool_type::nonjoinable nonjoinable;
350 BOOST_AUTO_TEST_SUITE_END()
352 BOOST_AUTO_TEST_SUITE_END()
354 BOOST_AUTO_TEST_SUITE_END()