25 #include "../rml/include/rml_tbb.h"    29 #if defined(_MSC_VER) && defined(_Wp64)    31     #pragma warning (push)    32     #pragma warning (disable: 4244)    37 class task_group_context;
    91 #if __TBB_ENQUEUE_ENFORCED_CONCURRENCY    92     int my_mandatory_num_requested;
    96 #if __TBB_TASK_PRIORITY   102     intptr_t my_global_top_priority;
   106     intptr_t my_global_bottom_priority;
   111     uintptr_t my_global_reload_epoch;
   114     struct priority_level_info {
   123         int workers_requested;
   126         int workers_available;
   162 #if __TBB_COUNT_TASK_NODES   165     atomic<intptr_t> my_task_node_count;
   169     market ( 
unsigned workers_soft_limit, 
unsigned workers_hard_limit, 
size_t stack_size );
   180 #if __TBB_TASK_PRIORITY   190     void update_arena_top_priority ( 
arena& a, intptr_t newPriority );
   193     inline void update_global_top_priority ( intptr_t newPriority );
   196     inline void reset_global_priority ();
   198     inline void advance_global_reload_epoch () {
   203         __TBB_ASSERT( (my_priority_levels[my_global_top_priority].workers_requested > 0
   204                            && !my_priority_levels[my_global_top_priority].arenas.empty())
   205                        || (my_global_top_priority == my_global_bottom_priority &&
   206                            my_global_top_priority == normalized_normal_priority), NULL );
   281     static 
arena* 
create_arena ( 
int num_slots, 
int num_reserved_slots, 
size_t stack_size );
   290     bool release ( 
bool is_public, 
bool blocking_terminate );
   292 #if __TBB_ENQUEUE_ENFORCED_CONCURRENCY   293     void enable_mandatory_concurrency_impl ( 
arena *a );
   297     void enable_mandatory_concurrency ( 
arena *a );
   300     void disable_mandatory_concurrency_impl(
arena* a);
   303     void mandatory_concurrency_disable ( 
arena *a );
   323     void register_master( ::rml::server::execution_resource_t& rsc_handle ) {
   327         my_server->register_master( rsc_handle );
   331     void unregister_master( ::rml::server::execution_resource_t& rsc_handle )
 const {
   332         my_server->unregister_master( rsc_handle );
   336 #if __TBB_TASK_GROUP_CONTEXT   342     template <
typename T>
   343     bool propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state );
   346 #if __TBB_TASK_PRIORITY   349     bool lower_arena_priority ( 
arena& a, intptr_t new_priority, uintptr_t old_reload_epoch );
   358     bool update_arena_priority ( 
arena& a, intptr_t new_priority );
   361 #if __TBB_COUNT_TASK_NODES   364     void update_task_node_count( intptr_t delta ) { my_task_node_count += delta; }
   367 #if __TBB_TASK_GROUP_CONTEXT   386 #if defined(_MSC_VER) && defined(_Wp64)   388     #pragma warning (pop)   389 #endif // warning 4244 is back friend void ITT_DoUnsafeOneTimeInitialization()
 
Used to form groups of tasks.
 
Work stealing task scheduler.
 
void insert_arena_into_list(arena &a)
 
static const intptr_t num_priority_levels
 
static const unsigned skip_soft_limit_warning
The value indicating that the soft limit warning is unnecessary.
 
void update_allotment(unsigned effective_soft_limit)
Recalculates the number of workers assigned to each arena in the list.
 
atomic< unsigned > my_first_unused_worker_idx
First unused index of worker.
 
unsigned my_ref_count
Reference count controlling market object lifetime.
 
void assert_market_valid() const
 
void detach_arena(arena &)
Removes the arena from the market's list.
 
uintptr_t my_arenas_aba_epoch
ABA prevention marker to assign to newly created arenas.
 
rml::tbb_server * my_server
Pointer to the RML server object that services this TBB instance.
 
static void set_active_num_workers(unsigned w)
Set number of active workers.
 
void cleanup(job &j) __TBB_override
 
scheduler_mutex_type global_market_mutex_type
 
unsigned max_job_count() const __TBB_override
 
Fast, unfair, spinning reader-writer lock with backoff and writer-preference.
 
void adjust_demand(arena &, int delta)
Request that arena's need in workers should be adjusted.
 
static global_market_mutex_type theMarketMutex
Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas,...
 
static unsigned max_num_workers()
 
static market & global_market(bool is_public, unsigned max_num_workers=0, size_t stack_size=0)
Factory method creating new market object.
 
void __TBB_store_with_release(volatile T &location, V value)
 
void destroy()
Destroys and deallocates market object created by market::create()
 
unsigned my_num_workers_hard_limit
Maximal number of workers allowed for use by the underlying resource manager.
 
intrusive_list< generic_scheduler > scheduler_list_type
 
A scheduler with a customized evaluation loop.
 
bool must_join_workers() const
Used when RML asks for join mode during workers termination.
 
int my_total_demand
Number of workers that were requested by all arenas.
 
bool my_join_workers
Shutdown mode.
 
arena_list_type my_arenas
List of registered arenas.
 
arena * arena_in_need(arena *prev_arena)
Returns next arena that needs more workers, or NULL.
 
arena * my_next_arena
The first arena to be checked when idle worker seeks for an arena to enter.
 
void process(job &j) __TBB_override
 
bool is_arena_in_list(arena_list_type &arenas, arena *a)
 
market(unsigned workers_soft_limit, unsigned workers_hard_limit, size_t stack_size)
Constructor.
 
unsigned my_num_workers_soft_limit
Current application-imposed limit on the number of workers (see set_active_num_workers())
 
int update_workers_request()
Recalculates the number of workers requested from RML and updates the allotment.
 
void try_destroy_arena(arena *, uintptr_t aba_epoch)
Removes the arena from the market's list.
 
unsigned my_workers_soft_limit_to_report
Either workers soft limit to be reported via runtime_warning() or skip_soft_limit_warning.
 
void acknowledge_close_connection() __TBB_override
 
Base class for types that should not be copied or assigned.
 
job * create_one_job() __TBB_override
 
bool release(bool is_public, bool blocking_terminate)
Decrements market's refcount and destroys it in the end.
 
The scoped locking pattern.
 
policy_type policy() const __TBB_override
 
size_t worker_stack_size() const
Returns the requested stack size of worker threads.
 
unsigned my_public_ref_count
Count of master threads attached.
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
atomic< T > & as_atomic(T &t)
 
version_type version() const __TBB_override
 
int my_num_workers_requested
Number of workers currently requested from RML.
 
arenas_list_mutex_type my_arenas_list_mutex
 
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
 
intrusive_list< arena > arena_list_type
 
size_t my_stack_size
Stack size of worker threads.
 
T __TBB_load_with_acquire(const volatile T &location)
 
__TBB_SCHEDULER_MUTEX_TYPE scheduler_mutex_type
Mutex type for global locks in the scheduler.
 
void remove_arena_from_list(arena &a)
 
size_t min_stack_size() const __TBB_override
 
static unsigned app_parallelism_limit()
Reports active parallelism level according to user's settings.
 
friend class generic_scheduler
 
static market * theMarket
Currently active global market.
 
static arena * create_arena(int num_slots, int num_reserved_slots, size_t stack_size)
Creates an arena object.
 
spin_rw_mutex arenas_list_mutex_type
Lightweight mutex guarding accounting operations with arenas list.