Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::task Class Referenceabstract

Base class for user-defined tasks. More...

#include <task.h>

Inheritance diagram for tbb::task:
Collaboration diagram for tbb::task:

Public Types

enum  state_type {
  executing, reexecute, ready, allocated,
  freed, recycle
}
 Enumeration of task states that the scheduler considers. More...
 
typedef internal::affinity_id affinity_id
 An id as used for specifying affinity. More...
 

Public Member Functions

virtual ~task ()
 Destructor. More...
 
virtual taskexecute ()=0
 Should be overridden by derived classes. More...
 
internal::allocate_continuation_proxyallocate_continuation ()
 Returns proxy for overloaded new that allocates a continuation task of *this. More...
 
internal::allocate_child_proxyallocate_child ()
 Returns proxy for overloaded new that allocates a child task of *this. More...
 
void recycle_as_continuation ()
 Change this to be a continuation of its former self. More...
 
void recycle_as_safe_continuation ()
 Recommended to use, safe variant of recycle_as_continuation. More...
 
void recycle_as_child_of (task &new_parent)
 Change this to be a child of new_parent. More...
 
void recycle_to_reexecute ()
 Schedule this for reexecution after current execute() returns. More...
 
void set_ref_count (int count)
 Set reference count. More...
 
void increment_ref_count ()
 Atomically increment reference count. More...
 
int add_ref_count (int count)
 Atomically adds to reference count and returns its new value. More...
 
int decrement_ref_count ()
 Atomically decrement reference count and returns its new value. More...
 
void spawn_and_wait_for_all (task &child)
 Similar to spawn followed by wait_for_all, but more efficient. More...
 
void __TBB_EXPORTED_METHOD spawn_and_wait_for_all (task_list &list)
 Similar to spawn followed by wait_for_all, but more efficient. More...
 
void wait_for_all ()
 Wait for reference count to become one, and set reference count to zero. More...
 
taskparent () const
 task on whose behalf this task is working, or NULL if this is a root. More...
 
void set_parent (task *p)
 sets parent task pointer to specified value More...
 
task_group_contextcontext ()
 This method is deprecated and will be removed in the future. More...
 
task_group_contextgroup ()
 Pointer to the task group descriptor. More...
 
bool is_stolen_task () const
 True if task was stolen from the task pool of another thread. More...
 
bool is_enqueued_task () const
 True if the task was enqueued. More...
 
state_type state () const
 Current execution state. More...
 
int ref_count () const
 The internal reference count. More...
 
bool __TBB_EXPORTED_METHOD is_owned_by_current_thread () const
 Obsolete, and only retained for the sake of backward compatibility. Always returns true. More...
 
void set_affinity (affinity_id id)
 Set affinity for this task. More...
 
affinity_id affinity () const
 Current affinity of this task. More...
 
virtual void __TBB_EXPORTED_METHOD note_affinity (affinity_id id)
 Invoked by scheduler to notify task that it ran on unexpected thread. More...
 
void __TBB_EXPORTED_METHOD change_group (task_group_context &ctx)
 Moves this task from its current group into another one. More...
 
bool cancel_group_execution ()
 Initiates cancellation of all tasks in this cancellation group and its subordinate groups. More...
 
bool is_cancelled () const
 Returns true if the context has received cancellation request. More...
 
__TBB_DEPRECATED void set_group_priority (priority_t p)
 Changes priority of the task group this task belongs to. More...
 
__TBB_DEPRECATED priority_t group_priority () const
 Retrieves current priority of the task group this task belongs to. More...
 

Static Public Member Functions

static internal::allocate_root_proxy allocate_root ()
 Returns proxy for overloaded new that allocates a root task. More...
 
static internal::allocate_root_with_context_proxy allocate_root (task_group_context &ctx)
 Returns proxy for overloaded new that allocates a root task associated with user supplied context. More...
 
static void spawn_root_and_wait (task &root)
 Spawn task allocated by allocate_root, wait for it to complete, and deallocate it. More...
 
static void spawn_root_and_wait (task_list &root_list)
 Spawn root tasks on list and wait for all of them to finish. More...
 
static void enqueue (task &t)
 Enqueue task for starvation-resistant execution. More...
 
static __TBB_DEPRECATED void enqueue (task &t, priority_t p)
 Enqueue task for starvation-resistant execution on the specified priority level. More...
 
static __TBB_DEPRECATED void enqueue (task &t, task_arena &arena, priority_t p=priority_t(0))
 Enqueue task in task_arena. More...
 
static task &__TBB_EXPORTED_FUNC self ()
 The innermost task being executed or destroyed by the current thread at the moment. More...
 

Protected Member Functions

 task ()
 Default constructor. More...
 

Private Member Functions

void __TBB_EXPORTED_METHOD internal_set_ref_count (int count)
 Set reference count. More...
 
internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count ()
 Decrement reference count and return its new value. More...
 
internal::task_prefixprefix (internal::version_tag *=NULL) const
 Get reference to corresponding task_prefix. More...
 

Friends

class interface5::internal::task_base
 
class task_list
 
class internal::scheduler
 
class internal::allocate_root_proxy
 
class internal::allocate_root_with_context_proxy
 
class internal::allocate_continuation_proxy
 
class internal::allocate_child_proxy
 
class internal::allocate_additional_child_of_proxy
 
