libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
dataflow_basic.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2002 by J.M.McGuiness, coder@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include <boost/mpl/list.hpp>
25 
26 #include "core/thread_pool_sequential.hpp"
27 #include "core/thread_pool_master.hpp"
28 #include "core/thread_pool_workers.hpp"
29 
30 #include <boost/bind/bind.hpp>
31 
32 using namespace libjmmcg;
33 using namespace ppd;
34 
35 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
36 struct fifo_queue_t {
37  typedef pool_aspects<
38  Jn,
40  Mdl,
42  std::less,
43  GSSk
45 
46  typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
47 
48  static const typename pool_type::pool_type::size_type pool_size=PoolSize;
49 };
50 
51 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
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;
53 
54 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
55 struct lifo_queue_t {
56  typedef pool_aspects<
57  Jn,
59  Mdl,
61  std::less,
62  GSSk
64 
65  typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
66 
67  static const typename pool_type::pool_type::size_type pool_size=PoolSize;
68 };
69 
70 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
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;
72 
73 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
75  typedef pool_aspects<
76  Jn,
78  Mdl,
80  std::less,
81  GSSk
83 
84  typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
85 
86  static const typename pool_type::pool_type::size_type pool_size=PoolSize;
87 };
88 
89 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
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;
91 
92 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
94  typedef pool_aspects<
95  Jn,
97  Mdl,
99  std::less,
100  GSSk
102 
103  typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
104 
105  static const typename pool_type::pool_type::size_type pool_size=PoolSize;
106 };
107 
108 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
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;
110 
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>,
120 
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>,
127 // TODO - locks up... 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::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 1>,
128 // TODO - locks up... 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::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>,
132 
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>,
137 // TODO - locks up... 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::fixed_size, generic_traits::return_data::nonjoinable, heavyweight_threading, 2>,
138 // TODO - locks up... 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::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>
141 > finite_test_types;
142 
143 typedef boost::mpl::list<
144 // TODO not yet finished coding these types! 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::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading>,
145 // TODO not yet finished coding these types! 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>,
146 // TODO not yet finished coding these types! 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::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
147 // TODO not yet finished coding these types! 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>,
148 // TODO not yet finished coding these types! 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>,
149 // TODO not yet finished coding these types! 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>,
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>,
156 // TODO not yet finished coding these types! 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::infinite, generic_traits::return_data::nonjoinable, heavyweight_threading>,
157 // TODO not yet finished coding these types! 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::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
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;
168 
169 // TODO Need to test: pool_traits::size_mode_t::tracks_to_max
170 
171 struct res_t {
172  long i;
173 };
174 
175 struct work_type {
177 
178  int i_;
179 
180  explicit work_type(const int i)
181  : i_(i) {
182  }
183  void __fastcall process(result_type &r) {
184  r.i=i_<<1;
185  }
186  void __fastcall mutate(result_type &r) {
187  process(r);
188  }
189  bool __fastcall operator<(work_type const &) const noexcept(true) {
190  return true;
191  }
192 };
193 
195  int i_;
196 
197  explicit work_type_simple(const int i)
198  : i_(i) {
199  }
200  void __fastcall process(res_t &r) {
201  r.i=i_<<1;
202  }
203  void __fastcall mutate(res_t &r) {
204  process(r);
205  }
206  res_t __fastcall exec() {
207  res_t r;
208  process(r);
209  return r;
210  }
211  bool __fastcall operator<(work_type_simple const &) const noexcept(true) {
212  return true;
213  }
214 };
215 
216 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
217 
218 BOOST_AUTO_TEST_SUITE(all_joinable)
219 
220 BOOST_AUTO_TEST_SUITE(finite)
221 
222 BOOST_AUTO_TEST_CASE_TEMPLATE(one_thread, T, finite_test_types) {
223  typedef typename T::pool_type pool_type;
224 
225  pool_type pool(1); // TODO should use T::pool_size.
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);
232 }
233 
234 BOOST_AUTO_TEST_CASE_TEMPLATE(n_threads, T, finite_test_types) {
235  typedef typename T::pool_type pool_type;
236 
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);
244 }
245 
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;
249 
250  pool_type pool(T::pool_size);
251  pool<<nonjoinable()<<work_type_simple(1);
252  BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
253 }
254 
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;
258 
259  pool_type pool(T::pool_size);
260  pool<<nonjoinable()<<boost::bind(&work_type_simple::exec, work_type_simple(1));
261  BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
262 }
263 
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;
268 
269  pool_type pool(T::pool_size);
270  pool<<nonjoinable()<<time_critical()<<work_type_simple(1);
271  BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
272 }
273 
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;
277 
278  pool_type pool(T::pool_size);
279  pool<<nonjoinable()<<work_type(1);
280  pool<<nonjoinable()<<work_type(2);
281  BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
282 }
283 
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;
287 
288  pool_type pool(T::pool_size);
289  pool<<nonjoinable()<<work_type_simple(1)<<nonjoinable()<<work_type_simple(3);
290  BOOST_CHECK_EQUAL(pool.pool_size(), T::pool_size);
291 }
292 
293 BOOST_AUTO_TEST_SUITE_END()
294 
295 BOOST_AUTO_TEST_SUITE(infinite)
296 
297 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, T, infinite_test_types) {
298  typedef typename T::pool_type pool_type;
299 
300  pool_type pool;
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);
306 }
307 
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;
311 
312  pool_type pool;
313  pool<<nonjoinable()<<work_type_simple(1);
314 }
315 
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;
319 
320  pool_type pool;
321  pool<<nonjoinable()<<boost::bind(&work_type_simple::exec, work_type_simple(1));
322 }
323 
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;
328 
329  pool_type pool;
330  pool<<nonjoinable()<<time_critical()<<work_type(1);
331 }
332 
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;
336 
337  pool_type pool;
338  pool<<nonjoinable()<<work_type(1);
339  pool<<nonjoinable()<<work_type(2);
340 }
341 
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;
345 
346  pool_type pool;
347  pool<<nonjoinable()<<work_type_simple(1)<<nonjoinable()<<work_type_simple(3);
348 }
349 
350 BOOST_AUTO_TEST_SUITE_END()
351 
352 BOOST_AUTO_TEST_SUITE_END()
353 
354 BOOST_AUTO_TEST_SUITE_END()