Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface10::buffer_node< T, A > Class Template Reference

Forwards messages in arbitrary order. More...

#include <flow_graph.h>

Inheritance diagram for tbb::flow::interface10::buffer_node< T, A >:
Collaboration diagram for tbb::flow::interface10::buffer_node< T, A >:

Classes

class  buffer_operation
 

Public Types

typedef T input_type
 
typedef T output_type
 
typedef receiver< input_type >::predecessor_type predecessor_type
 
typedef sender< output_type >::successor_type successor_type
 
typedef buffer_node< T, A > class_type
 
- Public Types inherited from tbb::flow::interface10::internal::item_buffer< T, A >
enum  buffer_item_state { no_item =0, has_item =1, reserved_item =2 }
 
typedef T item_type
 
- Public Types inherited from tbb::flow::interface10::receiver< T >
typedef T input_type
 The input type of this receiver. More...
 
typedef internal::async_helpers< T >::filtered_type filtered_type
 
- Public Types inherited from tbb::flow::interface10::internal::untyped_receiver
typedef untyped_sender predecessor_type
 The predecessor type for this node. More...
 
- Public Types inherited from tbb::flow::interface10::sender< T >
typedef T output_type
 The output type of this sender. More...
 
typedef internal::async_helpers< T >::filtered_type filtered_type
 
- Public Types inherited from tbb::flow::interface10::internal::untyped_sender
typedef untyped_receiver successor_type
 The successor type for this node. More...
 

Public Member Functions

 buffer_node (graph &g)
 Constructor. More...
 
 buffer_node (const buffer_node &src)
 Copy constructor. More...
 
bool register_successor (successor_type &r) __TBB_override
 Adds a new successor. More...
 
bool remove_successor (successor_type &r) __TBB_override
 Removes a successor. More...
 
bool try_get (T &v) __TBB_override
 Request an item from the buffer_node. More...
 
bool try_reserve (T &v) __TBB_override
 Reserves an item. More...
 
bool try_release () __TBB_override
 Release a reserved item. More...
 
bool try_consume () __TBB_override
 Consumes a reserved item. More...
 
- Public Member Functions inherited from tbb::flow::interface10::graph_node
 graph_node (graph &g)
 
virtual ~graph_node ()
 
- Public Member Functions inherited from tbb::flow::interface10::internal::reservable_item_buffer< T, A >
 reservable_item_buffer ()
 
void reset ()
 
- Public Member Functions inherited from tbb::flow::interface10::internal::item_buffer< T, A >
 item_buffer ()
 Constructor. More...
 
 ~item_buffer ()
 
void reset ()
 
- Public Member Functions inherited from tbb::flow::interface10::receiver< T >
bool try_put (const typename internal::async_helpers< T >::filtered_type &t)
 Put an item to the receiver. More...
 
bool try_put (const typename internal::async_helpers< T >::async_type &t)
 
- Public Member Functions inherited from tbb::flow::interface10::internal::untyped_receiver
virtual ~untyped_receiver ()
 Destructor. More...
 
template<typename X >
bool try_put (const X &t)
 Put an item to the receiver. More...
 
virtual bool register_predecessor (predecessor_type &)
 Add a predecessor to the node. More...
 
virtual bool remove_predecessor (predecessor_type &)
 Remove a predecessor from the node. More...
 
- Public Member Functions inherited from tbb::flow::interface10::internal::untyped_sender
virtual ~untyped_sender ()
 

Protected Types

enum  op_type {
  reg_succ, rem_succ, req_item, res_item,
  rel_res, con_res, put_item, try_fwd_task
}
 
typedef size_t size_type
 
typedef internal::aggregating_functor< class_type, buffer_operationhandler_type
 
- Protected Types inherited from tbb::flow::interface10::internal::item_buffer< T, A >
typedef size_t size_type
 
typedef aligned_pair< item_type, buffer_item_state >::type buffer_item_type
 
typedef A::template rebind< buffer_item_type >::other allocator_type
 

Protected Member Functions

virtual void handle_operations (buffer_operation *op_list)
 
template<typename derived_type >
void handle_operations_impl (buffer_operation *op_list, derived_type *derived)
 
taskgrab_forwarding_task (buffer_operation &op_data)
 
bool enqueue_forwarding_task (buffer_operation &op_data)
 