void internal::make_critical (task &)
 
bool internal::is_critical (task &)
 

Detailed Description

Base class for user-defined tasks.

Definition at line 604 of file task.h.

Member Typedef Documentation

◆ affinity_id

An id as used for specifying affinity.

Guaranteed to be integral type. Value of 0 means no affinity.

Definition at line 929 of file task.h.

Member Enumeration Documentation

◆ state_type

Enumeration of task states that the scheduler considers.

Enumerator
executing 

task is running, and will be destroyed after method execute() completes.

reexecute 

task to be rescheduled.

ready 

task is in ready pool, or is going to be put there, or was just taken off.

allocated 

task object is freshly allocated or recycled.

freed 

task object is on free list, or is going to be put there, or was just taken off.

recycle 

task to be recycled as continuation

Definition at line 624 of file task.h.

624  {
626  executing,
628  reexecute,
630  ready,
632  allocated,
634  freed,
636  recycle
637 #if __TBB_RECYCLE_TO_ENQUEUE
638  ,to_enqueue
640 #endif
641 #if __TBB_PREVIEW_RESUMABLE_TASKS
642  ,to_resume
644 #endif
645  };
task to be rescheduled.
Definition: task.h:628
task object is freshly allocated or recycled.
Definition: task.h:632
task is running, and will be destroyed after method execute() completes.
Definition: task.h:626
task is in ready pool, or is going to be put there, or was just taken off.
Definition: task.h:630
task object is on free list, or is going to be put there, or was just taken off.
Definition: task.h:634
task to be recycled as continuation
Definition: task.h:636

Constructor & Destructor Documentation

◆ task()

tbb::task::task ( )
inlineprotected

Default constructor.

Definition at line 614 of file task.h.

614 {prefix().extra_state=1;}
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
unsigned char extra_state
Miscellaneous state that is not directly visible to users, stored as a byte for compactness.
Definition: task.h:281

References tbb::internal::task_prefix::extra_state, and prefix().

Here is the call graph for this function:

◆ ~task()

virtual tbb::task::~task ( )
inlinevirtual

Destructor.

Definition at line 618 of file task.h.

618 {}

Referenced by tbb::interface5::internal::task_base::destroy(), and tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop().

Here is the caller graph for this function:

Member Function Documentation

◆ add_ref_count()

int tbb::task::add_ref_count ( int  count)
inline

Atomically adds to reference count and returns its new value.

Has release-acquire semantics

Definition at line 766 of file task.h.

766  {
768  internal::reference_count k = count+__TBB_FetchAndAddW( &prefix().ref_count, count );
769  __TBB_ASSERT( k>=0, "task's reference count underflowed" );
770  if( k==0 )
772  return int(k);
773  }
void call_itt_notify(notify_type, void *)
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
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_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
int ref_count() const
The internal reference count.
Definition: task.h:904
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
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 count
intptr_t reference_count
A reference count.
Definition: task.h:120

References __TBB_ASSERT, tbb::internal::acquired, tbb::internal::call_itt_notify(), count, int, prefix(), ref_count(), and tbb::internal::releasing.

Here is the call graph for this function:

◆ affinity()

affinity_id tbb::task::affinity ( ) const
inline

Current affinity of this task.

Definition at line 935 of file task.h.

935 {return prefix().affinity;}
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
affinity_id affinity
Definition: task.h:283

References tbb::internal::task_prefix::affinity, and prefix().

Here is the call graph for this function:

◆ allocate_child()

internal::allocate_child_proxy& tbb::task::allocate_child ( )
inline

◆ allocate_continuation()

internal::allocate_continuation_proxy& tbb::task::allocate_continuation ( )
inline

Returns proxy for overloaded new that allocates a continuation task of *this.

The continuation's parent becomes the parent of *this.

Definition at line 665 of file task.h.

665  {
666  return *reinterpret_cast<internal::allocate_continuation_proxy*>(this);
667  }

Referenced by tbb::interface9::internal::allocate_sibling(), tbb::flow::interface11::internal::prioritize_task(), and tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_random_access_iterator().

Here is the caller graph for this function:

◆ allocate_root() [1/2]

◆ allocate_root() [2/2]

static internal::allocate_root_with_context_proxy tbb::task::allocate_root ( task_group_context ctx)
inlinestatic

Returns proxy for overloaded new that allocates a root task associated with user supplied context.

Definition at line 658 of file task.h.

658  {
660  }
friend class internal::allocate_root_with_context_proxy
Definition: task.h:983

◆ cancel_group_execution()

bool tbb::task::cancel_group_execution ( )
inline

Initiates cancellation of all tasks in this cancellation group and its subordinate groups.

Returns
false if cancellation has already been requested, true otherwise.

Definition at line 960 of file task.h.

960 { return prefix().context->cancel_group_execution(); }
bool __TBB_EXPORTED_METHOD cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219

References tbb::task_group_context::cancel_group_execution(), tbb::internal::task_prefix::context, and prefix().

Referenced by tbb::interface9::internal::quick_sort_pretest_body< RandomAccessIterator, Compare >::operator()().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ change_group()

void __TBB_EXPORTED_METHOD tbb::task::change_group ( task_group_context ctx)

Moves this task from its current group into another one.

Argument ctx specifies the new group.

