Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface11::input_node< Output > Class Template Reference

An executable node that acts as a source, i.e. it has no predecessors. More...

#include <flow_graph.h>

Inheritance diagram for tbb::flow::interface11::input_node< Output >:
Collaboration diagram for tbb::flow::interface11::input_node< Output >:

Public Types

typedef Output output_type
 The type of the output message, which is complete. More...
 
typedef sender< output_type >::successor_type successor_type
 The type of successors of this node. More...
 
typedef null_type input_type
 

Public Member Functions

template<typename Body >
__TBB_NOINLINE_SYM input_node (graph &g, Body body)
 Constructor for a node with a successor. More...
 
__TBB_NOINLINE_SYM input_node (const input_node &src)
 Copy constructor. More...
 
 ~input_node ()
 The destructor. More...
 
bool register_successor (successor_type &r) __TBB_override
 Add a new successor to this node. More...
 
bool remove_successor (successor_type &r) __TBB_override
 Removes a successor from this node. More...
 
bool try_get (output_type &v) __TBB_override
 Request an item from the node. More...
 
bool try_reserve (output_type &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...
 
void activate ()
 Activates a node that was created in the inactive state. More...
 
template<typename Body >
Body copy_function_object ()
 
- Public Member Functions inherited from tbb::flow::interface11::graph_node
 graph_node (graph &g)
 
virtual ~graph_node ()
 
- Public Member Functions inherited from tbb::flow::interface11::sender< Output >
virtual ~sender ()
 
virtual __TBB_DEPRECATED bool register_successor (successor_type &r)=0
 Add a new successor to this node. More...
 
virtual __TBB_DEPRECATED bool remove_successor (successor_type &r)=0
 Removes a successor from this node. More...
 

Protected Member Functions

void reset_node (reset_flags f) __TBB_override
 resets the source_node to its initial state More...
 

Private Member Functions

bool try_reserve_apply_body (output_type &v)
 
taskcreate_put_task ()
 
void spawn_put ()
 Spawns a task that applies the body. More...
 
taskapply_body_bypass ()
 Applies the body. Returning SUCCESSFULLY_ENQUEUED okay; forward_task_bypass will handle it. More...
 

Private Attributes

spin_mutex my_mutex
 
bool my_active
 
internal::source_body< output_type > * my_body
 
internal::source_body< output_type > * my_init_body
 
internal::broadcast_cache< output_typemy_successors
 
bool my_reserved
 
bool my_has_cached_item
 
output_type my_cached_item
 

Friends

class internal::source_task_bypass< input_node< output_type > >
 

Additional Inherited Members

- Public Attributes inherited from tbb::flow::interface11::sender< Output >
__TBB_DEPRECATED typedef Output output_type
 The output type of this sender. More...
 
__TBB_DEPRECATED typedef receiver< Output > successor_type
 The successor type for this node. More...
 
- Protected Attributes inherited from tbb::flow::interface11::graph_node
graphmy_graph
 
graph_nodenext
 
graph_nodeprev
 

Detailed Description

template<typename Output>
class tbb::flow::interface11::input_node< Output >

An executable node that acts as a source, i.e. it has no predecessors.

Definition at line 903 of file flow_graph.h.

Member Typedef Documentation

◆ input_type

template<typename Output >
typedef null_type tbb::flow::interface11::input_node< Output >::input_type

Definition at line 912 of file flow_graph.h.

◆ output_type

template<typename Output >
typedef Output tbb::flow::interface11::input_node< Output >::output_type

The type of the output message, which is complete.

Definition at line 906 of file flow_graph.h.

◆ successor_type

template<typename Output >
typedef sender<output_type>::successor_type tbb::flow::interface11::input_node< Output >::successor_type

The type of successors of this node.

Definition at line 909 of file flow_graph.h.

Constructor & Destructor Documentation

◆ input_node() [1/2]

template<typename Output >
template<typename Body >
__TBB_NOINLINE_SYM tbb::flow::interface11::input_node< Output >::input_node ( graph g,
Body  body 
)
inline

Constructor for a node with a successor.

Definition at line 921 of file flow_graph.h.

922  : graph_node(g), my_active(false),
925  my_reserved(false), my_has_cached_item(false)
926  {
927  my_successors.set_owner(this);
928  tbb::internal::fgt_node_with_body( CODEPTR(), tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,
929  static_cast<sender<output_type> *>(this), this->my_body );
930  }

References CODEPTR, tbb::internal::fgt_node_with_body(), tbb::flow::interface11::input_node< Output >::my_body, tbb::flow::interface11::graph_node::my_graph, and tbb::flow::interface11::input_node< Output >::my_successors.

Here is the call graph for this function:

◆ input_node() [2/2]

template<typename Output >
__TBB_NOINLINE_SYM tbb::flow::interface11::input_node< Output >::input_node ( const input_node< Output > &  src)
inline

Copy constructor.

Definition at line 941 of file flow_graph.h.

941  :
942  graph_node(src.my_graph), sender<Output>(),
943  my_active(false),
944  my_body( src.my_init_body->clone() ), my_init_body(src.my_init_body->clone() ),
945  my_reserved(false), my_has_cached_item(false)
946  {
947  my_successors.set_owner(this);
948  tbb::internal::fgt_node_with_body(CODEPTR(), tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,
949  static_cast<sender<output_type> *>(this), this->my_body );
950  }

References CODEPTR, tbb::internal::fgt_node_with_body(), tbb::flow::interface11::input_node< Output >::my_body, tbb::flow::interface11::graph_node::my_graph, and tbb::flow::interface11::input_node< Output >::my_successors.

Here is the call graph for this function:

◆ ~input_node()

template<typename Output >
tbb::flow::interface11::input_node< Output >::~input_node ( )
inline

Member Function Documentation

◆ activate()

template<typename Output >
void tbb::flow::interface11::input_node< Output >::activate ( )
inline

Activates a node that was created in the inactive state.

Definition at line 1060 of file flow_graph.h.

1060  {
1062  my_active = true;
1063  if (!my_successors.empty())
1064  spawn_put();
1065  }

References lock, tbb::flow::interface11::input_node< Output >::my_active, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_successors, and tbb::flow::interface11::input_node< Output >::spawn_put().

Here is the call graph for this function:

◆ apply_body_bypass()

template<typename Output >
task* tbb::flow::interface11::input_node< Output >::apply_body_bypass ( )
inlineprivate

Applies the body. Returning SUCCESSFULLY_ENQUEUED okay; forward_task_bypass will handle it.

Definition at line 1145 of file flow_graph.h.

1145  {
1146  output_type v;
1147  if ( !try_reserve_apply_body(v) )
1148  return NULL;
1149 
1150  task *last_task = my_successors.try_put_task(v);
1151  if ( last_task )
1152  try_consume();
1153  else
1154  try_release();
1155  return last_task;
1156  }

References tbb::flow::interface11::input_node< Output >::my_successors, tbb::flow::interface11::input_node< Output >::try_consume(), tbb::flow::interface11::input_node< Output >::try_release(), and tbb::flow::interface11::input_node< Output >::try_reserve_apply_body().

Here is the call graph for this function:

◆ copy_function_object()

template<typename Output >
template<typename Body >
Body tbb::flow::interface11::input_node< Output >::copy_function_object ( )
inline

Definition at line 1068 of file flow_graph.h.

1068  {
1069  internal::source_body<output_type> &body_ref = *this->my_body;
1070  return dynamic_cast< internal::source_body_leaf<output_type, Body> & >(body_ref).get_body();
1071  }

References tbb::flow::interface11::input_node< Output >::my_body.

◆ create_put_task()

template<typename Output >
task* tbb::flow::interface11::input_node< Output >::create_put_task ( )
inlineprivate

Definition at line 1131 of file flow_graph.h.

1131  {
1132  return ( new ( task::allocate_additional_child_of( *(this->my_graph.root_task()) ) )
1133  internal:: source_task_bypass < input_node< output_type > >( *this ) );
1134  }

References tbb::flow::interface11::graph_node::my_graph, and tbb::flow::interface10::graph::root_task().

Referenced by tbb::flow::interface11::input_node< Output >::spawn_put().

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

◆ register_successor()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::register_successor ( successor_type r)
inline

Add a new successor to this node.

Definition at line 962 of file flow_graph.h.

962  {
964  my_successors.register_successor(r);
965  if ( my_active )
966  spawn_put();
967  return true;
968  }

References lock, tbb::flow::interface11::input_node< Output >::my_active, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_successors, and tbb::flow::interface11::input_node< Output >::spawn_put().

Here is the call graph for this function:

◆ remove_successor()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::remove_successor ( successor_type r)
inline

Removes a successor from this node.

Definition at line 971 of file flow_graph.h.

971  {
973  my_successors.remove_successor(r);
974  return true;
975  }

References lock, tbb::flow::interface11::input_node< Output >::my_mutex, and tbb::flow::interface11::input_node< Output >::my_successors.

◆ reset_node()

template<typename Output >
void tbb::flow::interface11::input_node< Output >::reset_node ( reset_flags  f)
inlineprotectedvirtual

◆ spawn_put()

template<typename Output >
void tbb::flow::interface11::input_node< Output >::spawn_put ( )
inlineprivate

Spawns a task that applies the body.

Definition at line 1137 of file flow_graph.h.

1137  {
1138  if(internal::is_graph_active(this->my_graph)) {
1140  }
1141  }

References tbb::flow::interface11::input_node< Output >::create_put_task(), tbb::flow::interface11::internal::is_graph_active(), tbb::flow::interface11::graph_node::my_graph, and tbb::flow::interface11::internal::spawn_in_graph_arena().

Referenced by tbb::flow::interface11::input_node< Output >::activate(), tbb::flow::interface11::input_node< Output >::register_successor(), tbb::flow::interface11::input_node< Output >::try_consume(), tbb::flow::interface11::input_node< Output >::try_get(), and tbb::flow::interface11::input_node< Output >::try_release().

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

◆ try_consume()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::try_consume ( )
inlinevirtual

Consumes a reserved item.

Reimplemented from tbb::flow::interface11::sender< Output >.

Definition at line 1048 of file flow_graph.h.

1048  {
1050  __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
1051  my_reserved = false;
1052  my_has_cached_item = false;
1053  if ( !my_successors.empty() ) {
1054  spawn_put();
1055  }
1056  return true;
1057  }

References __TBB_ASSERT, lock, tbb::flow::interface11::input_node< Output >::my_has_cached_item, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_reserved, tbb::flow::interface11::input_node< Output >::my_successors, and tbb::flow::interface11::input_node< Output >::spawn_put().

Referenced by tbb::flow::interface11::input_node< Output >::apply_body_bypass().

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

◆ try_get()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::try_get ( output_type v)
inlinevirtual

Request an item from the node.

Reimplemented from tbb::flow::interface11::sender< Output >.

Definition at line 1003 of file flow_graph.h.

1003  {
1005  if ( my_reserved )
1006  return false;
1007 
1008  if ( my_has_cached_item ) {
1009  v = my_cached_item;
1010  my_has_cached_item = false;
1011  return true;
1012  }
1013  // we've been asked to provide an item, but we have none. enqueue a task to
1014  // provide one.
1015  if ( my_active )
1016  spawn_put();
1017  return false;
1018  }

References lock, tbb::flow::interface11::input_node< Output >::my_active, tbb::flow::interface11::input_node< Output >::my_cached_item, tbb::flow::interface11::input_node< Output >::my_has_cached_item, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_reserved, and tbb::flow::interface11::input_node< Output >::spawn_put().

Here is the call graph for this function:

◆ try_release()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::try_release ( )
inlinevirtual

Release a reserved item.

true = item has been released and so remains in sender, dest must request or reserve future items

Reimplemented from tbb::flow::interface11::sender< Output >.

Definition at line 1038 of file flow_graph.h.

1038  {
1040  __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
1041  my_reserved = false;
1042  if(!my_successors.empty())
1043  spawn_put();
1044  return true;
1045  }

References __TBB_ASSERT, lock, tbb::flow::interface11::input_node< Output >::my_has_cached_item, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_reserved, tbb::flow::interface11::input_node< Output >::my_successors, and tbb::flow::interface11::input_node< Output >::spawn_put().

Referenced by tbb::flow::interface11::input_node< Output >::apply_body_bypass().

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

◆ try_reserve()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::try_reserve ( output_type v)
inlinevirtual

Reserves an item.

Reimplemented from tbb::flow::interface11::sender< Output >.

Definition at line 1021 of file flow_graph.h.

1021  {
1023  if ( my_reserved ) {
1024  return false;
1025  }
1026 
1027  if ( my_has_cached_item ) {
1028  v = my_cached_item;
1029  my_reserved = true;
1030  return true;
1031  } else {
1032  return false;
1033  }
1034  }

References lock, tbb::flow::interface11::input_node< Output >::my_cached_item, tbb::flow::interface11::input_node< Output >::my_has_cached_item, tbb::flow::interface11::input_node< Output >::my_mutex, and tbb::flow::interface11::input_node< Output >::my_reserved.

◆ try_reserve_apply_body()

template<typename Output >
bool tbb::flow::interface11::input_node< Output >::try_reserve_apply_body ( output_type v)
inlineprivate

Definition at line 1109 of file flow_graph.h.

1109  {
1111  if ( my_reserved ) {
1112  return false;
1113  }
1114  if ( !my_has_cached_item ) {
1116  bool r = (*my_body)(my_cached_item);
1118  if (r) {
1119  my_has_cached_item = true;
1120  }
1121  }
1122  if ( my_has_cached_item ) {
1123  v = my_cached_item;
1124  my_reserved = true;
1125  return true;
1126  } else {
1127  return false;
1128  }
1129  }

References tbb::internal::fgt_begin_body(), tbb::internal::fgt_end_body(), lock, tbb::flow::interface11::input_node< Output >::my_body, tbb::flow::interface11::input_node< Output >::my_cached_item, tbb::flow::interface11::input_node< Output >::my_has_cached_item, tbb::flow::interface11::input_node< Output >::my_mutex, and tbb::flow::interface11::input_node< Output >::my_reserved.

Referenced by tbb::flow::interface11::input_node< Output >::apply_body_bypass().

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

Friends And Related Function Documentation

◆ internal::source_task_bypass< input_node< output_type > >

template<typename Output >
friend class internal::source_task_bypass< input_node< output_type > >
friend

Definition at line 1143 of file flow_graph.h.

Member Data Documentation

◆ my_active

◆ my_body

◆ my_cached_item

◆ my_has_cached_item

◆ my_init_body

◆ my_mutex

◆ my_reserved

◆ my_successors


The documentation for this class was generated from the following file:
tbb::flow::interface11::input_node::my_has_cached_item
bool my_has_cached_item
Definition: flow_graph.h:1105
tbb::flow::interface11::input_node::my_body
internal::source_body< output_type > * my_body
Definition: flow_graph.h:1101
tbb::flow::interface11::internal::is_graph_active
bool is_graph_active(tbb::flow::interface10::graph &g)
Definition: _flow_graph_impl.h:494
tbb::flow::interface11::internal::spawn_in_graph_arena
void spawn_in_graph_arena(tbb::flow::interface10::graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.
Definition: _flow_graph_impl.h:521
CODEPTR
#define CODEPTR()
Definition: _flow_graph_trace_impl.h:297
__TBB_ASSERT
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
tbb::flow::interface11::graph_node::my_graph
graph & my_graph
Definition: _flow_graph_impl.h:464
tbb::internal::fgt_node_with_body
static void fgt_node_with_body(void *, string_index, void *, void *, void *)
Definition: _flow_graph_trace_impl.h:330
internal::source_task_bypass
A task that calls a node's apply_body_bypass function with no input.
Definition: _flow_graph_body_impl.h:320
tbb::flow::interface11::input_node::try_reserve_apply_body
bool try_reserve_apply_body(output_type &v)
Definition: flow_graph.h:1109
tbb::flow::interface10::graph::root_task
tbb::task * root_task()
Returns the root task of the graph.
Definition: _flow_graph_impl.h:374
tbb::flow::interface11::input_node::my_successors
internal::broadcast_cache< output_type > my_successors
Definition: flow_graph.h:1103
tbb::flow::interface11::input_node::try_release
bool try_release() __TBB_override
Release a reserved item.
Definition: flow_graph.h:1038
tbb::internal::fgt_begin_body
static void fgt_begin_body(void *)
Definition: _flow_graph_trace_impl.h:336
tbb::flow::interface11::input_node::output_type
Output output_type
The type of the output message, which is complete.
Definition: flow_graph.h:906
tbb::flow::interface11::input_node::try_consume
bool try_consume() __TBB_override
Consumes a reserved item.
Definition: flow_graph.h:1048
internal::source_body_leaf
The leaf for source_body.
Definition: _flow_graph_body_impl.h:105
tbb::spin_mutex::scoped_lock
friend class scoped_lock
Definition: spin_mutex.h:179
tbb::flow::interface11::input_node::my_mutex
spin_mutex my_mutex
Definition: flow_graph.h:1099
tbb::flow::interface11::input_node::my_init_body
internal::source_body< output_type > * my_init_body
Definition: flow_graph.h:1102
tbb::flow::interface11::input_node::spawn_put
void spawn_put()
Spawns a task that applies the body.
Definition: flow_graph.h:1137
tbb::flow::interface11::input_node::my_active
bool my_active
Definition: flow_graph.h:1100
lock
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
Definition: ittnotify_static.h:121
tbb::flow::interface11::input_node::create_put_task
task * create_put_task()
Definition: flow_graph.h:1131
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 * task
Definition: ittnotify_static.h:119
tbb::flow::interface11::graph_node::graph_node
graph_node(graph &g)
Definition: flow_graph.h:887
tbb::flow::interface11::input_node::my_cached_item
output_type my_cached_item
Definition: flow_graph.h:1106
tbb::flow::interface11::rf_clear_edges
@ rf_clear_edges
Definition: _flow_graph_impl.h:161
tbb::internal::fgt_end_body
static void fgt_end_body(void *)
Definition: _flow_graph_trace_impl.h:337
internal::source_body::clone
virtual source_body * clone()=0
tbb::flow::interface11::rf_reset_bodies
@ rf_reset_bodies
Definition: _flow_graph_impl.h:160
tbb::flow::interface11::input_node::my_reserved
bool my_reserved
Definition: flow_graph.h:1104
internal::source_body< output_type >

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

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

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