Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface10::graph Class Reference

The graph class. More...

#include <_flow_graph_impl.h>

Inheritance diagram for tbb::flow::interface10::graph:
Collaboration diagram for tbb::flow::interface10::graph:

Classes

class  run_and_put_task
 
class  run_task
 
class  spawn_functor
 A functor that spawns a task. More...
 
class  wait_functor
 

Public Types

typedef graph_iterator< graph, graph_nodeiterator
 
typedef graph_iterator< const graph, const graph_nodeconst_iterator
 

Public Member Functions

 graph ()
 Constructs a graph with isolated task_group_context. More...
 
 graph (tbb::task_group_context &use_this_context)
 Constructs a graph with use_this_context as context. More...
 
 ~graph ()
 Destroys the graph. More...
 
void increment_wait_count ()
 
void decrement_wait_count ()
 
void reserve_wait () __TBB_override
 Used to register that an external entity may still interact with the graph. More...
 
void release_wait () __TBB_override
 Deregisters an external entity that may have interacted with the graph. More...
 
template<typename Receiver , typename Body >
void run (Receiver &r, Body body)
 Spawns a task that runs a body and puts its output to a specific receiver. More...
 
template<typename Body >
void run (Body body)
 Spawns a task that runs a function object. More...
 
void wait_for_all ()
 Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls. More...
 
tbb::taskroot_task ()
 Returns the root task of the graph. More...
 
iterator begin ()
 start iterator More...
 
iterator end ()
 end iterator More...
 
const_iterator begin () const
 start const iterator More...
 
const_iterator end () const
 end const iterator More...
 
const_iterator cbegin () const
 start const iterator More...
 
const_iterator cend () const
 end const iterator More...
 
bool is_cancelled ()
 return status of graph execution More...
 
bool exception_thrown ()
 
void reset (reset_flags f=rf_reset_protocol)
 
- Public Member Functions inherited from tbb::flow::interface10::graph_proxy
virtual ~graph_proxy ()
 

Private Types

typedef std::list< tbb::task * > task_list_type
 

Private Member Functions

void prepare_task_arena (bool reinit=false)
 
void register_node (graph_node *n)
 
void remove_node (graph_node *n)
 
- Private Member Functions inherited from tbb::internal::no_copy
 no_copy ()
 Allow default construction. More...
 

Private Attributes

tbb::taskmy_root_task
 
tbb::task_group_contextmy_context
 
bool own_context
 
bool cancelled
 
bool caught_exception
 
bool my_is_active
 
task_list_type my_reset_task_list
 
graph_nodemy_nodes
 
graph_nodemy_nodes_last
 
tbb::spin_mutex nodelist_mutex
 
tbb::task_arenamy_task_arena
 
internal::graph_task_priority_queue_t my_priority_queue
 

Friends

class graph_node
 
template<typename C , typename N >
class graph_iterator
 
class tbb::interface7::internal::task_arena_base
 
void internal::activate_graph (graph &g)
 
void internal::deactivate_graph (graph &g)
 
bool internal::is_graph_active (graph &g)
 
tbb::taskinternal::prioritize_task (graph &g, tbb::task &arena_task)
 
void internal::spawn_in_graph_arena (graph &g, tbb::task &arena_task)
 
void internal::enqueue_in_graph_arena (graph &g, tbb::task &arena_task)
 
void internal::add_task_to_graph_reset_list (graph &g, tbb::task *tp)
 

Detailed Description

The graph class.

This class serves as a handle to the graph

Definition at line 207 of file _flow_graph_impl.h.

Member Typedef Documentation

◆ const_iterator

◆ iterator

◆ task_list_type

Definition at line 242 of file _flow_graph_impl.h.

Constructor & Destructor Documentation

◆ graph() [1/2]

tbb::flow::interface10::graph::graph ( )
inline

Constructs a graph with isolated task_group_context.

Definition at line 743 of file flow_graph.h.

References cancelled, caught_exception, own_context, and prepare_task_arena().

