1 #ifndef LIBJMMCG_CORE_PRIVATE_THREAD_BASE_HPP
2 #define LIBJMMCG_CORE_PRIVATE_THREAD_BASE_HPP
22 #include "../../core/exception.hpp"
23 #include "../../core/thread_os_traits.hpp"
55 bool __fastcall is_running()
const noexcept(
true);
61 void __fastcall set_name(
char const *name)
noexcept(
false);
69 virtual void __fastcall request_exit()
const noexcept(
false);
82 explicit __stdcall thread_base(
const typename thread_traits::api_params_type::suspend_period_ms exit_wait_p)
noexcept(
false);
106 static const typename thread_traits::api_params_type::states
__fastcall state_nolk(
typename thread_traits::api_params_type
const ¶ms)
noexcept(
true);
111 typename thread_traits::api_params_type::states
__fastcall process_chk()
noexcept(
false) {
112 assert(
this->thread_params.id==thread_traits::get_current_thread_id());
113 const auto state=
this->process();
120 #pragma GCC diagnostic push
121 #pragma GCC diagnostic ignored "-Wattributes"
127 static typename thread_traits::api_params_type::core_work_fn_ret_t
__cdecl core_work_fn(
typename thread_traits::api_params_type::core_work_fn_arg_t)
noexcept(
false);
129 #pragma GCC diagnostic pop
138 return os<<th.to_string();
148 using element_type=E;
149 using atomic_ptr_t=
typename element_type::atomic_ptr_t;
150 using work_complete_t=
typename element_type::value_type::work_complete_t;
163 : elem(), stack_based(e->sp_noop_ctr()) {
166 assert(!
dynamic_cast<
typename atomic_ptr_t::value_type>(e.get().get()));
167 assert(stack_based ||
dynamic_cast<
typename atomic_ptr_t::value_type>(elem.get()));
168 assert(stack_based || !
dynamic_cast<
typename element_type::no_ref_counting *>(elem.get()));
169 assert(stack_based ||
dynamic_cast<
typename element_type::ctr_type *>(elem.get()));
170 assert(stack_based || *
dynamic_cast<
typename element_type::ctr_type *>(elem.get())>=1);
177 del.get().swap(elem);
180 assert(!
dynamic_cast<
typename element_type::no_ref_counting *>(del.get().get()));
181 assert(
dynamic_cast<
typename element_type::ctr_type *>(del.get().get()));
182 assert(*
dynamic_cast<
typename element_type::ctr_type *>(del.get().get())>=1);
186 template<
class UpdStats,
class EdgeAnn>
void FORCE_INLINE
193 const set_work_complete work_done(*elem->work_complete());
194 elem->process_joinable(e_details);
196 elem->process_nonjoinable(e_details);
203 class set_work_complete {
205 explicit __stdcall set_work_complete(work_complete_t &wc)
noexcept(
true)
FORCE_INLINE
206 : work_complete(wc) {
208 set_work_complete(set_work_complete
const &)=
delete;
209 __stdcall ~set_work_complete()
noexcept(
true)
FORCE_INLINE {
214 work_complete_t& work_complete;
218 const bool stack_based;
226 # include "../experimental/NT-based/NTSpecific/thread_base_impl.hpp"