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 Types inherited from tbb::flow::interface11::internal::untyped_sender
typedef untyped_receiver successor_type
 The successor type for this node. More...
 

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::internal::untyped_sender
virtual ~untyped_sender ()
 

Protected Member Functions

void reset_node (reset_flags f) __TBB_override
 resets the input_node to its initial state More...
 
- Protected Member Functions inherited from tbb::flow::interface11::sender< Output >
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::interface11::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...
 

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::input_body< output_type > * my_body
 
internal::input_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 internal::async_helpers< Output >::filtered_type filtered_type
 
- 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 904 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 913 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 907 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 910 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 922 of file flow_graph.h.

923 : graph_node(g), my_active(false),
926 my_reserved(false), my_has_cached_item(false)
927 {
929 tbb::internal::fgt_node_with_body( CODEPTR(), tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,
930 static_cast<sender<output_type> *>(this), this->my_body );
931 }
#define CODEPTR()
static void fgt_node_with_body(void *, string_index, void *, void *, void *)
internal::input_body< output_type > * my_init_body
Definition: flow_graph.h:1103
internal::input_body< output_type > * my_body
Definition: flow_graph.h:1102
internal::broadcast_cache< output_type > my_successors
Definition: flow_graph.h:1104
The leaf for input_body.
void set_owner(owner_type *owner)

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

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 942 of file flow_graph.h.

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

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

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 1061 of file flow_graph.h.

1061 {
1063 my_active = true;
1064 if (!my_successors.empty())
1065 spawn_put();
1066 }
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
void spawn_put()
Spawns a task that applies the body.
Definition: flow_graph.h:1145
friend class scoped_lock
Definition: spin_mutex.h:179

References internal::successor_cache< T, M >::empty(), 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 1153 of file flow_graph.h.

1153 {
1154 output_type v;
1155 if ( !try_reserve_apply_body(v) )
1156 return NULL;
1157
1158 task *last_task = my_successors.try_put_task(v);
1159 if ( last_task )
1160 try_consume();
1161 else
1162 try_release();
1163 return last_task;
1164 }
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
bool try_release() __TBB_override
Release a reserved item.
Definition: flow_graph.h:1039
bool try_reserve_apply_body(output_type &v)
Definition: flow_graph.h:1110
Output output_type
The type of the output message, which is complete.
Definition: flow_graph.h:907
bool try_consume() __TBB_override
Consumes a reserved item.
Definition: flow_graph.h:1049
task * try_put_task(const T &t) __TBB_override

References tbb::flow::interface11::input_node< Output >::my_successors, tbb::flow::interface11::input_node< Output >::try_consume(), internal::broadcast_cache< T, M >::try_put_task(), 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 1069 of file flow_graph.h.

1069 {
1070 internal::input_body<output_type> &body_ref = *this->my_body;
1071 return dynamic_cast< internal::input_body_leaf<output_type, Body> & >(body_ref).get_body();
1072 }
A functor that takes no input and generates a value of type Output.

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 1139 of file flow_graph.h.

1139 {
1140 return ( new ( task::allocate_additional_child_of( *(this->my_graph.root_task()) ) )
1141 internal:: source_task_bypass < input_node< output_type > >( *this ) );
1142 }
A task that calls a node's apply_body_bypass function with no input.
__TBB_DEPRECATED tbb::task * root_task()
Returns the root task of the graph.

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

Here is the call graph for this function:

◆ register_successor()

◆ remove_successor()

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

Removes a successor from this node.

Implements tbb::flow::interface11::internal::untyped_sender.

Definition at line 972 of file flow_graph.h.

972 {
975 return true;
976 }
void remove_successor(successor_type &r)

References lock, tbb::flow::interface11::input_node< Output >::my_mutex, tbb::flow::interface11::input_node< Output >::my_successors, and internal::successor_cache< T, M >::remove_successor().

Here is the call graph for this function:

◆ reset_node()

◆ 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 1145 of file flow_graph.h.

1145 {
1148 }
1149 }
void spawn_in_graph_arena(tbb::flow::interface10::graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.
bool is_graph_active(tbb::flow::interface10::graph &g)

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 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::internal::untyped_sender.

Definition at line 1049 of file flow_graph.h.

1049 {
1051 __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
1052 my_reserved = false;
1053 my_has_cached_item = false;
1054 if ( !my_successors.empty() ) {
1055 spawn_put();
1056 }
1057 return true;
1058 }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, internal::successor_cache< T, M >::empty(), 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 1004 of file flow_graph.h.

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

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::internal::untyped_sender.

Definition at line 1039 of file flow_graph.h.

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

References __TBB_ASSERT, internal::successor_cache< T, M >::empty(), 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 1022 of file flow_graph.h.

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

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 1110 of file flow_graph.h.

1110 {
1112 if ( my_reserved ) {
1113 return false;
1114 }
1115 if ( !my_has_cached_item ) {
1117
1118#if TBB_DEPRECATED_INPUT_NODE_BODY
1119 bool r = (*my_body)(my_cached_item);
1120 if (r) {
1121 my_has_cached_item = true;
1122 }
1123#else
1124 flow_control control;
1125 my_cached_item = (*my_body)(control);
1126 my_has_cached_item = !control.is_pipeline_stopped;
1127#endif
1129 }
1130 if ( my_has_cached_item ) {
1131 v = my_cached_item;
1132 my_reserved = true;
1133 return true;
1134 } else {
1135 return false;
1136 }
1137 }
static void fgt_begin_body(void *)
static void fgt_end_body(void *)

References tbb::internal::fgt_begin_body(), tbb::internal::fgt_end_body(), tbb::interface6::flow_control::is_pipeline_stopped, 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 1145 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:

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.