743  : my_nodes(NULL), my_nodes_last(NULL), my_task_arena(NULL) {
745  own_context = true;
746  cancelled = false;
747  caught_exception = false;
748  my_context = new task_group_context(tbb::internal::FLOW_TASKS);
749  my_root_task = (new (task::allocate_root(*my_context)) empty_task);
752  my_is_active = true;
753 }
void set_ref_count(int count)
Set reference count.
Definition: task.h:731
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
Definition: task.h:633
void prepare_task_arena(bool reinit=false)
tbb::task_group_context * my_context
static void fgt_graph(void *)
Here is the call graph for this function:

◆ graph() [2/2]

tbb::flow::interface10::graph::graph ( tbb::task_group_context use_this_context)
inlineexplicit

Constructs a graph with use_this_context as context.

Definition at line 755 of file flow_graph.h.

References tbb::task::allocate_root(), tbb::internal::fgt_graph(), my_context, my_is_active, my_root_task, own_context, prepare_task_arena(), and tbb::task::set_ref_count().

755  :
756  my_context(&use_this_context), my_nodes(NULL), my_nodes_last(NULL), my_task_arena(NULL) {
758  own_context = false;
759  my_root_task = (new (task::allocate_root(*my_context)) empty_task);
762  my_is_active = true;
763 }
void set_ref_count(int count)
Set reference count.
Definition: task.h:731
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
Definition: task.h:633
void prepare_task_arena(bool reinit=false)
tbb::task_group_context * my_context
static void fgt_graph(void *)
Here is the call graph for this function:

◆ ~graph()

tbb::flow::interface10::graph::~graph ( )
inline

Destroys the graph.

Calls wait_for_all, then destroys the root task and context.

Definition at line 765 of file flow_graph.h.

References my_root_task, tbb::task::set_ref_count(), and wait_for_all().

765  {
766  wait_for_all();
768  tbb::task::destroy(*my_root_task);
769  if (own_context) delete my_context;
770  delete my_task_arena;
771 }
void set_ref_count(int count)
Set reference count.
Definition: task.h:731
tbb::task_group_context * my_context
void wait_for_all()
Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls...
Here is the call graph for this function:

Member Function Documentation

◆ begin() [1/2]

graph::iterator tbb::flow::interface10::graph::begin ( )
inline

start iterator

Definition at line 833 of file flow_graph.h.

Referenced by reset().

833 { return iterator(this, true); }
graph_iterator< graph, graph_node > iterator
Here is the caller graph for this function:

◆ begin() [2/2]

graph::const_iterator tbb::flow::interface10::graph::begin ( ) const
inline

start const iterator

Definition at line 837 of file flow_graph.h.

837 { return const_iterator(this, true); }
graph_iterator< const graph, const graph_node > const_iterator

◆ cbegin()

graph::const_iterator tbb::flow::interface10::graph::cbegin ( ) const
inline

start const iterator

Definition at line 841 of file flow_graph.h.

841 { return const_iterator(this, true); }
graph_iterator< const graph, const graph_node > const_iterator

◆ cend()

graph::const_iterator tbb::flow::interface10::graph::cend ( ) const
inline

end const iterator

Definition at line 843 of file flow_graph.h.

843 { return const_iterator(this, false); }
graph_iterator< const graph, const graph_node > const_iterator

◆ decrement_wait_count()

void tbb::flow::interface10::graph::decrement_wait_count ( )
inline

Definition at line 295 of file _flow_graph_impl.h.

References __TBB_override.

295  {
296  release_wait();
297  }
void release_wait() __TBB_override
Deregisters an external entity that may have interacted with the graph.
Definition: flow_graph.h:780

◆ end() [1/2]

graph::iterator tbb::flow::interface10::graph::end ( )
inline

end iterator

Definition at line 835 of file flow_graph.h.

Referenced by reset().

835 { return iterator(this, false); }
graph_iterator< graph, graph_node > iterator
Here is the caller graph for this function:

