19 #if !defined(__TBB_show_deprecation_message_task_H) && defined(__TBB_show_deprecated_header_message)
20 #define __TBB_show_deprecation_message_task_H
21 #pragma message("TBB Warning: tbb/task.h is deprecated. For details, please see Deprecated Features appendix in the TBB reference manual.")
24 #if defined(__TBB_show_deprecated_header_message)
25 #undef __TBB_show_deprecated_header_message
31 #define __TBB_task_H_include_area
45 class task_group_context;
49 #if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)
50 #define __TBB_TASK_BASE_ACCESS public
52 #define __TBB_TASK_BASE_ACCESS private
72 namespace interface5 {
133 #if __TBB_PREVIEW_RESUMABLE_TASKS
141 #if __TBB_TASK_ISOLATION
147 #if __TBB_TASK_GROUP_CONTEXT
182 #if __TBB_PREVIEW_CRITICAL_TASKS
213 #if __TBB_PREVIEW_CRITICAL_TASKS
218 #if __TBB_TASK_ISOLATION
222 intptr_t reserved_space_for_task_isolation_tag;
225 #if __TBB_TASK_GROUP_CONTEXT
241 #if __TBB_TASK_PRIORITY || __TBB_PREVIEW_RESUMABLE_TASKS
249 #if __TBB_TASK_PRIORITY
255 #if __TBB_PREVIEW_RESUMABLE_TASKS
259 #if __TBB_TASK_PRIORITY || __TBB_PREVIEW_RESUMABLE_TASKS
306 #if __TBB_TASK_GROUP_CONTEXT
308 #if __TBB_TASK_PRIORITY
311 #if __TBB_PREVIEW_CRITICAL_TASKS
325 #if TBB_USE_CAPTURED_EXCEPTION
329 class tbb_exception_ptr;
333 class task_scheduler_init;
334 namespace interface7 {
class task_arena; }
335 using interface7::task_arena;
364 #if TBB_USE_CAPTURED_EXCEPTION
388 #if TBB_USE_CAPTURED_EXCEPTION
457 #if __TBB_TASK_PRIORITY
468 #if __TBB_TASK_PRIORITY
506 :
my_kind(relation_with_parent)
569 #if __TBB_TASK_PRIORITY
595 template <
typename T>
625 task() {prefix().extra_state=1;}
648 #if __TBB_RECYCLE_TO_ENQUEUE
652 #if __TBB_PREVIEW_RESUMABLE_TASKS
667 #if __TBB_TASK_GROUP_CONTEXT
686 using task_base::allocate_additional_child_of;
688 #if __TBB_DEPRECATED_TASK_INTERFACE
697 using task_base::destroy;
712 __TBB_ASSERT( prefix().state==executing,
"execute not running?" );
713 prefix().state = allocated;
720 __TBB_ASSERT( prefix().state==executing,
"execute not running?" );
721 prefix().state = recycle;
727 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated,
"execute not running, or already recycled" );
728 __TBB_ASSERT( prefix().ref_count==0,
"no child tasks allowed when recycled as a child" );
733 p.parent = &new_parent;
734 #if __TBB_TASK_GROUP_CONTEXT
742 __TBB_ASSERT( prefix().state==executing,
"execute not running, or already recycled" );
743 __TBB_ASSERT( prefix().ref_count==0,
"no child tasks allowed when recycled for reexecution" );
744 prefix().state = reexecute;
747 #if __TBB_RECYCLE_TO_ENQUEUE
750 void recycle_to_enqueue() {
751 __TBB_ASSERT( prefix().state==executing,
"execute not running, or already recycled" );
752 prefix().state = to_enqueue;
762 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
763 internal_set_ref_count(
count);
765 prefix().ref_count =
count;
780 __TBB_ASSERT( k>=0,
"task's reference count underflowed" );
789 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
790 return int(internal_decrement_ref_count());
797 using task_base::spawn;
801 prefix().owner->wait_for_all( *
this, &child );
815 static void spawn_root_and_wait(
task_list& root_list );
820 prefix().owner->wait_for_all( *
this, NULL );
824 #if __TBB_TASK_PRIORITY
840 #if __TBB_TASK_PRIORITY
843 #if __TBB_PREVIEW_CRITICAL_TASKS
855 #if __TBB_TASK_PRIORITY
869 #if __TBB_TASK_GROUP_CONTEXT
870 __TBB_ASSERT(!
p || prefix().context ==
p->prefix().context,
"The tasks must be in the same context");
875 #if __TBB_TASK_GROUP_CONTEXT
886 return (prefix().extra_state & 0x80)!=0;
892 return (prefix().extra_state & 0x10)!=0;
895 #if __TBB_PREVIEW_RESUMABLE_TASKS
897 typedef void* suspend_point;
900 template <
typename F>
901 static void suspend(F f);
904 static void resume(suspend_point tag);
917 #if __TBB_PREVIEW_RESUMABLE_TASKS
922 __TBB_ASSERT( ref_count_==
int(ref_count_),
"integer overflow error");
924 #if __TBB_PREVIEW_RESUMABLE_TASKS
925 return int(prefix().ref_count & ~internal::abandon_flag);
927 return int(prefix().ref_count);
955 #if __TBB_TASK_GROUP_CONTEXT
974 bool is_cancelled ()
const {
return prefix().context->is_group_execution_cancelled(); }
976 bool is_cancelled ()
const {
return false; }
979 #if __TBB_TASK_PRIORITY
993 #if __TBB_TASK_GROUP_CONTEXT
1005 #if __TBB_PREVIEW_CRITICAL_TASKS
1011 #if __TBB_PREVIEW_CRITICAL_TASKS
1018 #if __TBB_PREVIEW_RESUMABLE_TASKS
1020 template <
typename F>
1021 static void suspend_callback(
void* user_callback, task::suspend_point tag) {
1023 F user_callback_copy = *
static_cast<F*
>(user_callback);
1024 user_callback_copy(tag);
1031 template <
typename F>
1032 inline void task::suspend(F f) {
1033 internal::internal_suspend((
void*)internal::suspend_callback<F>, &f);
1035 inline void task::resume(suspend_point tag) {
1036 internal::internal_resume(tag);
1043 #if __has_cpp_attribute(gnu::used)
1053 template<
typename F>
1055 #if __TBB_ALLOW_MUTABLE_FUNCTORS
1067 #if __TBB_CPP11_RVALUE_REF_PRESENT
1113 __TBB_ASSERT( !empty(),
"attempt to pop item from empty task_list" );
1133 t->prefix().owner->spawn( *t, *list.
next_ptr );
1140 t->prefix().owner->spawn_root_and_wait( *t, *root_list.
next_ptr );
1155 #if __TBB_TASK_GROUP_CONTEXT
1157 return &
p.allocate(bytes);
1166 return &
p.allocate(bytes);
1174 return &
p.allocate(bytes);
1182 return &
p.allocate(bytes);
1190 #undef __TBB_task_H_include_area
#define __TBB_EXPORTED_FUNC
#define __TBB_TASK_BASE_ACCESS
struct ___itt_caller * __itt_caller
#define __TBB_DEPRECATED_IN_VERBOSE_MODE
#define __TBB_FetchAndDecrementWrelease(P)
#define __TBB_FetchAndIncrementWacquire(P)
#define __TBB_EXPORTED_METHOD
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
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
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
void const char const char int ITT_FORMAT __itt_group_sync x void const char * name
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
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 const char const char int ITT_FORMAT __itt_group_sync p
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 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
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
void move(tbb_thread &t1, tbb_thread &t2)
intptr_t isolation_tag
A tag for task isolation.
intptr_t reference_count
A reference count.
bool is_critical(task &t)
unsigned short affinity_id
An id as used for specifying affinity.
static const int priority_stride_v4
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
static const int priority_critical
void make_critical(task &t)
const isolation_tag no_isolation
auto first(Container &c) -> decltype(begin(c))
void call_itt_notify(notify_type, void *)
void __TBB_EXPORTED_METHOD free(task &) const
task * self
No longer used, but retained for binary layout compatibility. Always NULL.
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
allocate_additional_child_of_proxy(task &parent_)
int space[sizeof(internal::uint64_t)/sizeof(int)]
Base class for methods that became static in TBB 3.0.
static void __TBB_EXPORTED_FUNC destroy(task &victim)
Destroy a task.
static void spawn(task &t)
Schedule task for execution when a worker becomes available.
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.
virtual void wait_for_all(task &parent, task *child)=0
For internal use only.
virtual void spawn_root_and_wait(task &first, task *&next)=0
For internal use only.
virtual void spawn(task &first, task *&next)=0
For internal use only.
virtual void enqueue(task &t, void *reserved)=0
For internal use only.
virtual ~scheduler()=0
Pure virtual destructor;.
context_list_node_t * my_next
context_list_node_t * my_prev
task_group_context & my_context
allocate_root_with_context_proxy(task_group_context &ctx)
void __TBB_EXPORTED_METHOD free(task &) const
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
static void __TBB_EXPORTED_FUNC free(task &)
static task &__TBB_EXPORTED_FUNC allocate(size_t size)
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
void __TBB_EXPORTED_METHOD free(task &) const
void __TBB_EXPORTED_METHOD free(task &) const
task &__TBB_EXPORTED_METHOD allocate(size_t size) const
Memory prefix to a task object.
tbb::task * next
"next" field for list of task
scheduler * origin
The scheduler that allocated the task, or NULL if the task is big.
scheduler * owner
Obsolete. The scheduler that owns the task.
unsigned char extra_state
Miscellaneous state that is not directly visible to users, stored as a byte for compactness.
int depth
Obsolete. Used to be scheduling depth before TBB 2.2.
isolation_tag isolation
The tag used for task isolation.
__TBB_atomic reference_count ref_count
Reference count used for synchronization.
unsigned char state
A task::state_type, stored as a byte for compactness.
task * next_offloaded
Pointer to the next offloaded lower priority task.
tbb::task & task()
The task corresponding to this task_prefix.
task_group_context * context
Shared context that is used to communicate asynchronous state changes.
friend void make_critical(task &)
friend bool is_critical(task &)
tbb::task * parent
The task whose reference count includes me.
Used to form groups of tasks.
__TBB_atomic kind_type my_kind
Flavor of this context: bound or isolated.
exception_container_type * my_exception
Pointer to the container storing exception being propagated across this task group.
bool __TBB_EXPORTED_METHOD cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
task_group_context * my_parent
Pointer to the context of the parent cancellation group. NULL for isolated contexts.
internal::string_index my_name
Description of algorithm for scheduler based instrumentation.
internal::tbb_exception_ptr exception_container_type
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 ...
task_group_context(internal::string_index name)
static const kind_type binding_completed
intptr_t my_priority
Priority level of the task group (in normalized representation)
void __TBB_EXPORTED_METHOD register_pending_exception()
Records the pending exception, and cancels the task group.
void register_with(internal::generic_scheduler *local_sched)
Registers this context with the local scheduler.
version_traits_word_layout
uintptr_t my_cancellation_requested
Specifies whether cancellation was requested for this task group.
static const kind_type detached
__TBB_DEPRECATED_IN_VERBOSE_MODE void set_priority(priority_t)
Changes priority of the task group.
void copy_fp_settings(const task_group_context &src)
Copies FPU control setting from another context.
task_group_context(kind_type relation_with_parent=bound, uintptr_t t=default_traits)
Default & binding constructor.
__itt_caller itt_caller
Used to set and maintain stack stitching point for Intel Performance Tools.
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.
__TBB_DEPRECATED_IN_VERBOSE_MODE priority_t priority() const
Retrieves current priority of the current task group.
void __TBB_EXPORTED_METHOD init()
Out-of-line part of the constructor.
uintptr_t _my_kind_aligner
void bind_to(internal::generic_scheduler *local_sched)
Registers this context with the local scheduler and binds it to its parent context.
uintptr_t my_state
Internal state (combination of state flags, currently only may_have_children).
internal::context_list_node_t my_node
Used to form the thread specific list of contexts without additional memory allocation.
void __TBB_EXPORTED_METHOD capture_fp_settings()
Captures the current FPU control settings to the context.
__TBB_EXPORTED_METHOD ~task_group_context()
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.
uintptr_t traits() const
Returns the context's trait.
internal::cpu_ctl_env_space my_cpu_ctl_env
Space for platform-specific FPU settings.
static const kind_type dying
internal::generic_scheduler * my_owner
Scheduler instance that registered this context in its thread specific list.
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed.
uintptr_t my_version_and_traits
Version for run-time checks and behavioral traits of the context.
static const kind_type binding_required
Base class for user-defined tasks.
void __TBB_EXPORTED_METHOD change_group(task_group_context &ctx)
Moves this task from its current group into another one.
virtual task * execute()=0
Should be overridden by derived classes.
bool is_enqueued_task() const
True if the task was enqueued.
affinity_id affinity() const
Current affinity of this task.
bool is_stolen_task() const
True if task was stolen from the task pool of another thread.
static void enqueue(task &t)
Enqueue task for starvation-resistant execution.
state_type
Enumeration of task states that the scheduler considers.
@ allocated
task object is freshly allocated or recycled.
@ reexecute
task to be rescheduled.
@ ready
task is in ready pool, or is going to be put there, or was just taken off.
@ freed
task object is on free list, or is going to be put there, or was just taken off.
@ executing
task is running, and will be destroyed after method execute() completes.
internal::allocate_continuation_proxy & allocate_continuation()
Returns proxy for overloaded new that allocates a continuation task of *this.
void recycle_to_reexecute()
Schedule this for reexecution after current execute() returns.
int decrement_ref_count()
Atomically decrement reference count and returns its new value.
__TBB_DEPRECATED priority_t group_priority() const
Retrieves current priority of the task group this task belongs to.
state_type state() const
Current execution state.
void recycle_as_child_of(task &new_parent)
Change this to be a child of new_parent.
void set_parent(task *p)
sets parent task pointer to specified value
bool cancel_group_execution()
Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
bool is_cancelled() const
Returns true if the context has received cancellation request.
void recycle_as_continuation()
Change this to be a continuation of its former self.
int ref_count() const
The internal reference count.
task_group_context * group()
Pointer to the task group descriptor.
internal::task_prefix & prefix(internal::version_tag *=NULL) const
Get reference to corresponding task_prefix.
internal::allocate_child_proxy & allocate_child()
Returns proxy for overloaded new that allocates a child task of *this.
void spawn_and_wait_for_all(task &child)
Similar to spawn followed by wait_for_all, but more efficient.
void wait_for_all()
Wait for reference count to become one, and set reference count to zero.
void recycle_as_safe_continuation()
Recommended to use, safe variant of recycle_as_continuation.
void set_affinity(affinity_id id)
Set affinity for this task.
task * parent() const
task on whose behalf this task is working, or NULL if this is a root.
virtual ~task()
Destructor.
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
void set_ref_count(int count)
Set reference count.
void increment_ref_count()
Atomically increment reference count.
task()
Default constructor.
task_group_context * context()
This method is deprecated and will be removed in the future.
internal::affinity_id affinity_id
An id as used for specifying affinity.
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.
__TBB_DEPRECATED void set_group_priority(priority_t p)
Changes priority of the task group this task belongs to.
static void enqueue(task &t, priority_t p)
Enqueue task for starvation-resistant execution on the specified priority level.
static void spawn_root_and_wait(task &root)
Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
int add_ref_count(int count)
Atomically adds to reference count and returns its new value.
task that does nothing. Useful for synchronization.
task * execute() __TBB_override
Should be overridden by derived classes.
function_task(const F &f)
task * execute() __TBB_override
Should be overridden by derived classes.
~task_list()
Destroys the list, but does not destroy the task objects.
void push_back(task &task)
Push task onto back of list.
bool empty() const
True if list is empty; false otherwise.
task & pop_front()
Pop the front task from the list.
task_list()
Construct empty list.
void clear()
Clear the list.
Class delimiting the scope of task scheduler activity.
Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
Exception container that preserves the exact copy of the original exception.
Base class for types that should not be assigned.
Base class for types that should not be copied or assigned.
Work stealing task scheduler.