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 using namespace libjmmcg;
48 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
51 template<
class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn,
class Mdl,
template<
class>
class CFG,
unsigned int PoolSize,
unsigned int GSSk>
52 const typename fifo_queue_t<Db, Sz, Jn, Mdl, CFG, PoolSize, GSSk>::pool_type::pool_type::size_type fifo_queue_t<Db, Sz, Jn, Mdl, CFG, PoolSize, GSSk>::pool_size;
69 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
72 template<
class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn,
class Mdl,
template<
class>
class CFG,
unsigned int PoolSize,
unsigned int GSSk>
73 const typename lifo_queue_t<Db, Sz, Jn, Mdl, CFG, PoolSize, GSSk>::pool_type::pool_type::size_type lifo_queue_t<Db, Sz, Jn, Mdl, CFG, PoolSize, GSSk>::pool_size;
75 typedef boost::mpl::list<
76 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>,
77 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, control_flow_graph>,
78 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, no_control_flow_graph, 1>,
79 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, control_flow_graph, 1>,
80 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, no_control_flow_graph, 2>,
81 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, control_flow_graph, 2>,
82 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>,
83 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, control_flow_graph>,
84 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, no_control_flow_graph, 1>,
85 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, control_flow_graph, 1>,
86 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, no_control_flow_graph, 2>,
87 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, control_flow_graph, 2>
90 typedef boost::mpl::list<
91 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>,
92 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, control_flow_graph>,
93 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>,
94 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, control_flow_graph>,
95 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>,
96 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, control_flow_graph>,
97 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>,
98 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, control_flow_graph>
99 > infinite_test_types;
151 r=
static_cast<
bool>(
i_);
170 api_threading_traits<API, Mdl>::sleep(10);
211 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
213 BOOST_AUTO_TEST_SUITE(joinable)
215 BOOST_AUTO_TEST_SUITE(finite)
217 BOOST_AUTO_TEST_SUITE(wait_dataflow)
219 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work, T, finite_test_types) {
220 typedef typename T::pool_type pool_type;
221 typedef typename pool_type::joinable joinable;
223 pool_type pool(T::pool_size);
225 BOOST_CHECK_EQUAL(context->i, 2);
226 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 1);
227 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
228 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 1);
229 BOOST_CHECK_GE(pool.statistics().total_hrz_work().total(), 0);
230 BOOST_CHECK_LE(pool.statistics().total_hrz_work().total(), 1);
231 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
232 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
233 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
234 std::cout<<pool.statistics()<<
std::endl;
237 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work, T, finite_test_types) {
238 typedef typename T::pool_type pool_type;
239 typedef typename pool_type::joinable joinable;
241 pool_type pool(T::pool_size);
244 BOOST_CHECK_EQUAL(context->i, 2);
245 BOOST_CHECK_EQUAL(context2->i, 6);
246 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 2);
247 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
248 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 2);
249 BOOST_CHECK_GE(pool.statistics().total_hrz_work().total(), 0);
250 BOOST_CHECK_LE(pool.statistics().total_hrz_work().total(), 2);
251 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
252 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
253 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
254 std::cout<<pool.statistics()<<
std::endl;
257 BOOST_AUTO_TEST_CASE_TEMPLATE(horizontal_threading, T, finite_test_types) {
258 typedef horizontal_work_type<T::thread_pool_traits::os_traits::thread_traits::api_params_type::api_type,
typename T::thread_pool_traits::os_traits::thread_traits::model_type> hrz_wk_t;
259 typedef horizontal_work_type_rel<T::thread_pool_traits::os_traits::thread_traits::api_params_type::api_type,
typename T::thread_pool_traits::os_traits::thread_traits::model_type> hrz_wk_rel_t;
260 typedef typename T::pool_type pool_type;
261 typedef typename pool_type::joinable joinable;
263 pool_type pool(T::pool_size);
265 hrz_wk_t hz(release);
266 hrz_wk_rel_t hz_rel(release);
267 auto const &context=pool<<joinable()<<hz;
268 auto const &context_rel=pool<<joinable()<<hz_rel;
271 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 2);
272 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
273 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 2);
274 BOOST_CHECK_GE(pool.statistics().total_hrz_work().total(), 0);
275 BOOST_CHECK_LE(pool.statistics().total_hrz_work().total(), 2);
276 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
277 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
278 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
279 std::cout<<pool.statistics()<<
std::endl;
282 BOOST_AUTO_TEST_CASE_TEMPLATE(unary_fn, T, finite_test_types) {
283 typedef typename T::pool_type pool_type;
285 pool_type pool(T::pool_size);
286 auto const &context=pool.unary_fun(bool_work_type(0), std::logical_not<bool_work_type::result_type>());
287 BOOST_CHECK_EQUAL(*context,
true);
288 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 2);
289 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
290 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 2);
291 BOOST_CHECK_GE(pool.statistics().total_hrz_work().total(), 0);
292 BOOST_CHECK_LE(pool.statistics().total_hrz_work().total(), 2);
293 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
294 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
295 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
296 std::cout<<pool.statistics()<<
std::endl;
299 BOOST_AUTO_TEST_CASE_TEMPLATE(logical_and, T, finite_test_types) {
300 typedef typename T::pool_type pool_type;
302 pool_type pool(T::pool_size);
303 BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
305 BOOST_CHECK_EQUAL(*context,
true);
306 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 3);
307 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
308 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 3);
309 BOOST_CHECK_GE(pool.statistics().total_hrz_work().total(), 0);
310 BOOST_CHECK_LE(pool.statistics().total_hrz_work().total(), 3);
311 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
312 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
313 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
314 std::cout<<pool.statistics()<<
std::endl;
317 BOOST_AUTO_TEST_SUITE_END()
319 BOOST_AUTO_TEST_SUITE_END()
321 BOOST_AUTO_TEST_SUITE(infinite)
323 BOOST_AUTO_TEST_SUITE(wait_dataflow)
325 BOOST_AUTO_TEST_CASE_TEMPLATE(add_one_work, T, infinite_test_types) {
326 typedef typename T::pool_type pool_type;
327 typedef typename pool_type::joinable joinable;
331 BOOST_CHECK_EQUAL(context->i, 2);
332 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 1);
334 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
335 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 1);
336 BOOST_CHECK_EQUAL(pool.statistics().total_hrz_work().total(), 0);
337 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
338 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
339 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
340 std::cout<<pool.statistics()<<
std::endl;
343 BOOST_AUTO_TEST_CASE_TEMPLATE(add_two_work, T, infinite_test_types) {
344 typedef typename T::pool_type pool_type;
345 typedef typename pool_type::joinable joinable;
350 BOOST_CHECK_EQUAL(context->i, 2);
351 BOOST_CHECK_EQUAL(context2->i, 6);
352 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 2);
354 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
355 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 2);
356 BOOST_CHECK_EQUAL(pool.statistics().total_hrz_work().total(), 0);
357 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
358 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
359 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
360 std::cout<<pool.statistics()<<
std::endl;
363 BOOST_AUTO_TEST_CASE_TEMPLATE(unary_fn, T, infinite_test_types) {
364 typedef typename T::pool_type pool_type;
367 auto const &context=pool.unary_fun(bool_work_type(1),std::logical_not<bool_work_type::result_type>());
368 BOOST_CHECK_EQUAL(*context,
false);
369 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 2);
371 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
372 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 2);
373 BOOST_CHECK_EQUAL(pool.statistics().total_hrz_work().total(), 0);
374 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
375 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
376 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
377 std::cout<<pool.statistics()<<
std::endl;
380 BOOST_AUTO_TEST_CASE_TEMPLATE(logical_and, T, infinite_test_types) {
381 typedef typename T::pool_type pool_type;
385 BOOST_CHECK_EQUAL(*context,
true);
386 BOOST_CHECK_EQUAL(pool.statistics().total_work_added(), 3);
388 BOOST_CHECK_GE(pool.statistics().total_vertical_work().total(), 0);
389 BOOST_CHECK_LE(pool.statistics().total_vertical_work().total(), 3);
390 BOOST_CHECK_EQUAL(pool.statistics().total_hrz_work().total(), 0);
391 BOOST_CHECK_GE(pool.statistics().total_work_added(), pool.statistics().total_vertical_work().total()+pool.statistics().total_hrz_work().total());
392 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
393 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
394 std::cout<<pool.statistics()<<
std::endl;
397 BOOST_AUTO_TEST_SUITE_END()
399 BOOST_AUTO_TEST_SUITE_END()
401 BOOST_AUTO_TEST_SUITE_END()
403 BOOST_AUTO_TEST_SUITE_END()