◆ end() [2/2]

graph::const_iterator tbb::flow::interface10::graph::end ( ) const
inline

end const iterator

Definition at line 839 of file flow_graph.h.

839 { return const_iterator(this, false); }
graph_iterator< const graph, const graph_node > const_iterator

◆ exception_thrown()

bool tbb::flow::interface10::graph::exception_thrown ( )
inline

◆ increment_wait_count()

void tbb::flow::interface10::graph::increment_wait_count ( )
inline

Definition at line 291 of file _flow_graph_impl.h.

291  {
292  reserve_wait();
293  }
void reserve_wait() __TBB_override
Used to register that an external entity may still interact with the graph.
Definition: flow_graph.h:773

◆ is_cancelled()

bool tbb::flow::interface10::graph::is_cancelled ( )
inline

return status of graph execution

Definition at line 391 of file _flow_graph_impl.h.

◆ prepare_task_arena()

void tbb::flow::interface10::graph::prepare_task_arena ( bool  reinit = false)
inlineprivate

Definition at line 261 of file _flow_graph_impl.h.

References __TBB_ASSERT, and name.

Referenced by graph(), and reset().

261  {
262  if (reinit) {
263  __TBB_ASSERT(my_task_arena, "task arena is NULL");
266  }
267  else {
268  __TBB_ASSERT(my_task_arena == NULL, "task arena is not NULL");
270  }
271  if (!my_task_arena->is_active()) // failed to attach
272  my_task_arena->initialize(); // create a new, default-initialized arena
273  __TBB_ASSERT(my_task_arena->is_active(), "task arena is not active");
274  }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
void initialize()
Forces allocation of the resources for the task_arena as specified in constructor arguments...
Definition: task_arena.h:248
Tag class used to indicate the "attaching" constructor.
Definition: task_arena.h:236
Here is the caller graph for this function:

◆ register_node()

void tbb::flow::interface10::graph::register_node ( graph_node n)
inlineprivate

Definition at line 787 of file flow_graph.h.

787  {
788  n->next = NULL;
789  {
791  n->prev = my_nodes_last;
792  if (my_nodes_last) my_nodes_last->next = n;
793  my_nodes_last = n;
794  if (!my_nodes) my_nodes = n;
795  }
796 }
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
friend class scoped_lock
Definition: spin_mutex.h:176

◆ release_wait()

void tbb::flow::interface10::graph::release_wait ( )
inlinevirtual

Deregisters an external entity that may have interacted with the graph.

The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls.

Implements tbb::flow::interface10::graph_proxy.

Definition at line 780 of file flow_graph.h.

780  {
781  if (my_root_task) {
784  }
785 }
int decrement_ref_count()
Atomically decrement reference count and returns its new value.
Definition: task.h:758
static void fgt_release_wait(void *)

◆ remove_node()

void tbb::flow::interface10::graph::remove_node ( graph_node n)
inlineprivate

Definition at line 798 of file flow_graph.h.

References __TBB_ASSERT, lock, my_nodes, my_nodes_last, tbb::flow::interface10::graph_node::next, nodelist_mutex, and tbb::flow::interface10::graph_node::prev.

798  {
799  {
801  __TBB_ASSERT(my_nodes && my_nodes_last, "graph::remove_node: Error: no registered nodes");
802  if (n->prev) n->prev->next = n->next;
803  if (n->next) n->next->prev = n->prev;
804  if (my_nodes_last == n) my_nodes_last = n->prev;
805  if (my_nodes == n) my_nodes = n->next;
806  }
807  n->prev = n->next = NULL;
808 }
#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 * lock
friend class scoped_lock
Definition: spin_mutex.h:176

◆ reserve_wait()

void tbb::flow::interface10::graph::reserve_wait ( )
inlinevirtual

Used to register that an external entity may still interact with the graph.

The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made.

Implements tbb::flow::interface10::graph_proxy.