virtual taskforward_task ()
 This is executed by an enqueued task, the "forwarder". More...
 
virtual void internal_reg_succ (buffer_operation *op)
 Register successor. More...
 
virtual void internal_rem_succ (buffer_operation *op)
 Remove successor. More...
 
virtual void internal_forward_task (buffer_operation *op)
 Tries to forward valid items to successors. More...
 
template<typename derived_type >
void internal_forward_task_impl (buffer_operation *op, derived_type *derived)
 
virtual bool internal_push (buffer_operation *op)
 
virtual void internal_pop (buffer_operation *op)
 
virtual void internal_reserve (buffer_operation *op)
 
virtual void internal_consume (buffer_operation *op)
 
virtual void internal_release (buffer_operation *op)
 
tasktry_put_task (const T &t) __TBB_override
 receive an item, return a task *if possible More...
 
graphgraph_reference () __TBB_override
 
void reset_receiver (reset_flags) __TBB_override
 put receiver back in initial state More...
 
void reset_node (reset_flags f) __TBB_override
 
- Protected Member Functions inherited from tbb::flow::interface10::internal::reservable_item_buffer< T, A >
bool reserve_front (T &v)
 
void consume_front ()
 
void release_front ()
 
- Protected Member Functions inherited from tbb::flow::interface10::internal::item_buffer< T, A >
bool buffer_empty () const
 
buffer_item_typeitem (size_type i)
 
const buffer_item_typeitem (size_type i) const
 
bool my_item_valid (size_type i) const
 
bool my_item_reserved (size_type i) const
 
const item_typeget_my_item (size_t i) const
 
void set_my_item (size_t i, const item_type &o)
 
void fetch_item (size_t i, item_type &o)
 
void move_item (size_t to, size_t from)
 
bool place_item (size_t here, const item_type &me)
 
void swap_items (size_t i, size_t j)
 
void destroy_item (size_type i)
 
const item_typefront () const
 
const item_typeback () const
 
void reserve_item (size_type i)
 
void release_item (size_type i)
 
void destroy_front ()
 
void destroy_back ()
 
size_type size (size_t new_tail=0)
 
size_type capacity ()
 
bool buffer_full ()
 
void grow_my_array (size_t minimum_size)
 Grows the internal array. More...
 
bool push_back (item_type &v)
 
bool pop_back (item_type &v)
 
bool pop_front (item_type &v)
 
void clean_up_buffer (bool reset_pointers)
 
- Protected Member Functions inherited from tbb::flow::interface10::receiver< T >
virtual tasktry_put_task_wrapper (const void *p, bool is_async) __TBB_override
 
- Protected Member Functions inherited from tbb::flow::interface10::internal::untyped_receiver
template<typename X >
tasktry_put_task (const X &t)
 
virtual bool is_continue_receiver ()
 
- Protected Member Functions inherited from tbb::flow::interface10::sender< T >
virtual bool try_get_wrapper (void *p, bool is_async) __TBB_override
 
virtual bool try_reserve_wrapper (void *p, bool is_async) __TBB_override
 
- Protected Member Functions inherited from tbb::flow::interface10::internal::untyped_sender
template<typename X >
bool try_get (X &t)
 Request an item from the sender. More...
 
template<typename X >
bool try_reserve (X &t)
 Reserves an item in the sender. More...
 

Protected Attributes

internal::round_robin_cache< T, null_rw_mutexmy_successors
 
bool forwarder_busy
 
internal::aggregator< handler_type, buffer_operationmy_aggregator
 
- Protected Attributes inherited from tbb::flow::interface10::graph_node
graphmy_graph
 
graph_nodenext
 
graph_nodeprev
 
- Protected Attributes inherited from tbb::flow::interface10::internal::reservable_item_buffer< T, A >
bool my_reserved
 
- Protected Attributes inherited from tbb::flow::interface10::internal::item_buffer< T, A >
buffer_item_typemy_array
 
size_type my_array_size
 
size_type my_head
 
size_type my_tail
 

Private Member Functions

void order ()
 
bool is_item_valid ()
 
void try_put_and_add_task (task *&last_task)
 

Friends

class internal::forward_task_bypass< buffer_node< T, A > >
 
class internal::aggregating_functor< class_type, buffer_operation >
 
template<typename R , typename B >
class run_and_put_task
 
template<typename X , typename Y >
class internal::broadcast_cache
 