The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method change_group() allows to make task group context object a member of the task class, and then associate it with its containing task object in the latter's constructor.

◆ context()

task_group_context* tbb::task::context ( )
inline

This method is deprecated and will be removed in the future.

Use method group() instead.

Definition at line 867 of file task.h.

867 {return prefix().context;}
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219

References tbb::internal::task_prefix::context, and prefix().

Referenced by tbb::internal::generic_scheduler::prepare_for_spawning(), tbb::interface9::internal::start_for< Range, Body, Partitioner >::run(), and set_parent().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ decrement_ref_count()

int tbb::task::decrement_ref_count ( )
inline

Atomically decrement reference count and returns its new value.

Has release semantics.

Definition at line 777 of file task.h.

777  {
778 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
780 #else
782 #endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
783  }
internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count()
Decrement reference count and return its new value.
Definition: task.cpp:192
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
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_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
int ref_count() const
The internal reference count.
Definition: task.h:904
#define __TBB_FetchAndDecrementWrelease(P)
Definition: tbb_machine.h:311

References __TBB_FetchAndDecrementWrelease, int, internal_decrement_ref_count(), prefix(), and ref_count().

Referenced by tbb::internal::task_group_base::ref_count_guard::~ref_count_guard().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ enqueue() [1/3]

static void tbb::task::enqueue ( task t)
inlinestatic

Enqueue task for starvation-resistant execution.

The task will be enqueued on the normal priority level disregarding the priority of its task group.

The rationale of such semantics is that priority of an enqueued task is statically fixed at the moment of its enqueuing, while task group priority is dynamic. Thus automatic priority inheritance would be generally a subject to the race, which may result in unexpected behavior.

Use enqueue() overload with explicit priority value and task::group_priority() method to implement such priority inheritance when it is really necessary.

Definition at line 825 of file task.h.

825  {
826  t.prefix().owner->enqueue( t, NULL );
827  }

References tbb::internal::scheduler::enqueue(), tbb::internal::task_prefix::owner, and prefix().

Referenced by enqueue(), and tbb::flow::interface11::internal::enqueue_in_graph_arena().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ enqueue() [2/3]

static __TBB_DEPRECATED void tbb::task::enqueue ( task t,
priority_t  p 
)
inlinestatic

Enqueue task for starvation-resistant execution on the specified priority level.

Definition at line 831 of file task.h.

831  {
832 #if __TBB_PREVIEW_CRITICAL_TASKS
834  || p == internal::priority_critical, "Invalid priority level value");
835 #else
836  __TBB_ASSERT(p == priority_low || p == priority_normal || p == priority_high, "Invalid priority level value");
837 #endif
838  t.prefix().owner->enqueue( t, (void*)p );
839  }
static const int priority_critical
Definition: task.h:302
void const char const char int ITT_FORMAT __itt_group_sync p
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

◆ enqueue() [3/3]

void tbb::task::enqueue ( task t,
task_arena arena,
priority_t  p = priority_t(0) 
)
inlinestatic

Enqueue task in task_arena.

Enqueue task in task_arena The implementation is in task_arena.h

Note: the context of the task may differ from the context instantiated by task_arena

Definition at line 497 of file task_arena.h.