Definition at line 773 of file flow_graph.h.

References my_root_task.

773  {
774  if (my_root_task) {
777  }
778 }
static void fgt_reserve_wait(void *)
void increment_ref_count()
Atomically increment reference count.
Definition: task.h:741

◆ reset()

void tbb::flow::interface10::graph::reset ( reset_flags  f = rf_reset_protocol)
inline

Definition at line 810 of file flow_graph.h.

References tbb::flow::interface10::internal::activate_graph(), begin(), cancelled, caught_exception, tbb::flow::interface10::internal::deactivate_graph(), end(), my_context, prepare_task_arena(), tbb::task_group_context::reset(), and tbb::flow::interface10::graph_node::reset_node().

810  {
811  // reset context
813 
814  if(my_context) my_context->reset();
815  cancelled = false;
816  caught_exception = false;
817  // reset all the nodes comprising the graph
818  for(iterator ii = begin(); ii != end(); ++ii) {
819  graph_node *my_p = &(*ii);
820  my_p->reset_node(f);
821  }
822  // Reattach the arena. Might be useful to run the graph in a particular task_arena
823  // while not limiting graph lifetime to a single task_arena::execute() call.
824  prepare_task_arena( /*reinit=*/true );
826  // now spawn the tasks necessary to start the graph
827  for(task_list_type::iterator rti = my_reset_task_list.begin(); rti != my_reset_task_list.end(); ++rti) {
828  internal::spawn_in_graph_arena(*this, *(*rti));
829  }
830  my_reset_task_list.clear();
831 }
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed...
iterator end()
end iterator
Definition: flow_graph.h:835
void spawn_in_graph_arena(graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.
graph_iterator< graph, graph_node > iterator
void prepare_task_arena(bool reinit=false)
iterator begin()
start iterator
Definition: flow_graph.h:833
tbb::task_group_context * my_context
Here is the call graph for this function:

◆ root_task()

tbb::task* tbb::flow::interface10::graph::root_task ( )
inline

Returns the root task of the graph.

Definition at line 364 of file _flow_graph_impl.h.

364  {
365  return my_root_task;
366  }

◆ run() [1/2]

template<typename Receiver , typename Body >
void tbb::flow::interface10::graph::run ( Receiver &  r,
Body  body 
)
inline

Spawns a task that runs a body and puts its output to a specific receiver.

The task is spawned as a child of the graph. This is useful for running tasks that need to block a wait_for_all() on the graph. For example a one-off source.

Definition at line 313 of file _flow_graph_impl.h.

References tbb::flow::interface10::graph::run_and_put_task< Receiver, Body >::execute(), tbb::flow::interface10::internal::is_graph_active(), and tbb::interface9::internal::root_task.

313  {
314  if (internal::is_graph_active(*this)) {
315  task* rtask = new (task::allocate_additional_child_of(*root_task()))
316  run_and_put_task< Receiver, Body >(r, body);
317  my_task_arena->execute(spawn_functor(*rtask));
318  }
319  }
tbb::task * root_task()
Returns the root task of the graph.
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
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:343
Here is the call graph for this function:

◆ run() [2/2]

template<typename Body >
void tbb::flow::interface10::graph::run ( Body  body)
inline

Spawns a task that runs a function object.

The task is spawned as a child of the graph. This is useful for running tasks that need to block a wait_for_all() on the graph. For example a one-off source.

Definition at line 325 of file _flow_graph_impl.h.

References tbb::flow::interface10::graph::run_task< Body >::execute(), tbb::flow::interface10::internal::is_graph_active(), and tbb::interface9::internal::root_task.

325  {
326  if (internal::is_graph_active(*this)) {
327  task* rtask = new (task::allocate_additional_child_of(*root_task())) run_task< Body >(body);
328  my_task_arena->execute(spawn_functor(*rtask));
329  }
330  }
tbb::task * root_task()
Returns the root task of the graph.
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
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:343
Here is the call graph for this function:

◆ wait_for_all()

void tbb::flow::interface10::graph::wait_for_all ( )
inline

Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.

The waiting thread will go off and steal work while it is block in the wait_for_all.

Definition at line 334 of file _flow_graph_impl.h.

References tbb::task_group_context::concurrent_wait.

Referenced by ~graph().

334  {
335  cancelled = false;
336  caught_exception = false;
337  if (my_root_task) {
338 #if TBB_USE_EXCEPTIONS
339  try {
340 #endif
341  my_task_arena->execute(wait_functor(my_root_task));
343 #if TBB_USE_EXCEPTIONS
344  }
345  catch (...) {
347  my_context->reset();
348  caught_exception = true;
349  cancelled = true;
350  throw;
351  }
352 #endif
353  // TODO: the "if" condition below is just a work-around to support the concurrent wait
354  // mode. The cancellation and exception mechanisms are still broken in this mode.
355  // Consider using task group not to re-implement the same functionality.
357  my_context->reset(); // consistent with behavior in catch()
359  }
360  }
361  }
void set_ref_count(int count)
Set reference count.
Definition: task.h:731
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed...
tbb::task_group_context * my_context
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:343
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
uintptr_t traits() const
Returns the context&#39;s trait.
Definition: task.h:552
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ graph_iterator