template<typename X , typename Y >
class internal::round_robin_cache
 

Additional Inherited Members

- Static Protected Attributes inherited from tbb::flow::interface10::internal::item_buffer< T, A >
static const size_type initial_buffer_size = 4
 

Detailed Description

template<typename T, typename A = cache_aligned_allocator<T>>
class tbb::flow::interface10::buffer_node< T, A >

Forwards messages in arbitrary order.

Definition at line 1543 of file flow_graph.h.

Member Typedef Documentation

◆ class_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef buffer_node<T, A> tbb::flow::interface10::buffer_node< T, A >::class_type

Definition at line 1549 of file flow_graph.h.

◆ handler_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef internal::aggregating_functor<class_type, buffer_operation> tbb::flow::interface10::buffer_node< T, A >::handler_type
protected

Definition at line 1604 of file flow_graph.h.

◆ input_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef T tbb::flow::interface10::buffer_node< T, A >::input_type

Definition at line 1545 of file flow_graph.h.

◆ output_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef T tbb::flow::interface10::buffer_node< T, A >::output_type

Definition at line 1546 of file flow_graph.h.

◆ predecessor_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef receiver<input_type>::predecessor_type tbb::flow::interface10::buffer_node< T, A >::predecessor_type

Definition at line 1547 of file flow_graph.h.

◆ size_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef size_t tbb::flow::interface10::buffer_node< T, A >::size_type
protected

Definition at line 1555 of file flow_graph.h.

◆ successor_type

template<typename T, typename A = cache_aligned_allocator<T>>
typedef sender<output_type>::successor_type tbb::flow::interface10::buffer_node< T, A >::successor_type

Definition at line 1548 of file flow_graph.h.

Member Enumeration Documentation

◆ op_type

template<typename T, typename A = cache_aligned_allocator<T>>
enum tbb::flow::interface10::buffer_node::op_type
protected
Enumerator
reg_succ 
rem_succ 
req_item 
res_item 
rel_res 
con_res 
put_item 
try_fwd_task 

Definition at line 1564 of file flow_graph.h.

1565 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
1566  , add_blt_succ, del_blt_succ,
1567  add_blt_pred, del_blt_pred,
1568  blt_succ_cnt, blt_pred_cnt,
1569  blt_succ_cpy, blt_pred_cpy // create vector copies of preds and succs
1570 #endif
1571  };

Constructor & Destructor Documentation

◆ buffer_node() [1/2]

template<typename T, typename A = cache_aligned_allocator<T>>
tbb::flow::interface10::buffer_node< T, A >::buffer_node ( graph g)
inlineexplicit

Constructor.

Definition at line 1839 of file flow_graph.h.

1840  forwarder_busy(false) {
1841  my_successors.set_owner(this);
1842  my_aggregator.initialize_handler(handler_type(this));
1843  tbb::internal::fgt_node( tbb::internal::FLOW_BUFFER_NODE, &this->my_graph,
1844  static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );
1845  }
internal::aggregating_functor< class_type, buffer_operation > handler_type
Definition: flow_graph.h:1604
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606
item_buffer with reservable front-end. NOTE: if reserving, do not
static void fgt_node(string_index, void *, void *)

References tbb::internal::fgt_node(), tbb::flow::interface10::buffer_node< T, A >::my_aggregator, tbb::flow::interface10::graph_node::my_graph, and tbb::flow::interface10::buffer_node< T, A >::my_successors.

Here is the call graph for this function:

◆ buffer_node() [2/2]

template<typename T, typename A = cache_aligned_allocator<T>>
tbb::flow::interface10::buffer_node< T, A >::buffer_node ( const buffer_node< T, A > &  src)
inline

Copy constructor.

Definition at line 1848 of file flow_graph.h.

1848  : graph_node(src.my_graph),
1849  internal::reservable_item_buffer<T>(), receiver<T>(), sender<T>() {
1850  forwarder_busy = false;
1851  my_successors.set_owner(this);
1852  my_aggregator.initialize_handler(handler_type(this));
1853  tbb::internal::fgt_node( tbb::internal::FLOW_BUFFER_NODE, &this->my_graph,
1854  static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );
1855  }
internal::aggregating_functor< class_type, buffer_operation > handler_type
Definition: flow_graph.h:1604
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606
item_buffer with reservable front-end. NOTE: if reserving, do not
static void fgt_node(string_index, void *, void *)

