21 #include "../rml/include/rml_tbb.h" 22 #include "../rml/server/thread_monitor.h" 29 using rml::internal::thread_monitor;
97 my_server(server), my_client(client), my_index(i),
98 my_thread_monitor(), my_handle(), my_next()
107 #if _MSC_VER && !defined(__INTEL_COMPILER) 109 #pragma warning(push) 110 #pragma warning(disable:4510 4610) 118 #if _MSC_VER && !defined(__INTEL_COMPILER) 160 if( my_asleep_list_root )
168 void wake_some(
int additional_slack );
173 if( --my_ref_count==0 ) {
174 my_client.acknowledge_close_connection();
189 for(
size_t i=0; i<my_n_thread; ++i )
203 void register_master ( ::rml::server::execution_resource_t& ) __TBB_override {}
204 void unregister_master ( ::rml::server::execution_resource_t ) __TBB_override {}
211 #if _MSC_VER && !defined(__INTEL_COMPILER) 213 #pragma warning(push) 214 #pragma warning(disable:4189) 216 #if __MINGW32__ && __GNUC__==4 &&__GNUC_MINOR__>=2 && !__MINGW64__ 218 __attribute__((force_align_arg_pointer))
222 AVOID_64K_ALIASING( self->my_index );
226 #if _MSC_VER && !defined(__INTEL_COMPILER) 232 thread_monitor::join(handle);
234 thread_monitor::detach_thread(handle);
267 ::rml::job& j = *
my_client.create_one_job();
272 thread_monitor::cookie c;
325 my_n_thread(client.max_job_count()),
326 my_stack_size(client.min_stack_size()),
327 my_thread_array(NULL)
332 my_net_slack_requests = 0;
352 asleep_list_mutex_type::scoped_lock
lock;
375 if( additional_slack>0 ) {
384 if( old<=0 )
goto done;
390 if( additional_slack ) {
405 my_net_slack_requests+=delta;
409 }
else if( delta>0 ) {
Associated thread is doing normal life sequence.
void independent_thread_number_changed(int) __TBB_override
asleep_list_mutex_type my_asleep_list_mutex
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
static void release_handle(thread_handle my_handle, bool join)
void request_close_connection(bool) __TBB_override
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
unsigned default_concurrency() const __TBB_override
private_server(tbb_client &client)
Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
private_worker * my_next
Link for list of workers that are sleeping or have no associated thread.
padded_private_worker(private_server &server, tbb_client &client, const size_t i)
thread_handle my_handle
Handle of the OS thread associated with this worker.
const size_t my_index
index used for avoiding the 64K aliasing problem
void wake_or_launch()
Wake up associated thread (or launch a thread if there is none)
thread_monitor::handle_type thread_handle
version_type version() const __TBB_override
*this has associated thread that is starting up.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
private_server & my_server
Associated server.
friend class private_server
const size_t my_stack_size
Stack size for each thread. */.
value_type compare_and_swap(value_type value, value_type comparand)
atomic< int > my_slack
Number of jobs that could use their associated thread minus number of active threads.
virtual ~private_server()
__TBB_SCHEDULER_MUTEX_TYPE scheduler_mutex_type
Mutex type for global locks in the scheduler.
static const size_t cache_line_size
tbb_client & my_client
Associated client.
void poison_pointer(T *__TBB_atomic &)
void run()
Actions executed by the associated thread.
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
void const char const char int ITT_FORMAT __itt_group_sync s
atomic< state_t > my_state
tbb_server * make_private_server(tbb_client &client)
Factory method called from task.cpp to create a private_server.
thread_monitor my_thread_monitor
Monitor for sleeping when there is no work to do.
static unsigned default_num_threads()
Associated thread has ended normal life sequence and promises to never touch *this again...
void start_shutdown()
Called by a thread (usually not the associated thread) to commence termination.
static __RML_DECL_THREAD_ROUTINE thread_routine(void *arg)
atomic< int > my_ref_count
Counter used to determine when to delete this.
void propagate_chain_reaction()
Wake up to two sleeping workers, if there are any sleeping.
void protect_affinity_mask(bool)
padded_private_worker * my_thread_array
bool try_insert_in_asleep_list(private_worker &t)
Try to add t to list of sleeping workers.
tbb::atomic< private_worker * > my_asleep_list_root
List of workers that are asleep or committed to sleeping until notified by another thread...
void yield() __TBB_override
Base class for types that should not be copied or assigned.
void wake_some(int additional_slack)
Equivalent of adding additional_slack to my_slack and waking up to 2 threads if my_slack permits...
static bool does_client_join_workers(const tbb::internal::rml::tbb_client &client)
state_t
State in finite-state machine that controls the worker.
const tbb_client::size_type my_n_thread
Maximum number of threads to be created.
scheduler_mutex_type asleep_list_mutex_type
Protects my_asleep_list_root.
private_worker(private_server &server, tbb_client &client, const size_t i)
void adjust_job_count_estimate(int delta) __TBB_override