template<typename C , typename N >
friend class graph_iterator
friend

Definition at line 370 of file _flow_graph_impl.h.

◆ graph_node

friend class graph_node
friend

Definition at line 208 of file _flow_graph_impl.h.

◆ internal::activate_graph

◆ internal::add_task_to_graph_reset_list

◆ internal::deactivate_graph

◆ internal::enqueue_in_graph_arena

void internal::enqueue_in_graph_arena ( graph g,
tbb::task arena_task 
)
friend

◆ internal::is_graph_active

bool internal::is_graph_active ( graph g)
friend

◆ internal::prioritize_task

tbb::task& internal::prioritize_task ( graph g,
tbb::task arena_task 
)
friend

◆ internal::spawn_in_graph_arena

void internal::spawn_in_graph_arena ( graph g,
tbb::task arena_task 
)
friend

◆ tbb::interface7::internal::task_arena_base

Definition at line 426 of file _flow_graph_impl.h.

Member Data Documentation

◆ cancelled

bool tbb::flow::interface10::graph::cancelled
private

Definition at line 401 of file _flow_graph_impl.h.

Referenced by graph(), and reset().

◆ caught_exception

bool tbb::flow::interface10::graph::caught_exception
private

Definition at line 402 of file _flow_graph_impl.h.

Referenced by graph(), and reset().

◆ my_context

tbb::task_group_context* tbb::flow::interface10::graph::my_context
private

Definition at line 399 of file _flow_graph_impl.h.

Referenced by graph(), and reset().

◆ my_is_active

◆ my_nodes

graph_node* tbb::flow::interface10::graph::my_nodes
private

Definition at line 406 of file _flow_graph_impl.h.

Referenced by remove_node().

◆ my_nodes_last

graph_node * tbb::flow::interface10::graph::my_nodes_last
private

Definition at line 406 of file _flow_graph_impl.h.

Referenced by remove_node().

◆ my_priority_queue

internal::graph_task_priority_queue_t tbb::flow::interface10::graph::my_priority_queue
private

◆ my_reset_task_list

◆ my_root_task

tbb::task* tbb::flow::interface10::graph::my_root_task
private

◆ my_task_arena

tbb::task_arena* tbb::flow::interface10::graph::my_task_arena
private

◆ nodelist_mutex

tbb::spin_mutex tbb::flow::interface10::graph::nodelist_mutex
private

Definition at line 408 of file _flow_graph_impl.h.

Referenced by remove_node().

◆ own_context

bool tbb::flow::interface10::graph::own_context
private

Definition at line 400 of file _flow_graph_impl.h.

Referenced by graph().


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

Copyright © 2005-2019 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.