References tbb::internal::fgt_node(), tbb::flow::interface10::buffer_node< T, A >::forwarder_busy, tbb::flow::interface10::buffer_node< T, A >::my_aggregator, tbb::flow::interface10::graph_node::my_graph, and tbb::flow::interface10::buffer_node< T, A >::my_successors.

Here is the call graph for this function:

Member Function Documentation

◆ enqueue_forwarding_task()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::enqueue_forwarding_task ( buffer_operation op_data)
inlineprotected

Definition at line 1666 of file flow_graph.h.

1666  {
1667  task *ft = grab_forwarding_task(op_data);
1668  if(ft) {
1670  return true;
1671  }
1672  return false;
1673  }
task * grab_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1662
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
graph & graph_reference() __TBB_override
Definition: flow_graph.h:2008
void spawn_in_graph_arena(graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.

Referenced by tbb::flow::interface10::buffer_node< T, A >::try_release(), and tbb::flow::interface10::internal::unfolded_join_node< 10, key_matching_port, OutputTuple, key_matching< K, KHash > >::unfolded_join_node().

Here is the caller graph for this function:

◆ forward_task()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual task* tbb::flow::interface10::buffer_node< T, A >::forward_task ( )
inlineprotectedvirtual

This is executed by an enqueued task, the "forwarder".

Definition at line 1676 of file flow_graph.h.

1676  {
1677  buffer_operation op_data(try_fwd_task);
1678  task *last_task = NULL;
1679  do {
1680  op_data.status = internal::WAIT;
1681  op_data.ltask = NULL;
1682  my_aggregator.execute(&op_data);
1683 
1684  // workaround for icc bug
1685  tbb::task *xtask = op_data.ltask;
1686  graph& g = this->my_graph;
1687  last_task = combine_tasks(g, last_task, xtask);
1688  } while (op_data.status ==internal::SUCCEEDED);
1689  return last_task;
1690  }
Base class for user-defined tasks.
Definition: task.h:592
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606
static tbb::task * combine_tasks(graph &g, tbb::task *left, tbb::task *right)
Definition: flow_graph.h:171
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

References tbb::flow::interface10::buffer_node< T, A >::my_aggregator, tbb::flow::interface10::buffer_node< T, A >::try_fwd_task, and tbb::flow::interface10::internal::WAIT.

◆ grab_forwarding_task()

template<typename T, typename A = cache_aligned_allocator<T>>
task* tbb::flow::interface10::buffer_node< T, A >::grab_forwarding_task ( buffer_operation op_data)
inlineprotected

Definition at line 1662 of file flow_graph.h.

1662  {
1663  return op_data.ltask;
1664  }

◆ graph_reference()

template<typename T, typename A = cache_aligned_allocator<T>>
graph& tbb::flow::interface10::buffer_node< T, A >::graph_reference ( )
inlineprotectedvirtual

Implements tbb::flow::interface10::internal::untyped_receiver.

Definition at line 2008 of file flow_graph.h.

2008  {
2009  return my_graph;
2010  }

References tbb::flow::interface10::graph_node::my_graph.

Referenced by tbb::flow::interface10::queue_node< T, A >::try_put_and_add_task(), and tbb::flow::interface10::priority_queue_node< T, Compare, A >::try_put_and_add_task().

Here is the caller graph for this function:

◆ handle_operations()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::handle_operations ( buffer_operation op_list)
inlineprotectedvirtual

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >.

Definition at line 1608 of file flow_graph.h.

1608  {
1609  handle_operations_impl(op_list, this);
1610  }
void handle_operations_impl(buffer_operation *op_list, derived_type *derived)
Definition: flow_graph.h:1613

References tbb::flow::interface10::buffer_node< T, A >::handle_operations_impl().

Here is the call graph for this function:

◆ handle_operations_impl()

template<typename T, typename A = cache_aligned_allocator<T>>
template<typename derived_type >
void tbb::flow::interface10::buffer_node< T, A >::handle_operations_impl ( buffer_operation op_list,
derived_type *  derived 
)
inlineprotected

Definition at line 1613 of file flow_graph.h.

1613  {
1614  __TBB_ASSERT(static_cast<class_type*>(derived) == this, "'this' is not a base class for derived");
1615 
1616  buffer_operation *tmp = NULL;
1617  bool try_forwarding = false;
1618  while (op_list) {
1619  tmp = op_list;
1620  op_list = op_list->next;
1621  switch (tmp->type) {
1622  case reg_succ: internal_reg_succ(tmp); try_forwarding = true; break;
1623  case rem_succ: internal_rem_succ(tmp); break;
1624  case req_item: internal_pop(tmp); break;
1625  case res_item: internal_reserve(tmp); break;
1626  case rel_res: internal_release(tmp); try_forwarding = true; break;
1627  case con_res: internal_consume(tmp); try_forwarding = true; break;
1628  case put_item: try_forwarding = internal_push(tmp); break;
1629  case try_fwd_task: internal_forward_task(tmp); break;
1630 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
1631  // edge recording
1632  case add_blt_succ: internal_add_built_succ(tmp); break;
1633  case del_blt_succ: internal_del_built_succ(tmp); break;
1634  case add_blt_pred: internal_add_built_pred(tmp); break;
1635  case del_blt_pred: internal_del_built_pred(tmp); break;
1636  case blt_succ_cnt: internal_succ_cnt(tmp); break;
1637  case blt_pred_cnt: internal_pred_cnt(tmp); break;
1638  case blt_succ_cpy: internal_copy_succs(tmp); break;
1639  case blt_pred_cpy: internal_copy_preds(tmp); break;
1640 #endif
1641  }
1642  }
1643 
1644  derived->order();
1645 
1646  if (try_forwarding && !forwarder_busy) {
1647  if(internal::is_graph_active(this->my_graph)) {
1648  forwarder_busy = true;
1649  task *new_task = new(task::allocate_additional_child_of(*(this->my_graph.root_task()))) internal::
1650  forward_task_bypass
1651  < buffer_node<input_type, A> >(*this);
1652  // tmp should point to the last item handled by the aggregator. This is the operation
1653  // the handling thread enqueued. So modifying that record will be okay.
1654  // workaround for icc bug
1655  tbb::task *z = tmp->ltask;
1656  graph &g = this->my_graph;
1657  tmp->ltask = combine_tasks(g, z, new_task); // in case the op generated a task
1658  }
1659  }
1660  } // handle_operations
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:169
virtual void internal_rem_succ(buffer_operation *op)
Remove successor.
Definition: flow_graph.h:1699
virtual void internal_consume(buffer_operation *op)
Definition: flow_graph.h:1827
virtual void internal_reserve(buffer_operation *op)
Definition: flow_graph.h:1818
Base class for user-defined tasks.
Definition: task.h:592
tbb::task * root_task()
Returns the root task of the graph.
static tbb::task * combine_tasks(graph &g, tbb::task *left, tbb::task *right)
Definition: flow_graph.h:171
virtual bool internal_push(buffer_operation *op)
Definition: flow_graph.h:1803
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
virtual void internal_reg_succ(buffer_operation *op)
Register successor.
Definition: flow_graph.h:1693
virtual void internal_forward_task(buffer_operation *op)
Tries to forward valid items to successors.
Definition: flow_graph.h:1774
virtual void internal_release(buffer_operation *op)
Definition: flow_graph.h:1832
virtual void internal_pop(buffer_operation *op)
Definition: flow_graph.h:1809

Referenced by tbb::flow::interface10::buffer_node< T, A >::handle_operations(), and tbb::flow::interface10::priority_queue_node< T, Compare, A >::handle_operations().

Here is the caller graph for this function:

◆ internal_consume()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_consume ( buffer_operation op)
inlineprotectedvirtual

◆ internal_forward_task()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_forward_task ( buffer_operation op)
inlineprotectedvirtual

Tries to forward valid items to successors.

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >, and tbb::flow::interface10::queue_node< T, A >.

Definition at line 1774 of file flow_graph.h.

1774  {
1775  internal_forward_task_impl(op, this);
1776  }
void internal_forward_task_impl(buffer_operation *op, derived_type *derived)
Definition: flow_graph.h:1779

References tbb::flow::interface10::buffer_node< T, A >::internal_forward_task_impl().

Here is the call graph for this function:

◆ internal_forward_task_impl()

template<typename T, typename A = cache_aligned_allocator<T>>
template<typename derived_type >
void tbb::flow::interface10::buffer_node< T, A >::internal_forward_task_impl ( buffer_operation op,
derived_type *  derived 
)
inlineprotected

Definition at line 1779 of file flow_graph.h.

1779  {
1780  __TBB_ASSERT(static_cast<class_type*>(derived) == this, "'this' is not a base class for derived");
1781 
1782  if (this->my_reserved || !derived->is_item_valid()) {
1784  this->forwarder_busy = false;
1785  return;
1786  }
1787  // Try forwarding, giving each successor a chance
1788  task * last_task = NULL;
1789  size_type counter = my_successors.size();
1790  for (; counter > 0 && derived->is_item_valid(); --counter)
1791  derived->try_put_and_add_task(last_task);
1792 
1793  op->ltask = last_task; // return task
1794  if (last_task && !counter) {
1796  }
1797  else {
1799  forwarder_busy = false;
1800  }
1801  }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:169
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
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 __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

References __TBB_ASSERT, tbb::internal::__TBB_store_with_release(), and tbb::flow::interface10::internal::FAILED.

Referenced by tbb::flow::interface10::buffer_node< T, A >::internal_forward_task(), tbb::flow::interface10::queue_node< T, A >::internal_forward_task(), and tbb::flow::interface10::priority_queue_node< T, Compare, A >::internal_forward_task().

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

◆ internal_pop()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_pop ( buffer_operation op)
inlineprotectedvirtual

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >, and tbb::flow::interface10::queue_node< T, A >.

Definition at line 1809 of file flow_graph.h.

1809  {
1810  if(this->pop_back(*(op->elem))) {
1812  }
1813  else {
1815  }
1816  }
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

◆ internal_push()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual bool tbb::flow::interface10::buffer_node< T, A >::internal_push ( buffer_operation op)
inlineprotectedvirtual

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >, and tbb::flow::interface10::sequencer_node< T, A >.

Definition at line 1803 of file flow_graph.h.

1803  {
1804  this->push_back(*(op->elem));
1806  return true;
1807  }
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

References tbb::flow::interface10::internal::item_buffer< T, A >::push_back().

Here is the call graph for this function:

◆ internal_reg_succ()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_reg_succ ( buffer_operation op)
inlineprotectedvirtual

Register successor.

Definition at line 1693 of file flow_graph.h.

1693  {
1694  my_successors.register_successor(*(op->r));
1696  }
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

◆ internal_release()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_release ( buffer_operation op)
inlineprotectedvirtual

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >.

Definition at line 1832 of file flow_graph.h.

1832  {
1833  this->release_front();
1835  }
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

References tbb::internal::__TBB_store_with_release(), tbb::flow::interface10::internal::reservable_item_buffer< T, A >::release_front(), and tbb::flow::interface10::internal::SUCCEEDED.

Here is the call graph for this function:

◆ internal_rem_succ()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_rem_succ ( buffer_operation op)
inlineprotectedvirtual

Remove successor.

Definition at line 1699 of file flow_graph.h.

1699  {
1700  my_successors.remove_successor(*(op->r));
1702  }
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

◆ internal_reserve()

template<typename T, typename A = cache_aligned_allocator<T>>
virtual void tbb::flow::interface10::buffer_node< T, A >::internal_reserve ( buffer_operation op)
inlineprotectedvirtual

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >, and tbb::flow::interface10::queue_node< T, A >.

Definition at line 1818 of file flow_graph.h.

1818  {
1819  if(this->reserve_front(*(op->elem))) {
1821  }
1822  else {
1824  }
1825  }
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:717

◆ is_item_valid()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::is_item_valid ( )
inlineprivate

Definition at line 1758 of file flow_graph.h.

1758  {
1759  return this->my_item_valid(this->my_tail - 1);
1760  }

◆ order()

template<typename T, typename A = cache_aligned_allocator<T>>
void tbb::flow::interface10::buffer_node< T, A >::order ( )
inlineprivate

Definition at line 1756 of file flow_graph.h.

1756 {}

◆ register_successor()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::register_successor ( successor_type r)
inlinevirtual

Adds a new successor.

Adds successor r to the list of successors; may forward tasks.

Implements tbb::flow::interface10::internal::untyped_sender.

Definition at line 1869 of file flow_graph.h.

1869  {
1870  buffer_operation op_data(reg_succ);
1871  op_data.r = &r;
1872  my_aggregator.execute(&op_data);
1873  (void)enqueue_forwarding_task(op_data);
1874  return true;
1875  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

◆ remove_successor()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::remove_successor ( successor_type r)
inlinevirtual

Removes a successor.

Removes successor r from the list of successors. It also calls r.remove_predecessor(*this) to remove this node as a predecessor.

Implements tbb::flow::interface10::internal::untyped_sender.

Definition at line 1931 of file flow_graph.h.

1931  {
1932  r.remove_predecessor(*this);
1933  buffer_operation op_data(rem_succ);
1934  op_data.r = &r;
1935  my_aggregator.execute(&op_data);
1936  // even though this operation does not cause a forward, if we are the handler, and
1937  // a forward is scheduled, we may be the first to reach this point after the aggregator,
1938  // and so should check for the task.
1939  (void)enqueue_forwarding_task(op_data);
1940  return true;
1941  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

◆ reset_node()

template<typename T, typename A = cache_aligned_allocator<T>>
void tbb::flow::interface10::buffer_node< T, A >::reset_node ( reset_flags  f)
inlineprotectedvirtual

Implements tbb::flow::interface10::graph_node.

Reimplemented in tbb::flow::interface10::priority_queue_node< T, Compare, A >, and tbb::flow::interface10::queue_node< T, A >.

Definition at line 2023 of file flow_graph.h.

2023  {
2025  // TODO: just clear structures
2026  if (f&rf_clear_edges) {
2027  my_successors.clear();
2028 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
2029  my_built_predecessors.clear();
2030 #endif
2031  }
2032  forwarder_busy = false;
2033  }
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556

References tbb::flow::interface10::buffer_node< T, A >::forwarder_busy, tbb::flow::interface10::buffer_node< T, A >::my_successors, tbb::flow::interface10::internal::reservable_item_buffer< T, A >::reset(), and tbb::flow::interface10::rf_clear_edges.

Referenced by tbb::flow::interface10::queue_node< T, A >::reset_node(), and tbb::flow::interface10::priority_queue_node< T, Compare, A >::reset_node().

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

◆ reset_receiver()

template<typename T, typename A = cache_aligned_allocator<T>>
void tbb::flow::interface10::buffer_node< T, A >::reset_receiver ( reset_flags  f)
inlineprotectedvirtual

put receiver back in initial state

Implements tbb::flow::interface10::internal::untyped_receiver.

Definition at line 2012 of file flow_graph.h.

2012 { }

◆ try_consume()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::try_consume ( )
inlinevirtual

Consumes a reserved item.

true = item is removed from sender and reservation removed

Reimplemented from tbb::flow::interface10::internal::untyped_sender.

Definition at line 1976 of file flow_graph.h.

1976  {
1977  buffer_operation op_data(con_res);
1978  my_aggregator.execute(&op_data);
1979  (void)enqueue_forwarding_task(op_data);
1980  return true;
1981  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

◆ try_get()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::try_get ( T &  v)
inlinevirtual

Request an item from the buffer_node.

true = v contains the returned item
false = no item has been returned

Reimplemented from tbb::flow::interface10::sender< T >.

Definition at line 1946 of file flow_graph.h.

1946  {
1947  buffer_operation op_data(req_item);
1948  op_data.elem = &v;
1949  my_aggregator.execute(&op_data);
1950  (void)enqueue_forwarding_task(op_data);
1951  return (op_data.status==internal::SUCCEEDED);
1952  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

◆ try_put_and_add_task()

template<typename T, typename A = cache_aligned_allocator<T>>
void tbb::flow::interface10::buffer_node< T, A >::try_put_and_add_task ( task *&  last_task)
inlineprivate

Definition at line 1762 of file flow_graph.h.

1762  {
1763  task *new_task = my_successors.try_put_task(this->back());
1764  if (new_task) {
1765  // workaround for icc bug
1766  graph& g = this->my_graph;
1767  last_task = combine_tasks(g, last_task, new_task);
1768  this->destroy_back();
1769  }
1770  }
internal::round_robin_cache< T, null_rw_mutex > my_successors
Definition: flow_graph.h:1556
static tbb::task * combine_tasks(graph &g, tbb::task *left, tbb::task *right)
Definition: flow_graph.h:171
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

◆ try_put_task()

template<typename T, typename A = cache_aligned_allocator<T>>
task* tbb::flow::interface10::buffer_node< T, A >::try_put_task ( const T &  t)
inlineprotectedvirtual

receive an item, return a task *if possible

Implements tbb::flow::interface10::receiver< T >.

Definition at line 1989 of file flow_graph.h.

1989  {
1990  buffer_operation op_data(t, put_item);
1991  my_aggregator.execute(&op_data);
1992  task *ft = grab_forwarding_task(op_data);
1993  // sequencer_nodes can return failure (if an item has been previously inserted)
1994  // We have to spawn the returned task if our own operation fails.
1995 
1996  if(ft && op_data.status ==internal::FAILED) {
1997  // we haven't succeeded queueing the item, but for some reason the
1998  // call returned a task (if another request resulted in a successful
1999  // forward this could happen.) Queue the task and reset the pointer.
2001  }
2002  else if(!ft && op_data.status ==internal::SUCCEEDED) {
2003  ft = SUCCESSFULLY_ENQUEUED;
2004  }
2005  return ft;
2006  }
static tbb::task *const SUCCESSFULLY_ENQUEUED
task * grab_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1662
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606
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
graph & graph_reference() __TBB_override
Definition: flow_graph.h:2008
void spawn_in_graph_arena(graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.

References tbb::flow::interface10::buffer_node< T, A >::put_item.

◆ try_release()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::try_release ( )
inlinevirtual

Release a reserved item.

true = item has been released and so remains in sender

Reimplemented from tbb::flow::interface10::internal::untyped_sender.

Definition at line 1967 of file flow_graph.h.

1967  {
1968  buffer_operation op_data(rel_res);
1969  my_aggregator.execute(&op_data);
1970  (void)enqueue_forwarding_task(op_data);
1971  return true;
1972  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

References tbb::flow::interface10::buffer_node< T, A >::enqueue_forwarding_task(), tbb::flow::interface10::buffer_node< T, A >::my_aggregator, tbb::flow::interface10::buffer_node< T, A >::rel_res, and void.

Here is the call graph for this function:

◆ try_reserve()

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::try_reserve ( T &  v)
inlinevirtual

Reserves an item.

false = no item can be reserved
true = an item is reserved

Reimplemented from tbb::flow::interface10::sender< T >.

Definition at line 1957 of file flow_graph.h.

1957  {
1958  buffer_operation op_data(res_item);
1959  op_data.elem = &v;
1960  my_aggregator.execute(&op_data);
1961  (void)enqueue_forwarding_task(op_data);
1962  return (op_data.status==internal::SUCCEEDED);
1963  }
bool enqueue_forwarding_task(buffer_operation &op_data)
Definition: flow_graph.h:1666
internal::aggregator< handler_type, buffer_operation > my_aggregator
Definition: flow_graph.h:1606

References tbb::flow::interface10::buffer_node< T, A >::res_item.

Friends And Related Function Documentation

◆ internal::aggregating_functor< class_type, buffer_operation >

template<typename T, typename A = cache_aligned_allocator<T>>
friend class internal::aggregating_functor< class_type, buffer_operation >
friend

Definition at line 1605 of file flow_graph.h.

◆ internal::broadcast_cache

template<typename T, typename A = cache_aligned_allocator<T>>
template<typename X , typename Y >
friend class internal::broadcast_cache
friend

Definition at line 1986 of file flow_graph.h.

◆ internal::forward_task_bypass< buffer_node< T, A > >

template<typename T, typename A = cache_aligned_allocator<T>>
friend class internal::forward_task_bypass< buffer_node< T, A > >
friend

Definition at line 1562 of file flow_graph.h.

◆ internal::round_robin_cache

template<typename T, typename A = cache_aligned_allocator<T>>
template<typename X , typename Y >
friend class internal::round_robin_cache
friend

Definition at line 1987 of file flow_graph.h.

◆ run_and_put_task

template<typename T, typename A = cache_aligned_allocator<T>>
template<typename R , typename B >
friend class run_and_put_task
friend

Definition at line 1985 of file flow_graph.h.

Member Data Documentation

◆ forwarder_busy

template<typename T, typename A = cache_aligned_allocator<T>>
bool tbb::flow::interface10::buffer_node< T, A >::forwarder_busy
protected

◆ my_aggregator

◆ my_successors


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

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.