497  {
498 #else
499 void task::enqueue( task& t, task_arena& arena ) {
500  intptr_t p = 0;
501 #endif
502  arena.initialize();
504  arena.internal_enqueue(t, p);
505 }
void const char const char int ITT_FORMAT __itt_group_sync p
static void enqueue(task &t)
Enqueue task for starvation-resistant execution.
Definition: task.h:825
task()
Default constructor.
Definition: task.h:614

References enqueue(), and p.

Here is the call graph for this function:

◆ execute()

virtual task* tbb::task::execute ( )
pure virtual

Should be overridden by derived classes.

Implemented in tbb::flow::interface11::overwrite_node< T >::register_predecessor_task, tbb::internal::function_task< F >, tbb::empty_task, tbb::internal::pipeline_root_task, tbb::flow::interface11::internal::source_task_bypass< NodeType >, tbb::interface9::internal::do_task_iter< Iterator, Body, Item >, tbb::flow::interface11::internal::apply_body_task_bypass< NodeType, Input >, tbb::flow::interface11::internal::forward_task_bypass< NodeType >, tbb::internal::stage_task, tbb::interface9::internal::do_group_task_input< Body, Item >, tbb::flow::interface10::graph::run_and_put_task< Receiver, Body >, tbb::interface9::internal::start_deterministic_reduce< Range, Body, Partitioner >, tbb::interface9::internal::do_group_task_forward< Iterator, Body, Item >, tbb::flow::interface10::graph::run_task< Body >, tbb::interface9::internal::finish_deterministic_reduce< Body >, tbb::internal::start_scan< Range, Body, Partitioner >, tbb::flow::interface11::internal::priority_task_selector, tbb::internal::finish_scan< Range, Body >, tbb::interface9::internal::do_iteration_task_iter< Iterator, Body, Item >, tbb::interface9::internal::flag_task, tbb::internal::sum_node< Range, Body >, tbb::interface9::internal::do_iteration_task< Body, Item >, tbb::interface9::internal::start_reduce< Range, Body, Partitioner >, tbb::internal::while_task< Stream, Body >, tbb::internal::task_handle_task< F >, tbb::internal::final_sum< Range, Body >, tbb::internal::spawner< N, function1, function2, function3 >, tbb::interface9::internal::finish_reduce< Body >, tbb::internal::while_group_task< Body >, tbb::internal::function_invoker< function >, tbb::interface9::internal::start_for< Range, Body, Partitioner >, and tbb::internal::while_iteration_task< Body >.

Referenced by tbb::interface9::internal::start_for< Range, Body, Partitioner >::execute(), tbb::flow::interface11::internal::priority_task_selector::execute(), tbb::interface9::internal::start_deterministic_reduce< Range, Body, Partitioner >::execute(), and tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop().

Here is the caller graph for this function:

◆ group()

task_group_context* tbb::task::group ( )
inline

Pointer to the task group descriptor.

Definition at line 870 of file task.h.

870 { return prefix().context; }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219

References tbb::internal::task_prefix::context, and prefix().

Here is the call graph for this function:

◆ group_priority()

__TBB_DEPRECATED priority_t tbb::task::group_priority ( ) const
inline

Retrieves current priority of the task group this task belongs to.

Definition at line 973 of file task.h.

973 { return prefix().context->priority(); }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219
__TBB_DEPRECATED priority_t priority() const
Retrieves current priority of the current task group.

References tbb::internal::task_prefix::context, prefix(), and tbb::task_group_context::priority().

Here is the call graph for this function:

◆ increment_ref_count()

void tbb::task::increment_ref_count ( )
inline

Atomically increment reference count.

Has acquire semantics

Definition at line 760 of file task.h.

760  {
762  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
int ref_count() const
The internal reference count.
Definition: task.h:904
#define __TBB_FetchAndIncrementWacquire(P)
Definition: tbb_machine.h:310

References __TBB_FetchAndIncrementWacquire, prefix(), and ref_count().

Referenced by tbb::internal::allocate_additional_child_of_proxy::allocate(), tbb::internal::task_group_base::ref_count_guard::ref_count_guard(), and tbb::flow::interface10::graph::reserve_wait().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ internal_decrement_ref_count()

internal::reference_count tbb::task::internal_decrement_ref_count ( )
private

Decrement reference count and return its new value.

Definition at line 192 of file task.cpp.

192  {
195  __TBB_ASSERT( k>=1, "task's reference count underflowed" );
196  if( k==1 )
197  ITT_NOTIFY( sync_acquired, &prefix().ref_count );
198  return k-1;
199 }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
int ref_count() const
The internal reference count.
Definition: task.h:904
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
#define __TBB_FetchAndDecrementWrelease(P)
Definition: tbb_machine.h:311
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
#define ITT_NOTIFY(name, obj)
Definition: itt_notify.h:112
intptr_t reference_count
A reference count.
Definition: task.h:120

References __TBB_ASSERT, __TBB_FetchAndDecrementWrelease, ITT_NOTIFY, and sync_releasing.

Referenced by decrement_ref_count(), and tbb::internal::allocate_additional_child_of_proxy::free().

Here is the caller graph for this function:

◆ internal_set_ref_count()

void tbb::task::internal_set_ref_count ( int  count)
private

Set reference count.

Definition at line 183 of file task.cpp.

183  {
184  __TBB_ASSERT( count>=0, "count must not be negative" );
185  task_prefix &p = prefix();
186  __TBB_ASSERT(p.ref_count==1 && p.state==allocated && self().parent()==this
187  || !(p.extra_state & es_ref_count_active), "ref_count race detected");
188  ITT_NOTIFY(sync_releasing, &p.ref_count);
189  p.ref_count = count;
190 }
task object is freshly allocated or recycled.
Definition: task.h:632
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
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 const char const char int ITT_FORMAT __itt_group_sync p
Memory prefix to a task object.
Definition: task.h:192
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
#define ITT_NOTIFY(name, obj)
Definition: itt_notify.h:112
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 count
Set if ref_count might be changed by another thread. Used for debugging.

References __TBB_ASSERT, count, tbb::internal::es_ref_count_active, ITT_NOTIFY, p, and sync_releasing.

Referenced by set_ref_count().

Here is the caller graph for this function:

◆ is_cancelled()

bool tbb::task::is_cancelled ( ) const
inline

Returns true if the context has received cancellation request.

Definition at line 963 of file task.h.

bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219

References tbb::internal::task_prefix::context, tbb::task_group_context::is_group_execution_cancelled(), and prefix().

Referenced by tbb::is_current_task_group_canceling(), and tbb::interface9::internal::quick_sort_pretest_body< RandomAccessIterator, Compare >::operator()().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_enqueued_task()

bool tbb::task::is_enqueued_task ( ) const
inline

True if the task was enqueued.

Definition at line 879 of file task.h.

879  {
880  // es_task_enqueued = 0x10
881  return (prefix().extra_state & 0x10)!=0;
882  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991

References prefix().

Referenced by tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_owned_by_current_thread()

bool tbb::task::is_owned_by_current_thread ( ) const

Obsolete, and only retained for the sake of backward compatibility. Always returns true.

Definition at line 208 of file task.cpp.

208  {
209  return true;
210 }

◆ is_stolen_task()

bool tbb::task::is_stolen_task ( ) const
inline

True if task was stolen from the task pool of another thread.

Definition at line 874 of file task.h.

874  {
875  return (prefix().extra_state & 0x80)!=0;
876  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991

References prefix().

Referenced by tbb::interface9::internal::dynamic_grainsize_mode< linear_affinity_mode< affinity_partition_type > >::check_being_stolen(), and tbb::interface9::internal::old_auto_partition_type::should_execute_range().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ note_affinity()

void tbb::task::note_affinity ( affinity_id  id)
virtual

Invoked by scheduler to notify task that it ran on unexpected thread.

Invoked before method execute() runs, if task is stolen, or task has affinity but will be executed on another thread.

The default action does nothing.

Defined out of line so that compiler does not replicate task's vtable. It's pointless to define it inline anyway, because all call sites to it are virtual calls that the compiler is unlikely to optimize.

Reimplemented in tbb::interface9::internal::start_reduce< Range, Body, Partitioner >, and tbb::interface9::internal::start_for< Range, Body, Partitioner >.

Definition at line 245 of file task.cpp.

245  {
246 }

Referenced by tbb::internal::generic_scheduler::get_task(), and tbb::internal::generic_scheduler::steal_task().

Here is the caller graph for this function:

◆ parent()

task* tbb::task::parent ( ) const
inline

task on whose behalf this task is working, or NULL if this is a root.

Definition at line 854 of file task.h.

854 {return prefix().parent;}
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
tbb::task * parent
The task whose reference count includes me.
Definition: task.h:256

References tbb::internal::task_prefix::parent, and prefix().

Referenced by tbb::internal::allocate_continuation_proxy::allocate(), tbb::interface9::internal::dynamic_grainsize_mode< linear_affinity_mode< affinity_partition_type > >::check_being_stolen(), tbb::interface5::internal::task_base::destroy(), tbb::internal::arena::enqueue_task(), tbb::internal::stage_task::execute(), tbb::internal::allocate_continuation_proxy::free(), tbb::interface9::internal::flag_task::is_peer_stolen(), tbb::internal::custom_scheduler< SchedulerTraits >::local_wait_for_all(), tbb::interface9::internal::flag_task::mark_task_stolen(), tbb::internal::generic_scheduler::prepare_for_spawning(), and tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ prefix()

internal::task_prefix& tbb::task::prefix ( internal::version_tag = NULL) const
inlineprivate

Get reference to corresponding task_prefix.

Version tag prevents loader on Linux from using the wrong symbol in debug builds.

Definition at line 991 of file task.h.

991  {
992  return reinterpret_cast<internal::task_prefix*>(const_cast<task*>(this))[-1];
993  }

Referenced by add_ref_count(), affinity(), tbb::internal::allocate_additional_child_of_proxy::allocate(), tbb::internal::allocate_root_proxy::allocate(), tbb::internal::allocate_continuation_proxy::allocate(), tbb::internal::allocate_child_proxy::allocate(), tbb::internal::generic_scheduler::allocate_task(), tbb::internal::generic_scheduler::attach_arena(), cancel_group_execution(), tbb::internal::generic_scheduler::cleanup_scheduler(), context(), tbb::internal::generic_scheduler::create_master(), tbb::internal::generic_scheduler::deallocate_task(), decrement_ref_count(), tbb::interface5::internal::task_base::destroy(), enqueue(), tbb::internal::arena::enqueue_task(), tbb::internal::task_proxy::extract_task(), tbb::internal::generic_scheduler::free_nonlocal_small_task(), tbb::internal::generic_scheduler::free_task(), tbb::internal::generic_scheduler::generic_scheduler(), tbb::internal::generic_scheduler::get_task(), group(), group_priority(), increment_ref_count(), is_cancelled(), tbb::internal::is_critical(), is_enqueued_task(), tbb::internal::generic_scheduler::is_proxy(), is_stolen_task(), tbb::internal::generic_scheduler::is_version_3_task(), tbb::internal::generic_scheduler::local_spawn(), tbb::internal::generic_scheduler::local_spawn_root_and_wait(), tbb::internal::custom_scheduler< SchedulerTraits >::local_wait_for_all(), tbb::internal::task_stream< num_priority_levels >::look_specific(), tbb::internal::make_critical(), tbb::internal::nested_arena_context::mimic_outermost_level(), parent(), tbb::internal::auto_empty_task::prefix(), tbb::internal::generic_scheduler::prepare_for_spawning(), tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop(), tbb::task_list::push_back(), recycle_as_child_of(), recycle_as_continuation(), recycle_as_safe_continuation(), recycle_to_reexecute(), ref_count(), tbb::internal::reset_extra_state(), set_affinity(), set_parent(), set_ref_count(), tbb::interface5::internal::task_base::spawn(), spawn_and_wait_for_all(), spawn_root_and_wait(), state(), tbb::internal::generic_scheduler::steal_task(), tbb::internal::generic_scheduler::steal_task_from(), tbb::internal::custom_scheduler< SchedulerTraits >::tally_completion_of_predecessor(), task(), wait_for_all(), tbb::internal::generic_scheduler::wait_until_empty(), and tbb::internal::nested_arena_context::~nested_arena_context().

Here is the caller graph for this function:

◆ recycle_as_child_of()

void tbb::task::recycle_as_child_of ( task new_parent)
inline

Change this to be a child of new_parent.

Definition at line 714 of file task.h.

714  {
715  internal::task_prefix& p = prefix();
716  __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, "execute not running, or already recycled" );
717  __TBB_ASSERT( prefix().ref_count==0, "no child tasks allowed when recycled as a child" );
718  __TBB_ASSERT( p.parent==NULL, "parent must be null" );
719  __TBB_ASSERT( new_parent.prefix().state<=recycle, "corrupt parent's state" );
720  __TBB_ASSERT( new_parent.prefix().state!=freed, "parent already freed" );
721  p.state = allocated;
722  p.parent = &new_parent;
723 #if __TBB_TASK_GROUP_CONTEXT
724  p.context = new_parent.prefix().context;
725 #endif /* __TBB_TASK_GROUP_CONTEXT */
726  }
task object is freshly allocated or recycled.
Definition: task.h:632
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task is running, and will be destroyed after method execute() completes.
Definition: task.h:626
int ref_count() const
The internal reference count.
Definition: task.h:904
void const char const char int ITT_FORMAT __itt_group_sync p
task object is on free list, or is going to be put there, or was just taken off.
Definition: task.h:634
state_type state() const
Current execution state.
Definition: task.h:901
task to be recycled as continuation
Definition: task.h:636
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, allocated, tbb::internal::task_prefix::context, executing, freed, p, prefix(), recycle, ref_count(), tbb::internal::task_prefix::state, and state().

Referenced by tbb::internal::sum_node< Range, Body >::create_child(), and tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_random_access_iterator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ recycle_as_continuation()

void tbb::task::recycle_as_continuation ( )
inline

Change this to be a continuation of its former self.

The caller must guarantee that the task's refcount does not become zero until after the method execute() returns. Typically, this is done by having method execute() return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.

Because of the hazard, this method may be deprecated in the future.

Definition at line 700 of file task.h.

700  {
701  __TBB_ASSERT( prefix().state==executing, "execute not running?" );
702  prefix().state = allocated;
703  }
task object is freshly allocated or recycled.
Definition: task.h:632
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task is running, and will be destroyed after method execute() completes.
Definition: task.h:626
state_type state() const
Current execution state.
Definition: task.h:901
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
unsigned char state
A task::state_type, stored as a byte for compactness.
Definition: task.h:272

References __TBB_ASSERT, allocated, executing, prefix(), tbb::internal::task_prefix::state, and state().

Referenced by tbb::internal::sum_node< Range, Body >::execute(), tbb::internal::stage_task::execute(), and tbb::internal::pipeline_root_task::execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ recycle_as_safe_continuation()

void tbb::task::recycle_as_safe_continuation ( )
inline

Recommended to use, safe variant of recycle_as_continuation.

For safety, it requires additional increment of ref_count. With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute.

Definition at line 708 of file task.h.

708  {
709  __TBB_ASSERT( prefix().state==executing, "execute not running?" );
710  prefix().state = recycle;
711  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task is running, and will be destroyed after method execute() completes.
Definition: task.h:626
state_type state() const
Current execution state.
Definition: task.h:901
task to be recycled as continuation
Definition: task.h:636
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
unsigned char state
A task::state_type, stored as a byte for compactness.
Definition: task.h:272

References __TBB_ASSERT, executing, prefix(), recycle, tbb::internal::task_prefix::state, and state().

Referenced by tbb::internal::spawner< N, function1, function2, function3 >::execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ recycle_to_reexecute()

void tbb::task::recycle_to_reexecute ( )
inline

Schedule this for reexecution after current execute() returns.

Made obsolete by recycle_as_safe_continuation; may become deprecated.

Definition at line 730 of file task.h.

730  {
731  __TBB_ASSERT( prefix().state==executing, "execute not running, or already recycled" );
732  __TBB_ASSERT( prefix().ref_count==0, "no child tasks allowed when recycled for reexecution" );
733  prefix().state = reexecute;
734  }
task to be rescheduled.
Definition: task.h:628
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
task is running, and will be destroyed after method execute() completes.
Definition: task.h:626
int ref_count() const
The internal reference count.
Definition: task.h:904
state_type state() const
Current execution state.
Definition: task.h:901
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
unsigned char state
A task::state_type, stored as a byte for compactness.
Definition: task.h:272

References __TBB_ASSERT, executing, prefix(), reexecute, ref_count(), tbb::internal::task_prefix::state, and state().

Referenced by tbb::internal::while_task< Stream, Body >::execute(), tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_forward_iterator(), and tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_input_iterator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ref_count()

int tbb::task::ref_count ( ) const
inline

The internal reference count.

Definition at line 904 of file task.h.

904  {
905 #if TBB_USE_ASSERT
906 #if __TBB_PREVIEW_RESUMABLE_TASKS
907  internal::reference_count ref_count_ = prefix().ref_count & ~internal::abandon_flag;
908 #else
910 #endif
911  __TBB_ASSERT( ref_count_==int(ref_count_), "integer overflow error");
912 #endif
913 #if __TBB_PREVIEW_RESUMABLE_TASKS
914  return int(prefix().ref_count & ~internal::abandon_flag);
915 #else
916  return int(prefix().ref_count);
917 #endif
918  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
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_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
int ref_count() const
The internal reference count.
Definition: task.h:904
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
intptr_t reference_count
A reference count.
Definition: task.h:120
__TBB_atomic reference_count ref_count
Reference count used for synchronization.
Definition: task.h:263

References __TBB_ASSERT, int, prefix(), and tbb::internal::task_prefix::ref_count.

Referenced by add_ref_count(), tbb::interface9::internal::dynamic_grainsize_mode< linear_affinity_mode< affinity_partition_type > >::check_being_stolen(), decrement_ref_count(), tbb::internal::finish_scan< Range, Body >::execute(), increment_ref_count(), recycle_as_child_of(), recycle_to_reexecute(), and tbb::internal::task_group_base::~task_group_base().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ self()

task & tbb::task::self ( )
static

The innermost task being executed or destroyed by the current thread at the moment.

Definition at line 201 of file task.cpp.

201  {
205  return *v->my_innermost_running_task;
206 }
Work stealing task scheduler.
Definition: scheduler.h:137
static generic_scheduler * local_scheduler_weak()
Definition: governor.h:134
task * my_innermost_running_task
Innermost task whose task::execute() is running. A dummy task on the outermost level.
Definition: scheduler.h:88
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, tbb::internal::generic_scheduler::assert_task_pool_valid(), tbb::internal::governor::local_scheduler_weak(), and tbb::internal::scheduler_state::my_innermost_running_task.

Referenced by tbb::parallel_while< Body >::add(), tbb::is_current_task_group_canceling(), and tbb::interface9::internal::quick_sort_pretest_body< RandomAccessIterator, Compare >::operator()().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_affinity()

void tbb::task::set_affinity ( affinity_id  id)
inline

Set affinity for this task.

Definition at line 932 of file task.h.

932 {prefix().affinity = id;}
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 id
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
affinity_id affinity
Definition: task.h:283

References tbb::internal::task_prefix::affinity, id, and prefix().

Referenced by tbb::interface9::internal::linear_affinity_mode< static_partition_type >::set_affinity(), and tbb::interface9::internal::affinity_partition_type::set_affinity().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_group_priority()

__TBB_DEPRECATED void tbb::task::set_group_priority ( priority_t  p)
inline

Changes priority of the task group this task belongs to.

Definition at line 970 of file task.h.

970 { prefix().context->set_priority(p); }
__TBB_DEPRECATED void set_priority(priority_t)
Changes priority of the task group.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
void const char const char int ITT_FORMAT __itt_group_sync p
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
Definition: task.h:219

◆ set_parent()

void tbb::task::set_parent ( task p)
inline

sets parent task pointer to specified value

Definition at line 857 of file task.h.

857  {
858 #if __TBB_TASK_GROUP_CONTEXT
859  __TBB_ASSERT(!p || prefix().context == p->prefix().context, "The tasks must be in the same context");
860 #endif
861  prefix().parent = p;
862  }
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
tbb::task * parent
The task whose reference count includes me.
Definition: task.h:256
void const char const char int ITT_FORMAT __itt_group_sync p
task_group_context * context()
This method is deprecated and will be removed in the future.
Definition: task.h:867
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, context(), p, tbb::internal::task_prefix::parent, and prefix().

Referenced by tbb::interface9::internal::allocate_sibling().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_ref_count()

void tbb::task::set_ref_count ( int  count)
inline

Set reference count.

Definition at line 750 of file task.h.

750  {
751 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
753 #else
754  prefix().ref_count = count;
755 #endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
756  }
void __TBB_EXPORTED_METHOD internal_set_ref_count(int count)
Set reference count.
Definition: task.cpp:183
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
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 count
__TBB_atomic reference_count ref_count
Reference count used for synchronization.
Definition: task.h:263

References count, internal_set_ref_count(), prefix(), and tbb::internal::task_prefix::ref_count.

Referenced by tbb::interface9::internal::allocate_sibling(), tbb::internal::generic_scheduler::cleanup_master(), tbb::internal::while_group_task< Body >::execute(), tbb::internal::spawner< N, function1, function2, function3 >::execute(), tbb::internal::sum_node< Range, Body >::execute(), tbb::interface9::internal::do_group_task_forward< Iterator, Body, Item >::execute(), tbb::interface9::internal::do_group_task_input< Body, Item >::execute(), tbb::internal::pipeline_root_task::execute(), tbb::internal::parallel_invoke_helper::parallel_invoke_helper(), tbb::parallel_while< Body >::run(), tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_random_access_iterator(), tbb::internal::task_group_base::task_group_base(), and tbb::flow::interface10::graph::wait_for_all().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spawn_and_wait_for_all() [1/2]

void tbb::task::spawn_and_wait_for_all ( task child)
inline

Similar to spawn followed by wait_for_all, but more efficient.

Definition at line 789 of file task.h.

789  {
790  prefix().owner->wait_for_all( *this, &child );
791  }
virtual void wait_for_all(task &parent, task *child)=0
For internal use only.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
scheduler * owner
Obsolete. The scheduler that owns the task.
Definition: task.h:236

References tbb::internal::task_prefix::owner, prefix(), and tbb::internal::scheduler::wait_for_all().

Referenced by tbb::internal::while_group_task< Body >::execute(), tbb::interface9::internal::do_group_task_forward< Iterator, Body, Item >::execute(), tbb::interface9::internal::do_group_task_input< Body, Item >::execute(), tbb::parallel_while< Body >::run(), tbb::internal::parallel_invoke_helper::run_and_finish(), and tbb::interface9::internal::do_task_iter< Iterator, Body, Item >::run_for_random_access_iterator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spawn_and_wait_for_all() [2/2]

void tbb::task::spawn_and_wait_for_all ( task_list list)

Similar to spawn followed by wait_for_all, but more efficient.

Definition at line 231 of file task.cpp.

231  {
233  task* t = list.first;
234  if( t ) {
235  if( &t->prefix().next!=list.next_ptr )
236  s->local_spawn( t->prefix().next, *list.next_ptr );
237  list.clear();
238  }
239  s->local_wait_for_all( *this, t );
240 }
Work stealing task scheduler.
Definition: scheduler.h:137
void const char const char int ITT_FORMAT __itt_group_sync s
static generic_scheduler * local_scheduler()
Obtain the thread-local instance of the TBB scheduler.
Definition: governor.h:129
task()
Default constructor.
Definition: task.h:614

References tbb::task_list::clear(), tbb::task_list::first, tbb::internal::governor::local_scheduler(), tbb::internal::task_prefix::next, tbb::task_list::next_ptr, prefix(), and s.

Here is the call graph for this function:

◆ spawn_root_and_wait() [1/2]

static void tbb::task::spawn_root_and_wait ( task root)
inlinestatic

Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.

Definition at line 797 of file task.h.

797  {
798  root.prefix().owner->spawn_root_and_wait( root, root.prefix().next );
799  }

References tbb::internal::task_prefix::next, tbb::internal::task_prefix::owner, prefix(), and tbb::internal::scheduler::spawn_root_and_wait().

Referenced by tbb::interface9::internal::start_for< Range, Body, Partitioner >::run(), tbb::interface9::internal::start_reduce< Range, Body, Partitioner >::run(), tbb::internal::start_scan< Range, Body, Partitioner >::run(), and tbb::interface9::internal::start_deterministic_reduce< Range, Body, Partitioner >::run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ spawn_root_and_wait() [2/2]

void tbb::task::spawn_root_and_wait ( task_list root_list)
inlinestatic

Spawn root tasks on list and wait for all of them to finish.

If there are more tasks than worker threads, the tasks are spawned in order of front to back.

Definition at line 1124 of file task.h.

1124  {
1125  if( task* t = root_list.first ) {
1126  t->prefix().owner->spawn_root_and_wait( *t, *root_list.next_ptr );
1127  root_list.clear();
1128  }
1129 }
task()
Default constructor.
Definition: task.h:614

References tbb::task_list::clear(), tbb::task_list::first, and tbb::task_list::next_ptr.

Here is the call graph for this function:

◆ state()

state_type tbb::task::state ( ) const
inline

Current execution state.

Definition at line 901 of file task.h.

901 {return state_type(prefix().state);}
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
state_type state() const
Current execution state.
Definition: task.h:901
state_type
Enumeration of task states that the scheduler considers.
Definition: task.h:624

References prefix().

Referenced by tbb::internal::generic_scheduler::allocate_task(), tbb::interface5::internal::task_base::destroy(), tbb::internal::arena::enqueue_task(), tbb::internal::generic_scheduler::free_nonlocal_small_task(), tbb::internal::generic_scheduler::free_task(), tbb::internal::generic_scheduler::prepare_for_spawning(), tbb::internal::custom_scheduler< SchedulerTraits >::process_bypass_loop(), recycle_as_child_of(), recycle_as_continuation(), recycle_as_safe_continuation(), and recycle_to_reexecute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wait_for_all()

void tbb::task::wait_for_all ( )
inline

Wait for reference count to become one, and set reference count to zero.

Works on tasks while waiting.

Definition at line 808 of file task.h.

808  {
809  prefix().owner->wait_for_all( *this, NULL );
810  }
virtual void wait_for_all(task &parent, task *child)=0
For internal use only.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
Definition: task.h:991
scheduler * owner
Obsolete. The scheduler that owns the task.
Definition: task.h:236

References tbb::internal::task_prefix::owner, prefix(), and tbb::internal::scheduler::wait_for_all().

Referenced by tbb::flow::interface10::graph::wait_functor::operator()(), tbb::internal::task_group_base::wait(), and tbb::internal::task_group_base::~task_group_base().

Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ interface5::internal::task_base

friend class interface5::internal::task_base
friend

Definition at line 978 of file task.h.

◆ internal::allocate_additional_child_of_proxy

Definition at line 987 of file task.h.

◆ internal::allocate_child_proxy

friend class internal::allocate_child_proxy
friend

Definition at line 986 of file task.h.

◆ internal::allocate_continuation_proxy

Definition at line 985 of file task.h.

◆ internal::allocate_root_proxy

friend class internal::allocate_root_proxy
friend

Definition at line 981 of file task.h.

◆ internal::allocate_root_with_context_proxy

Definition at line 983 of file task.h.

◆ internal::is_critical

bool internal::is_critical ( task )
friend

◆ internal::make_critical

◆ internal::scheduler

friend class internal::scheduler
friend

Definition at line 980 of file task.h.

◆ task_list

friend class task_list
friend

Definition at line 979 of file task.h.


The documentation for this class was generated from the following files:

Copyright © 2005-2020 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.