35 class task_group_context;
39 #if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3) 40 #define __TBB_TASK_BASE_ACCESS public 42 #define __TBB_TASK_BASE_ACCESS private 60 namespace interface5 {
114 virtual void enqueue(
task& t,
void* reserved ) = 0;
124 #if __TBB_TASK_ISOLATION 130 #if __TBB_TASK_GROUP_CONTEXT 191 #if __TBB_TASK_ISOLATION 195 intptr_t reserved_space_for_task_isolation_tag;
198 #if __TBB_TASK_GROUP_CONTEXT 214 #if __TBB_TASK_PRIORITY 222 #if __TBB_TASK_PRIORITY 272 #if __TBB_TASK_GROUP_CONTEXT 274 #if __TBB_TASK_PRIORITY 287 #if TBB_USE_CAPTURED_EXCEPTION 291 class tbb_exception_ptr;
295 class task_scheduler_init;
296 namespace interface7 {
class task_arena; }
325 #if TBB_USE_CAPTURED_EXCEPTION 349 #if TBB_USE_CAPTURED_EXCEPTION 386 - 2 *
sizeof(uintptr_t)-
sizeof(
void*) -
sizeof(internal::context_list_node_t)
389 -
sizeof(internal::cpu_ctl_env_space)
418 #if __TBB_TASK_PRIORITY 429 #if __TBB_TASK_PRIORITY 467 :
my_kind(relation_with_parent)
469 ,
my_name(internal::CUSTOM_CTX)
530 #if __TBB_TASK_PRIORITY 556 template <
typename T>
560 void bind_to ( internal::generic_scheduler *local_sched );
563 void register_with ( internal::generic_scheduler *local_sched );
609 #if __TBB_RECYCLE_TO_ENQUEUE 624 #if __TBB_TASK_GROUP_CONTEXT 627 return internal::allocate_root_with_context_proxy(ctx);
634 return *reinterpret_cast<internal::allocate_continuation_proxy*>(
this);
639 return *reinterpret_cast<internal::allocate_child_proxy*>(
this);
643 using task_base::allocate_additional_child_of;
645 #if __TBB_DEPRECATED_TASK_INTERFACE 653 using task_base::destroy;
683 internal::task_prefix&
p =
prefix();
690 p.parent = &new_parent;
691 #if __TBB_TASK_GROUP_CONTEXT 692 p.context = new_parent.
prefix().context;
704 #if __TBB_RECYCLE_TO_ENQUEUE 707 void recycle_to_enqueue() {
709 prefix().state = to_enqueue;
719 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT 737 __TBB_ASSERT( k>=0,
"task's reference count underflowed" );
746 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT 754 using task_base::spawn;
758 prefix().owner->wait_for_all( *
this, &child );
766 root.
prefix().owner->spawn_root_and_wait( root, root.
prefix().next );
777 prefix().owner->wait_for_all( *
this, NULL );
781 #if __TBB_TASK_PRIORITY 794 t.
prefix().owner->enqueue( t, NULL );
797 #if __TBB_TASK_PRIORITY 801 t.
prefix().owner->enqueue( t, (
void*)
p );
813 #if __TBB_TASK_GROUP_CONTEXT 819 #if __TBB_TASK_GROUP_CONTEXT 830 return (
prefix().extra_state & 0x80)!=0;
844 __TBB_ASSERT( ref_count_==
int(ref_count_),
"integer overflow error");
873 #if __TBB_TASK_GROUP_CONTEXT 897 #if __TBB_TASK_PRIORITY 911 #if __TBB_TASK_GROUP_CONTEXT 921 return reinterpret_cast<internal::task_prefix*>(const_cast<task*>(
this))[-1];
937 #if __TBB_ALLOW_MUTABLE_FUNCTORS 948 #if __TBB_CPP11_RVALUE_REF_PRESENT 1021 t->
prefix().owner->spawn_root_and_wait( *t, *root_list.
next_ptr );
1036 #if __TBB_TASK_GROUP_CONTEXT 1038 return &
p.allocate(bytes);
1042 p.free( *static_cast<tbb::task*>(
task) );
1047 return &
p.allocate(bytes);
1051 p.free( *static_cast<tbb::task*>(
task) );
1055 return &
p.allocate(bytes);
1059 p.free( *static_cast<tbb::task*>(
task) );
1063 return &
p.allocate(bytes);
1067 p.free( *static_cast<tbb::task*>(
task) );
void __TBB_EXPORTED_METHOD free(task &) const
task object is freshly allocated or recycled.
static tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of(task &t)
Like allocate_child, except that task's parent becomes "t", not this.
friend class internal::allocate_root_with_context_proxy
static const int priority_stride_v4
static void enqueue(task &t)
Enqueue task for starvation-resistant execution.
void set_ref_count(int count)
Set reference count.
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
static const kind_type binding_completed
void __TBB_EXPORTED_METHOD change_group(task_group_context &ctx)
Moves this task from its current group into another one.
state_type
Enumeration of task states that the scheduler considers.
bool __TBB_EXPORTED_METHOD cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
void set_parent(task *p)
sets parent task pointer to specified value
priority_t group_priority() const
Retrieves current priority of the task group this task belongs to.
void copy_fp_settings(const task_group_context &src)
Copies FPU control setting from another context.
task * next_offloaded
Pointer to the next offloaded lower priority task.
task_group_context * my_parent
Pointer to the context of the parent cancellation group. NULL for isolated contexts.
Base class for user-defined tasks.
Work stealing task scheduler.
virtual ~task()
Destructor.
#define __TBB_EXPORTED_FUNC
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
static const kind_type detached
task()
Default constructor.
tbb::task & task()
The task corresponding to this task_prefix.
virtual void wait_for_all(task &parent, task *child)=0
For internal use only.
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
bool __TBB_EXPORTED_METHOD is_owned_by_current_thread() const
Obsolete, and only retained for the sake of backward compatibility. Always returns true.
isolation_tag isolation
The tag used for task isolation.
static task &__TBB_EXPORTED_FUNC allocate(size_t size)
void __TBB_EXPORTED_METHOD init()
Out-of-line part of the constructor.
internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count()
Decrement reference count and return its new value.
Memory prefix to a task object.
Base class for types that should not be copied or assigned.
internal::tbb_exception_ptr exception_container_type
int depth
Obsolete. Used to be scheduling depth before TBB 2.2.
void increment_ref_count()
Atomically increment reference count.
unsigned char extra_state
Miscellaneous state that is not directly visible to users, stored as a byte for compactness.
void wait_for_all()
Wait for reference count to become one, and set reference count to zero.
virtual void __TBB_EXPORTED_METHOD note_affinity(affinity_id id)
Invoked by scheduler to notify task that it ran on unexpected thread.
void propagate_task_group_state(T task_group_context::*mptr_state, task_group_context &src, T new_state)
Propagates any state change detected to *this, and as an optimisation possibly also upward along the ...
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
virtual void spawn(task &first, task *&next)=0
For internal use only.
task_group_context(internal::string_index name)
#define __TBB_EXPORTED_METHOD
scheduler * owner
Obsolete. The scheduler that owns the task.
internal::cpu_ctl_env_space my_cpu_ctl_env
Space for platform-specific FPU settings.
task is running, and will be destroyed after method execute() completes.
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed.
friend class internal::allocate_child_proxy
friend class internal::allocate_additional_child_of_proxy
friend class internal::allocate_continuation_proxy
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
auto first(Container &c) -> decltype(begin(c))
void const char const char int ITT_FORMAT __itt_group_sync p
task & pop_front()
Pop the front task from the list.
task_group_context * context()
This method is deprecated and will be removed in the future.
friend class internal::scheduler
scheduler * origin
The scheduler that allocated the task, or NULL if the task is big.
void push_back(task &task)
Push task onto back of list.
Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
friend class internal::allocate_root_proxy
virtual void enqueue(task &t, void *reserved)=0
For internal use only.
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 size
void set_priority(priority_t)
Changes priority of the task group.
Base class for types that should not be assigned.
friend class internal::allocate_additional_child_of_proxy
task_group_context(kind_type relation_with_parent=bound, uintptr_t t=default_traits)
Default & binding constructor.
friend class internal::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 count
__itt_caller itt_caller
Used to set and maintain stack stitching point for Intel Performance Tools.
__TBB_EXPORTED_METHOD ~task_group_context()
bool cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
static const kind_type binding_required
bool is_cancelled() const
Returns true if the context has received cancellation request.
priority_t priority() const
Retrieves current priority of the current task group.
internal::context_list_node_t my_node
Used to form the thread specific list of contexts without additional memory allocation.
task is in ready pool, or is going to be put there, or was just taken off.
void __TBB_EXPORTED_METHOD free(task &) const
allocate_additional_child_of_proxy(task &parent_)
affinity_id affinity() const
Current affinity of this task.
void recycle_to_reexecute()
Schedule this for reexecution after current execute() returns.
task_group_context * group()
Pointer to the task group descriptor.
allocate_root_with_context_proxy(task_group_context &ctx)
internal::generic_scheduler * my_owner
Scheduler instance that registered this context in its thread specific list.
Used to form groups of tasks.
friend class internal::allocate_root_with_context_proxy
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
struct ___itt_caller * __itt_caller
void call_itt_notify(notify_type, void *)
void move(tbb_thread &t1, tbb_thread &t2)
Class delimiting the scope of task scheduler activity.
intptr_t my_priority
Priority level of the task group (in normalized representation)
friend class internal::allocate_child_proxy
virtual ~scheduler()=0
Pure virtual destructor;.
task * self
No longer used, but retained for binary layout compatibility. Always NULL.
Base class for methods that became static in TBB 3.0.
friend class internal::generic_scheduler
intptr_t isolation_tag
A tag for task isolation.
task_group_context & my_context
void __TBB_EXPORTED_METHOD free(task &) const
internal::affinity_id affinity_id
An id as used for specifying affinity.
context_list_node_t * my_prev
internal::allocate_child_proxy & allocate_child()
Returns proxy for overloaded new that allocates a child task of *this.
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.
int add_ref_count(int count)
Atomically adds to reference count and returns its new value.
state_type state() const
Current execution state.
int space[sizeof(internal::uint64_t)/sizeof(int)]
void __TBB_EXPORTED_METHOD free(task &) const
task to be recycled as continuation
version_traits_word_layout
task * execute() __TBB_override
Should be overridden by derived classes.
task * execute() __TBB_override
Should be overridden by derived classes.
task_list()
Construct empty list.
void set_group_priority(priority_t p)
Changes priority of the task group this task belongs to.
bool is_stolen_task() const
True if task was stolen from the task pool of another thread.
bool empty() const
True if list if empty; false otherwise.
void recycle_as_safe_continuation()
Recommended to use, safe variant of recycle_as_continuation.
#define __TBB_FetchAndIncrementWacquire(P)
int ref_count() const
The internal reference count.
static void spawn_root_and_wait(task &root)
Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
char _leading_padding[internal::NFS_MaxLineSize - 2 *sizeof(uintptr_t) - sizeof(void *) - sizeof(internal::context_list_node_t) - sizeof(__itt_caller) - sizeof(internal::cpu_ctl_env_space)]
Leading padding protecting accesses to frequently used members from false sharing.
virtual void spawn_root_and_wait(task &first, task *&next)=0
For internal use only.
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.
void register_with(internal::generic_scheduler *local_sched)
Registers this context with the local scheduler.
#define __TBB_FetchAndDecrementWrelease(P)
static void spawn(task &t)
Schedule task for execution when a worker becomes available.
char _trailing_padding[internal::NFS_MaxLineSize - 2 *sizeof(uintptr_t) - 2 *sizeof(void *) - sizeof(intptr_t) - sizeof(internal::string_index)]
Trailing padding protecting accesses to frequently used members from false sharing.
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
__TBB_atomic reference_count ref_count
Reference count used for synchronization.
uintptr_t _my_kind_aligner
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
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
void spawn_and_wait_for_all(task &child)
Similar to spawn followed by wait_for_all, but more efficient.
task object is on free list, or is going to be put there, or was just taken off.
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
int decrement_ref_count()
Atomically decrement reference count and returns its new value.
static void __TBB_EXPORTED_FUNC destroy(task &victim)
Destroy a task.
__TBB_atomic kind_type my_kind
Flavor of this context: bound or isolated.
uintptr_t my_state
Internal state (combination of state flags, currently only may_have_children).
task that does nothing. Useful for synchronization.
static const kind_type dying
void set_affinity(affinity_id id)
Set affinity for this task.
#define __TBB_TASK_BASE_ACCESS
function_task(const F &f)
tbb::task * parent
The task whose reference count includes me.
void bind_to(internal::generic_scheduler *local_sched)
Registers this context with the local scheduler and binds it to its parent context.
uintptr_t traits() const
Returns the context's trait.
internal::allocate_continuation_proxy & allocate_continuation()
Returns proxy for overloaded new that allocates a continuation task of *this.
virtual task * execute()=0
Should be overridden by derived classes.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
friend class internal::allocate_continuation_proxy
void recycle_as_continuation()
Change this to be a continuation of its former self.
intptr_t reference_count
A reference count.
static void __TBB_EXPORTED_FUNC free(task &)
version_tag_v3 version_tag
void __TBB_EXPORTED_METHOD capture_fp_settings()
Captures the current FPU control settings to the context.
~task_list()
Destroys the list, but does not destroy the task objects.
const isolation_tag no_isolation
void __TBB_EXPORTED_METHOD internal_set_ref_count(int count)
Set reference count.
uintptr_t my_cancellation_requested
Specifies whether cancellation was requested for this task group.
unsigned char state
A task::state_type, stored as a byte for compactness.
void const char const char int ITT_FORMAT __itt_group_sync x void const char * name
void clear()
Clear the list.
void recycle_as_child_of(task &new_parent)
Change this to be a child of new_parent.
tbb::task * next
"next" field for list of task
context_list_node_t * my_next
friend class internal::allocate_root_proxy
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
internal::string_index my_name
Decription of algorithm for scheduler based instrumentation.