32 #if __TBB_STATISTICS_STDOUT 51 #if __TBB_TASK_GROUP_CONTEXT 56 #if __TBB_TASK_PRIORITY 63 my_ref_top_priority = &a->my_top_priority;
64 my_ref_reload_epoch = &a->my_reload_epoch;
66 my_local_reload_epoch = *my_ref_reload_epoch;
72 return !slot &&
as_atomic( slot ).compare_and_swap( &
s, NULL ) == NULL;
78 size_t index =
s.my_arena_index;
79 if ( index < lower || index >= upper ) index =
s.my_random.get() % (upper - lower) + lower;
82 for (
size_t i = index; i < upper; ++i )
84 for (
size_t i = lower; i < index; ++i )
89 template <
bool as_worker>
109 __TBB_ASSERT(
s.my_innermost_running_task ==
s.my_dummy_task, NULL );
119 s.attach_arena(
this, index,
false );
121 #if !__TBB_FP_CONTEXT 125 #if __TBB_ARENA_OBSERVER 126 __TBB_ASSERT( !
s.my_last_local_observer,
"There cannot be notified local observers when entering arena" );
127 my_observers.notify_entry_observers(
s.my_last_local_observer,
true );
133 s.local_wait_for_all( *
s.my_dummy_task, NULL );
138 __TBB_ASSERT(
s.my_innermost_running_task ==
s.my_dummy_task, NULL );
142 "Worker cannot leave arena while its task pool is not reset" );
148 || recall_by_mandatory_request()
159 s.my_innermost_running_task =
s.my_dummy_task;
160 s.local_wait_for_all(*
s.my_dummy_task,t);
163 #if __TBB_ARENA_OBSERVER 164 my_observers.notify_exit_observers(
s.my_last_local_observer,
true );
165 s.my_last_local_observer = NULL;
167 #if __TBB_TASK_PRIORITY 168 if (
s.my_offloaded_tasks )
169 orphan_offloaded_tasks(
s );
172 ++
s.my_counters.arena_roundtrips;
173 *
my_slots[index].my_counters +=
s.my_counters;
174 s.my_counters.reset();
180 __TBB_ASSERT(
s.my_innermost_running_task ==
s.my_dummy_task, NULL );
187 on_thread_leaving<ref_worker>();
191 __TBB_ASSERT( !my_guard,
"improperly allocated arena?" );
194 #if __TBB_TASK_PRIORITY 195 __TBB_ASSERT( !my_reload_epoch && !my_orphaned_tasks && !my_skipped_fifo_priority,
"New arena object is not zeroed" );
204 #if __TBB_TASK_PRIORITY 205 my_bottom_priority = my_top_priority = normalized_normal_priority;
208 #if __TBB_ARENA_OBSERVER 209 my_observers.my_arena =
this;
222 my_slots[i].my_counters =
new (
NFS_Allocate(1,
sizeof(statistics_counters), NULL) ) statistics_counters;
227 #if __TBB_ENQUEUE_ENFORCED_CONCURRENCY 228 my_concurrency_mode = cm_normal;
230 #if !__TBB_FP_CONTEXT 240 unsigned char* storage = (
unsigned char*)
NFS_Allocate( 1, n, NULL );
242 memset( storage, 0, n );
251 #if __TBB_ENQUEUE_ENFORCED_CONCURRENCY 252 __TBB_ASSERT( my_concurrency_mode != cm_enforced_global, NULL );
254 #if !__TBB_STATISTICS_EARLY_DUMP 258 intptr_t drained = 0;
271 #if __TBB_COUNT_TASK_NODES 272 my_market->update_task_node_count( -drained );
276 #if __TBB_TASK_GROUP_CONTEXT 277 __TBB_ASSERT( my_default_ctx,
"Master thread never entered the arena?" );
278 my_default_ctx->~task_group_context();
281 #if __TBB_ARENA_OBSERVER 282 if ( !my_observers.empty() )
283 my_observers.clear();
289 #if TBB_USE_ASSERT > 1 296 void arena::dump_arena_statistics () {
297 statistics_counters total;
299 #if __TBB_STATISTICS_EARLY_DUMP 302 *
my_slots[i].my_counters +=
s->my_counters;
308 dump_statistics( *
my_slots[i].my_counters, i );
311 dump_statistics( *
my_slots[0].my_counters, 0 );
312 #if __TBB_STATISTICS_STDOUT 313 #if !__TBB_STATISTICS_TOTALS_ONLY 314 printf(
"----------------------------------------------\n" );
316 dump_statistics( total, workers_counters_total );
318 dump_statistics( total, arena_counters_total );
319 #if !__TBB_STATISTICS_TOTALS_ONLY 320 printf(
"==============================================\n" );
326 #if __TBB_TASK_PRIORITY 331 inline bool arena::may_have_tasks ( generic_scheduler*
s,
bool& tasks_present,
bool& dequeuing_possible ) {
332 if ( !
s ||
s->my_arena !=
this )
334 dequeuing_possible |=
s->worker_outermost_level();
335 if (
s->my_pool_reshuffling_pending ) {
338 tasks_present =
true;
341 if (
s->my_offloaded_tasks ) {
342 tasks_present =
true;
343 if (
s->my_local_reload_epoch < *
s->my_ref_reload_epoch ) {
352 void arena::orphan_offloaded_tasks(generic_scheduler&
s) {
355 ++my_abandonment_epoch;
356 __TBB_ASSERT(
s.my_offloaded_task_list_tail_link && !*
s.my_offloaded_task_list_tail_link, NULL );
359 orphans = const_cast<task*>(my_orphaned_tasks);
360 *
s.my_offloaded_task_list_tail_link = orphans;
361 }
while (
as_atomic(my_orphaned_tasks).compare_and_swap(
s.my_offloaded_tasks, orphans) != orphans );
362 s.my_offloaded_tasks = NULL;
364 s.my_offloaded_task_list_tail_link = NULL;
384 advertise_new_work<work_enqueued>();
385 #if __TBB_TASK_PRIORITY 390 if ( p < my_bottom_priority || p > my_top_priority )
416 #if __TBB_TASK_PRIORITY 418 intptr_t top_priority = my_top_priority;
422 for( k=0; k<n; ++k ) {
433 bool work_absent = k == n;
434 #if __TBB_TASK_PRIORITY 437 bool tasks_present = !work_absent || my_orphaned_tasks;
438 bool dequeuing_possible =
false;
443 uintptr_t abandonment_epoch = my_abandonment_epoch;
449 the_context_state_propagation_mutex.lock();
450 work_absent = !may_have_tasks(
my_slots[0].my_scheduler, tasks_present, dequeuing_possible );
451 the_context_state_propagation_mutex.unlock();
464 for( k = 1; work_absent && k < n; ++k ) {
467 work_absent = !may_have_tasks(
my_slots[k].my_scheduler, tasks_present, dequeuing_possible );
470 work_absent = work_absent
472 && abandonment_epoch == my_abandonment_epoch;
477 #if __TBB_TASK_PRIORITY 479 work_absent = work_absent && (!dequeuing_possible || no_fifo_tasks)
480 && top_priority == my_top_priority && reload_epoch == my_reload_epoch;
483 work_absent = work_absent && no_fifo_tasks;
486 #if __TBB_TASK_PRIORITY 487 if ( top_priority > my_bottom_priority ) {
488 if (
my_market->lower_arena_priority(*
this, top_priority - 1, reload_epoch)
491 atomic_update( my_skipped_fifo_priority, top_priority, std::less<intptr_t>());
494 else if ( !tasks_present && !my_orphaned_tasks && no_fifo_tasks ) {
500 #if __TBB_ENQUEUE_ENFORCED_CONCURRENCY 501 if( my_concurrency_mode==cm_enforced_global ) {
503 my_market->mandatory_concurrency_disable(
this );
515 #if __TBB_TASK_PRIORITY 532 #if __TBB_COUNT_TASK_NODES 533 intptr_t arena::workers_task_node_count() {
538 result +=
s->my_task_node_count;
546 #if __TBB_RECYCLE_TO_ENQUEUE 557 __TBB_ASSERT( ref_count!=0,
"attempt to enqueue task whose parent has a ref_count==0 (forgot to set_ref_count?)" );
558 __TBB_ASSERT( ref_count>0,
"attempt to enqueue task whose parent has a ref_count<0" );
565 #if __TBB_TASK_PRIORITY 566 intptr_t
p = prio ? normalize_priority(
priority_t(prio)) : normalized_normal_priority;
567 assert_priority_valid(
p);
569 if (
p != my_top_priority )
572 __TBB_ASSERT_EX(prio == 0,
"the library is not configured to respect the task priority");
575 advertise_new_work<work_enqueued>();
576 #if __TBB_TASK_PRIORITY 577 if (
p != my_top_priority )
593 s->nested_arena_entry(a, slot_index);
597 #if __TBB_TASK_GROUP_CONTEXT 606 #if __TBB_TASK_PRIORITY 623 #if __TBB_TASK_GROUP_CONTEXT 636 #if __TBB_TASK_PRIORITY 637 if ( my_offloaded_tasks )
638 my_arena->orphan_offloaded_tasks( *
this );
639 my_offloaded_tasks = NULL;
649 #if __TBB_ARENA_OBSERVER 650 my_last_local_observer = 0;
651 my_arena->my_observers.notify_entry_observers( my_last_local_observer,
false );
656 #if __TBB_ARENA_OBSERVER 657 my_arena->my_observers.notify_exit_observers( my_last_local_observer,
false );
659 #if __TBB_TASK_PRIORITY 660 if ( my_offloaded_tasks )
661 my_arena->orphan_offloaded_tasks( *
this );
685 namespace interface7 {
697 #if __TBB_TASK_GROUP_CONTEXT 701 new_arena->my_default_ctx->capture_fp_settings();
710 #if __TBB_TASK_GROUP_CONTEXT 723 my_arena->my_market->release(
true,
false );
726 #if __TBB_TASK_GROUP_CONTEXT 735 if(
s &&
s->my_arena ) {
741 #if __TBB_TASK_GROUP_CONTEXT 757 #if __TBB_TASK_GROUP_CONTEXT 760 "The task will not be executed because default task_group_context of task_arena is cancelled. Has previously enqueued task thrown an exception?");
762 my_arena->enqueue_task( t, prio,
s->my_random );
771 __TBB_ASSERT(
s.outermost_level(),
"expected to be enqueued and received on the outermost level");
772 struct outermost_context : internal::no_copy {
779 : t(_t),
s(_s), orig_dummy(
s.my_dummy_task), orig_props(
s.my_properties) {
781 #if __TBB_TASK_GROUP_CONTEXT 782 orig_ctx = t->prefix().context;
783 t->prefix().context =
s.my_arena->my_default_ctx;
789 ~outermost_context() {
790 #if __TBB_TASK_GROUP_CONTEXT 792 t->prefix().context = orig_ctx;
794 s.my_properties = orig_props;
795 s.my_dummy_task = orig_dummy;
819 bool same_arena =
s->my_arena ==
my_arena;
820 size_t index1 =
s->my_arena_index;
822 index1 =
my_arena->occupy_free_slot<
false>(*s);
825 #if __TBB_USE_OPTIONAL_RTTI 833 internal::delegated_function< graph_funct, void >* deleg_funct =
834 dynamic_cast< internal::delegated_function< graph_funct, void>*
>(&
d);
839 (internal::forward< graph_funct >(deleg_funct->my_func)), 0);
844 #if __TBB_TASK_GROUP_CONTEXT 857 my_arena->my_exit_monitors.prepare_wait(waiter, (uintptr_t)&
d);
859 my_arena->my_exit_monitors.cancel_wait(waiter);
862 index2 =
my_arena->occupy_free_slot<
false>(*s);
864 my_arena->my_exit_monitors.cancel_wait(waiter);
866 s->local_wait_for_all(root, NULL);
867 #if TBB_USE_EXCEPTIONS 873 my_arena->my_exit_monitors.commit_wait(waiter);
878 my_arena->my_exit_monitors.notify_one();
880 #if TBB_USE_EXCEPTIONS 883 TbbRethrowException(pe);
886 #if __TBB_USE_OPTIONAL_RTTI 894 #if TBB_USE_EXCEPTIONS 900 #if TBB_USE_EXCEPTIONS 923 __TBB_ASSERT(
s->outermost_level(),
"The enqueued task can be processed only on outermost level" );
924 if (
s->is_worker() ) {
927 s->my_innermost_running_task =
s->my_dummy_task;
928 s->local_wait_for_all( *
s->my_dummy_task, NULL );
929 s->my_innermost_running_task =
this;
930 }
else s->my_arena->is_out_of_work();
942 __TBB_ASSERT(
s->my_arena !=
my_arena ||
s->my_arena_index == 0,
"task_arena::wait_until_empty() is not supported within a worker context" );
946 if( !
s->my_arena_index )
947 while(
my_arena->num_workers_active() )
948 s->wait_until_empty();
952 &&
as_atomic(
my_arena->my_slots[0].my_scheduler).compare_and_swap(
s, NULL) == NULL ) {
954 s->wait_until_empty();
969 return s?
int(
s->my_arena_index) : -1;
972 #if __TBB_TASK_ISOLATION 977 isolation_guard(
isolation_tag &isolation ) : guarded( isolation ), previous_value( isolation ) {}
979 guarded = previous_value;
987 __TBB_ASSERT(
s,
"this_task_arena::isolate() needs an initialized scheduler" );
990 isolation_tag& current_isolation =
s->my_innermost_running_task->prefix().isolation;
992 isolation_guard guard( current_isolation );
993 current_isolation = reinterpret_cast<isolation_tag>(&
d);
Class representing where mail is put.
#define __TBB_ISOLATION_ARG(arg1, isolation)
task object is freshly allocated or recycled.
void __TBB_EXPORTED_METHOD internal_terminate()
arena_slot * my_arena_slot
Pointer to the slot in the arena we own at the moment.
void initialize(unsigned n_lanes)
unsigned my_max_num_workers
The number of workers requested by the master thread owning the arena.
void on_thread_leaving()
Notification that worker or master leaves its arena.
int my_num_workers_requested
The number of workers that are currently requested from the resource manager.
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 * task
nested_arena_context(generic_scheduler *s, arena *a, size_t slot_index, bool type, bool same)
T1 atomic_update(tbb::atomic< T1 > &dst, T2 newValue, Pred compare)
Atomically replaces value of dst with newValue if they satisfy condition of compare predicate.
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
static int allocation_size(unsigned num_slots)
void __TBB_EXPORTED_METHOD internal_wait() const
void copy_fp_settings(const task_group_context &src)
Copies FPU control setting from another context.
static unsigned default_num_threads()
#define __TBB_ASSERT_EX(predicate, comment)
"Extended" version is useful to suppress warnings if a variable is only used with an assert
A fast random number generator.
Base class for user-defined tasks.
bool is_idle_state(bool value) const
Indicate whether thread that reads this mailbox is idle.
Work stealing task scheduler.
task_group_context * my_context
default context of the arena
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
void __TBB_store_with_release(volatile T &location, V value)
atomic< T > & as_atomic(T &t)
void const char const char int ITT_FORMAT __itt_group_sync s
internal::delegate_base & my_delegate
#define __TBB_CONTEXT_ARG1(context)
void set_is_idle(bool value)
Indicate whether thread that reads this mailbox is idle.
market * my_market
The market that owns this arena.
bool release(bool is_public, bool blocking_terminate)
Decrements market's refcount and destroys it in the end.
bool empty(int level)
Checks existence of a task.
static const pool_state_t SNAPSHOT_FULL
At least one task has been offered for stealing since the last snapshot started.
static const intptr_t num_priority_levels
binary_semaphore for concurrent monitor
Base class for types that should not be copied or assigned.
internal::tbb_exception_ptr exception_container_type
Smart holder for the empty task class with automatic destruction.
void free_arena()
Completes arena shutdown, destructs and deallocates it.
void mimic_outermost_level(arena *a, bool type)
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id parent
bool has_enqueued_tasks()
Check for the presence of enqueued tasks at all priority levels.
unsigned num_workers_active()
The number of workers active in the arena.
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
void const char const char int ITT_FORMAT __itt_group_sync p
scheduler_properties my_properties
task * my_dummy_task
Fake root task created by slave threads.
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s __itt_frame ITT_FORMAT p const char const char ITT_FORMAT s __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope scope
bool is_out_of_work()
Check if there is job anywhere in arena.
static const size_t out_of_arena
static market & global_market(bool is_public, unsigned max_num_workers=0, size_t stack_size=0)
Factory method creating new market object.
void construct()
Construct *this as a mailbox from zeroed memory.
static int unsigned num_arena_slots(unsigned num_slots)
bool operator()(uintptr_t ctx) const
concurrent_monitor & my_monitor
void process(generic_scheduler &)
Registers the worker with the arena and enters TBB scheduler dispatch loop.
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 sync_releasing
void attach_mailbox(affinity_id id)
void attach_arena(arena *, size_t index, bool is_master)
void adjust_demand(arena &, int delta)
Request that arena's need in workers should be adjusted.
void free_task_pool()
Deallocate task pool that was allocated by means of allocate_task_pool.
T __TBB_load_with_acquire(const volatile T &location)
size_t __TBB_EXPORTED_FUNC NFS_GetLineSize()
Cache/sector line size.
static const unsigned ref_external
Reference increment values for externals and workers.
static void assume_scheduler(generic_scheduler *s)
Temporarily set TLS slot to the given scheduler.
static const pool_state_t SNAPSHOT_EMPTY
No tasks to steal since last snapshot was taken.
static generic_scheduler * local_scheduler_if_initialized()
#define ITT_NOTIFY(name, obj)
unsigned hint_for_pop
Hint provided for operations with the container of starvation-resistant tasks.
task_group_context * my_orig_ctx
intptr_t my_version_and_traits
Special settings.
static bool is_set(generic_scheduler *s)
Used to check validity of the local scheduler TLS contents.
static arena & allocate_arena(market &, unsigned num_slots, unsigned num_reserved_slots)
Allocate an instance of arena.
task is in ready pool, or is going to be put there, or was just taken off.
static generic_scheduler * local_scheduler_weak()
void __TBB_EXPORTED_METHOD internal_attach()
delegated_task(internal::delegate_base &d, concurrent_monitor &s, task *t)
int my_max_concurrency
Concurrency level for deferred initialization.
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 __TBB_EXPORTED_FUNC isolate_within_arena(delegate_base &d, intptr_t reserved=0)
Used to form groups of tasks.
void __TBB_EXPORTED_METHOD internal_execute(delegate_base &) const
Bit-field representing properties of a sheduler.
#define ITT_SYNC_CREATE(obj, type, name)
void __TBB_EXPORTED_METHOD internal_enqueue(task &, intptr_t) const
internal::arena * my_arena
NULL if not currently initialized.
static const int automatic
Typedef for number of threads that is automatic.
unsigned my_num_workers_allotted
The number of workers that have been marked out by the resource manager to service the arena.
intptr_t isolation_tag
A tag for task isolation.
size_t occupy_free_slot(generic_scheduler &s)
Tries to occupy a slot in the arena. On success, returns the slot index; if no slot is available,...
static arena * create_arena(int num_slots, int num_reserved_slots, size_t stack_size)
Creates an arena object.
wait_task(binary_semaphore &sema)
intptr_t drain()
Destroys all remaining tasks in every lane. Returns the number of destroyed tasks.
task_stream< num_priority_levels > my_task_stream
Task pool for the tasks scheduled via task::enqueue() method.
task * parent() const
task on whose behalf this task is working, or NULL if this is a root.
uintptr_t my_version_and_traits
Version for run-time checks and behavioral traits of the context.
void __TBB_EXPORTED_METHOD register_pending_exception()
Records the pending exception, and cancels the task group.
unsigned my_master_slots
Reserved master slots.
atomic< unsigned > my_limit
The maximal number of currently busy slots.
void *__TBB_EXPORTED_FUNC NFS_Allocate(size_t n_element, size_t element_size, void *hint)
Allocate memory on cache/sector line boundary.
value_type compare_and_swap(value_type value, value_type comparand)
state_type state() const
Current execution state.
void notify_one()
Notify one thread about the event.
uintptr_t my_arenas_aba_epoch
ABA prevention marker to assign to newly created arenas.
bool type
Indicates that a scheduler acts as a master or a worker.
static int __TBB_EXPORTED_FUNC internal_current_slot()
void restore_priority_if_need()
If enqueued tasks found, restore arena priority and task presence status.
#define __TBB_CONTEXT_ARG(arg1, context)
Set if ref_count might be changed by another thread. Used for debugging.
unsigned my_num_reserved_slots
The number of reserved slots (can be occupied only by masters).
market * my_market
The market I am in.
int ref_count() const
The internal reference count.
void spin_wait_while_eq(const volatile T &location, U value)
Spin WHILE the value of the variable is equal to a given value.
exception_container_type * my_exception
Pointer to the container storing exception being propagated across this task group.
unsigned short affinity_id
An id as used for specifying affinity.
unsigned my_num_slots
The number of slots in the arena.
virtual void local_wait_for_all(task &parent, task *child)=0
cpu_ctl_env my_cpu_ctl_env
FPU control settings of arena's master thread captured at the moment of arena instantiation.
atomic< unsigned > my_references
Reference counter for the arena.
__TBB_atomic reference_count ref_count
Reference count used for synchronization.
arena * my_arena
The arena that I own (if master) or am servicing at the moment (if worker)
tbb::atomic< uintptr_t > my_pool_state
Current task pool state and estimate of available tasks amount.
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
arena(market &, unsigned max_num_workers, unsigned num_reserved_slots)
Constructor.
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id head
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
static void one_time_init()
mail_outbox & mailbox(affinity_id id)
Get reference to mailbox corresponding to given affinity_id.
void __TBB_EXPORTED_FUNC NFS_Free(void *)
Free memory allocated by NFS_Allocate.
bool outermost
Indicates that a scheduler is on outermost level.
size_t occupy_free_slot_in_range(generic_scheduler &s, size_t lower, size_t upper)
Tries to occupy a slot in the specified range.
static int __TBB_EXPORTED_FUNC internal_max_concurrency(const task_arena *)
T __TBB_load_relaxed(const volatile T &location)
void nested_arena_entry(arena *, size_t)
void set_ctx(__TBB_CONTEXT_ARG1(task_group_context *))
scheduler_state my_orig_state
generic_scheduler * my_scheduler
Scheduler of the thread attached to the slot.
size_t my_arena_index
Index of the arena slot the scheduler occupies now, or occupied last time.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
bool is_worker() const
True if running on a worker thread, false otherwise.
#define __TBB_ENQUEUE_ENFORCED_CONCURRENCY
intptr_t reference_count
A reference count.
A functor that spawns a task.
void notify(const P &predicate)
Notify waiting threads of the event that satisfies the given predicate.
uintptr_t my_aba_epoch
ABA prevention marker.
const isolation_tag no_isolation
concurrent_monitor my_exit_monitors
Waiting object for master threads that cannot join the arena.
task * execute() __TBB_override
Should be overridden by derived classes.
void enqueue_task(task &, intptr_t, FastRandom &)
enqueue a task into starvation-resistance queue
intptr_t drain()
Drain the mailbox.
binary_semaphore & my_signal
void __TBB_EXPORTED_METHOD internal_initialize()
void push(task *source, int level, FastRandom &random)
Push a task into a lane.
task * my_innermost_running_task
Innermost task whose task::execute() is running. A dummy task on the outermost level.
#define GATHER_STATISTIC(x)
static bool occupy_slot(generic_scheduler *&slot, generic_scheduler &s)
task * execute() __TBB_override
Should be overridden by derived classes.
generic_scheduler & my_scheduler
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id tail