1 #ifndef LIBJMMCG_CORE_PRIVATE_THREAD_POOL_QUEUE_MODEL_HPP
2 #define LIBJMMCG_CORE_PRIVATE_THREAD_POOL_QUEUE_MODEL_HPP
39 using signalled_work_queue_type=
typename pool_traits_type::
template signalled_work_queue_type<QM>;
43 static constexpr unsigned long GSSk=batch_details_type::GSSk;
59 return batch.process_a_batch_item();
61 const typename pool_type::container_type::iterator thread=pool.find(tid);
62 if (thread!=pool.end()) {
63 assert(
dynamic_cast<
typename pool_type::container_type::mapped_type::value_type *>(&*thread->second));
64 return thread->second->process_a_batch_item(exception_thrown_in_thread);
85 return batch.add_work_to_batch(
std::forward<
typename signalled_work_queue_type::value_type>(wk));
87 const auto thread=pool.find(tid);
88 if (thread!=pool.end()) {
89 assert(
dynamic_cast<
typename pool_type::container_type::mapped_type::value_type *>(&*thread->second));
90 return thread->second->add_work_to_batch(
std::forward<
typename signalled_work_queue_type::value_type>(wk));
98 return batch.statistics();
101 return batch.statistics();
105 batch_details_type batch;
106 const typename thread_traits::api_params_type::tid_type main_tid;
119 class thread_pool_queue_model;
128 template<
class>
class QM,
137 using pool_traits_type=
typename base1_t::pool_traits_type;
138 using os_traits=
typename base1_t::os_traits;
139 using pool_type=
typename base1_t::pool_type;
140 using queue_size_type=
typename base1_t::queue_size_type;
141 using pool_size_type=
typename base1_t::pool_size_type;
142 using pool_thread_type=
typename base1_t::pool_thread_type;
143 using exception_type=
typename base1_t::exception_type;
144 using thread_traits=
typename base1_t::thread_traits;
145 using api_params_type=
typename base1_t::api_params_type;
146 using priority_type=
typename base1_t::priority_type;
147 using work_distribution_mode=
typename base1_t::work_distribution_mode;
148 using signalled_work_queue_type=
typename base1_t::signalled_work_queue_type;
149 using queue_model=
typename base_t::queue_model;
156 using GSSk_batching_type=
GSSk_batching<pool_traits_type::GSSk, pool_traits_type, pool_type,
typename work_distribution_mode::queue_model>;
164 using statistics_type=
typename base1_t::statistics_type;
165 using cfg_type=
typename base1_t::cfg_type;
185 return this->signalled_work_queue.empty();
191 return this->signalled_work_queue.size();
195 this->signalled_work_queue.clear();
211 unsigned long __fastcall
229 unsigned long __fastcall
241 : base1_t(max_num_threads), base_t(),
pool(num_threads,
this->exit_requested_,
this->signalled_work_queue) {
244 queue_size_type
__fastcall
248 return this->signalled_work_queue;
250 signalled_work_queue_type
const &
__fastcall queue()
const noexcept(
true)
override FORCE_INLINE final {
251 return this->signalled_work_queue;
257 virtual bool __fastcall add_work_to_batch(
const typename thread_traits::api_params_type::tid_type,
typename signalled_work_queue_type::value_type &&wk)
noexcept(
true)
FORCE_INLINE {
262 return this->exit_requested_;
269 template<
template<
class>
class Joinability,
class TPB,
typename TPB::priority_type Pri>
friend class priority_t;
291 using pool_traits_type=
typename base1_t::pool_traits_type;
292 using os_traits=
typename base1_t::os_traits;
293 using pool_type=
typename base1_t::pool_type;
294 using queue_size_type=
typename base1_t::queue_size_type;
295 using pool_size_type=
typename base1_t::pool_size_type;
296 using pool_thread_type=
typename base1_t::pool_thread_type;
297 using exception_type=
typename base1_t::exception_type;
298 using thread_traits=
typename base1_t::thread_traits;
299 using api_params_type=
typename base1_t::api_params_type;
300 using priority_type=
typename base1_t::priority_type;
301 using work_distribution_mode=
typename base1_t::work_distribution_mode;
302 using signalled_work_queue_type=
typename base1_t::signalled_work_queue_type;
303 using queue_model=
typename base_t::queue_model;
311 BOOST_MPL_ASSERT((std::is_same<std::integral_constant<
unsigned long, pool_traits_type::GSSk>, std::integral_constant<
unsigned long, 1UL>>));
313 using GSSk_batching_type=
GSSk_batching<pool_traits_type::GSSk, pool_traits_type, pool_type,
typename work_distribution_mode::queue_model>;
321 using statistics_type=
typename base1_t::statistics_type;
322 using cfg_type=
typename base1_t::cfg_type;
352 unsigned long __fastcall
370 unsigned long __fastcall
379 BOOST_MPL_ASSERT((
std::is_same<
typename base_t::exit_requested_type,
typename pool_type::exit_requested_type>));
382 : base1_t(max_num_threads), base_t(),
pool(num_threads,
this->exit_requested_) {
385 queue_size_type
__fastcall
392 virtual bool __fastcall add_work_to_batch(
const typename thread_traits::api_params_type::tid_type,
typename signalled_work_queue_type::value_type &&wk)
noexcept(
true)
FORCE_INLINE {
397 return this->exit_requested_;
404 template<
template<
class>
class Joinability,
class TPB,
typename TPB::priority_type Pri>
friend class priority_t;
409 signalled_work_queue_type &
__fastcall queue()
noexcept(
true)
override FORCE_INLINE {}
410 signalled_work_queue_type
const &
__fastcall queue()
const noexcept(
true)
override FORCE_INLINE {}
414 bool __fastcall queue_empty()
const noexcept(
true)
override FORCE_INLINE {}
418 const queue_size_type
__fastcall queue_size()
const noexcept(
true)
override FORCE_INLINE {}
419 void __fastcall queue_clear()
noexcept(
true)
override FORCE_INLINE {}