Intel(R) Threading Building Blocks Doxygen Documentation version 4.2.3
tbb::flow::interface11::source_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::source_node< Output >:
Collaboration diagram for tbb::flow::interface11::source_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 source_node (graph &g, Body body, bool is_active=true)
 Constructor for a node with a successor. More...
 
__TBB_NOINLINE_SYM source_node (const source_node &src)
 Copy constructor. More...
 
 ~source_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 ()
 
virtual bool try_get (Output &)
 Request an item from the sender. More...
 
virtual bool try_reserve (Output &)
 Reserves an item in the sender. More...
 
- Public Member Functions inherited from tbb::flow::interface11::internal::untyped_sender
virtual ~untyped_sender ()
 
virtual bool register_successor (successor_type &r)=0
 Add a new successor to this node. More...
 
virtual bool remove_successor (successor_type &r)=0
 Removes a successor from this node. More...
 
virtual bool try_release ()
 Releases the reserved item. More...
 
virtual bool try_consume ()
 Consumes the reserved item. More...
 

Protected Member Functions

void reset_node (reset_flags f) __TBB_override
 resets the source_node to its initial state More...
 
virtual void reset_node (reset_flags f=rf_reset_protocol)=0
 
- 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...
 
virtual bool try_get_wrapper (void *p, bool is_async)=0
 
virtual bool try_reserve_wrapper (void *p, bool is_async)=0
 

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
 
bool init_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< source_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::source_node< Output >

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

Definition at line 1179 of file flow_graph.h.

Member Typedef Documentation

◆ input_type

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

Definition at line 1190 of file flow_graph.h.

◆ output_type

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

The type of the output message, which is complete.

Definition at line 1184 of file flow_graph.h.

◆ successor_type

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

The type of successors of this node.

Definition at line 1187 of file flow_graph.h.

Constructor & Destructor Documentation

◆ source_node() [1/2]

template<typename Output >
template<typename Body >
__TBB_NOINLINE_SYM tbb::flow::interface11::source_node< Output >::source_node ( graph g,
Body  body,
bool  is_active = true 
)
inline

Constructor for a node with a successor.

Definition at line 1199 of file flow_graph.h.

1200 : graph_node(g), my_active(is_active), init_my_active(is_active),
1203 my_reserved(false), my_has_cached_item(false)
1204 {
1205 my_successors.set_owner(this);
1206 tbb::internal::fgt_node_with_body( CODEPTR(), tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,
1207 static_cast<sender<output_type> *>(this), this->my_body );
1208 }
#define CODEPTR()
static void fgt_node_with_body(void *, string_index, void *, void *, void *)
internal::source_body< output_type > * my_init_body
Definition: flow_graph.h:1383
internal::source_body< output_type > * my_body
Definition: flow_graph.h:1382
internal::broadcast_cache< output_type > my_successors
Definition: flow_graph.h:1384
The leaf for source_body.

References CODEPTR, and tbb::internal::fgt_node_with_body().

Here is the call graph for this function:

◆ source_node() [2/2]

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

Copy constructor.

Definition at line 1219 of file flow_graph.h.

1219 :
1220 graph_node(src.my_graph), sender<Output>(),
1221 my_active(src.init_my_active),
1222 init_my_active(src.init_my_active), my_body( src.my_init_body->clone() ), my_init_body(src.my_init_body->clone() ),
1223 my_reserved(false), my_has_cached_item(false)
1224 {
1225 my_successors.set_owner(this);
1226 tbb::internal::fgt_node_with_body(CODEPTR(), tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,
1227 static_cast<sender<output_type> *>(this), this->my_body );
1228 }

References CODEPTR, and tbb::internal::fgt_node_with_body().

Here is the call graph for this function:

◆ ~source_node()

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

The destructor.

Definition at line 1231 of file flow_graph.h.

1231{ delete my_body; delete my_init_body; }

Member Function Documentation

◆ activate()

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

Activates a node that was created in the inactive state.

Definition at line 1337 of file flow_graph.h.

1337 {
1339 my_active = true;
1340 if (!my_successors.empty())
1341 spawn_put();
1342 }
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:1422
friend class scoped_lock
Definition: spin_mutex.h:179

References lock.

◆ apply_body_bypass()

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

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

Definition at line 1430 of file flow_graph.h.

1430 {
1431 output_type v;
1432 if ( !try_reserve_apply_body(v) )
1433 return NULL;
1434
1435 task *last_task = my_successors.try_put_task(v);
1436 if ( last_task )
1437 try_consume();
1438 else
1439 try_release();
1440 return last_task;
1441 }
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_consume() __TBB_override
Consumes a reserved item.
Definition: flow_graph.h:1325
bool try_reserve_apply_body(output_type &v)
Definition: flow_graph.h:1390
Output output_type
The type of the output message, which is complete.
Definition: flow_graph.h:1184
bool try_release() __TBB_override
Release a reserved item.
Definition: flow_graph.h:1315

◆ copy_function_object()

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

Definition at line 1345 of file flow_graph.h.

1345 {
1347 return dynamic_cast< internal::source_body_leaf<output_type, Body> & >(body_ref).get_body();
1348 }

◆ create_put_task()

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

Definition at line 1416 of file flow_graph.h.

1416 {
1417 return ( new ( task::allocate_additional_child_of( *(this->my_graph.root_task()) ) )
1418 internal:: source_task_bypass < source_node< output_type > >( *this ) );
1419 }
A task that calls a node's apply_body_bypass function with no input.
tbb::task * root_task()
Returns the root task of the graph.

◆ register_successor()

template<typename Output >
bool tbb::flow::interface11::source_node< Output >::register_successor ( successor_type r)
inlinevirtual

Add a new successor to this node.

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

Definition at line 1240 of file flow_graph.h.

1240 {
1242 my_successors.register_successor(r);
1243 if ( my_active )
1244 spawn_put();
1245 return true;
1246 }

References lock.

◆ remove_successor()

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

Removes a successor from this node.

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

Definition at line 1249 of file flow_graph.h.

1249 {
1251 my_successors.remove_successor(r);
1252 return true;
1253 }

References lock.

◆ reset_node()

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

resets the source_node to its initial state

Implements tbb::flow::interface11::graph_node.

Definition at line 1362 of file flow_graph.h.

1362 {
1364 my_reserved =false;
1365 if(my_has_cached_item) {
1366 my_has_cached_item = false;
1367 }
1368 if(f & rf_clear_edges) my_successors.clear();
1369 if(f & rf_reset_bodies) {
1371 delete my_body;
1372 my_body = tmp;
1373 }
1374 if(my_active)
1376 }
void add_task_to_graph_reset_list(tbb::flow::interface10::graph &g, tbb::task *tp)
virtual source_body * clone()=0

References tbb::flow::interface11::internal::add_task_to_graph_reset_list(), internal::source_body< Output >::clone(), tbb::flow::interface11::rf_clear_edges, and tbb::flow::interface11::rf_reset_bodies.

Here is the call graph for this function:

◆ spawn_put()

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

Spawns a task that applies the body.

Definition at line 1422 of file flow_graph.h.

1422 {
1425 }
1426 }
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)

◆ try_consume()

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

Consumes a reserved item.

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

Definition at line 1325 of file flow_graph.h.

1325 {
1327 __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
1328 my_reserved = false;
1329 my_has_cached_item = false;
1330 if ( !my_successors.empty() ) {
1331 spawn_put();
1332 }
1333 return true;
1334 }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, and lock.

◆ try_get()

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

Request an item from the node.

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

Definition at line 1281 of file flow_graph.h.

1281 {
1283 if ( my_reserved )
1284 return false;
1285
1286 if ( my_has_cached_item ) {
1287 v = my_cached_item;
1288 my_has_cached_item = false;
1289 return true;
1290 }
1291 // we've been asked to provide an item, but we have none. enqueue a task to
1292 // provide one.
1293 spawn_put();
1294 return false;
1295 }

References lock.

◆ try_release()

template<typename Output >
bool tbb::flow::interface11::source_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 1315 of file flow_graph.h.

1315 {
1317 __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
1318 my_reserved = false;
1319 if(!my_successors.empty())
1320 spawn_put();
1321 return true;
1322 }

References __TBB_ASSERT, and lock.

◆ try_reserve()

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

Reserves an item.

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

Definition at line 1298 of file flow_graph.h.

1298 {
1300 if ( my_reserved ) {
1301 return false;
1302 }
1303
1304 if ( my_has_cached_item ) {
1305 v = my_cached_item;
1306 my_reserved = true;
1307 return true;
1308 } else {
1309 return false;
1310 }
1311 }

References lock.

◆ try_reserve_apply_body()

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

Definition at line 1390 of file flow_graph.h.

1390 {
1392 if ( my_reserved ) {
1393 return false;
1394 }
1395 if ( !my_has_cached_item ) {
1397 bool r = (*my_body)(my_cached_item);
1399 if (r) {
1400 my_has_cached_item = true;
1401 }
1402 }
1403 if ( my_has_cached_item ) {
1404 v = my_cached_item;
1405 my_reserved = true;
1406 return true;
1407 } else {
1408 return false;
1409 }
1410 }
static void fgt_begin_body(void *)
static void fgt_end_body(void *)

References tbb::internal::fgt_begin_body(), tbb::internal::fgt_end_body(), and lock.

Here is the call graph for this function:

Friends And Related Function Documentation

◆ internal::source_task_bypass< source_node< output_type > >

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

Definition at line 1422 of file flow_graph.h.

Member Data Documentation

◆ init_my_active

template<typename Output >
bool tbb::flow::interface11::source_node< Output >::init_my_active
private

Definition at line 1381 of file flow_graph.h.

◆ my_active

template<typename Output >
bool tbb::flow::interface11::source_node< Output >::my_active
private

Definition at line 1380 of file flow_graph.h.

◆ my_body

template<typename Output >
internal::source_body<output_type>* tbb::flow::interface11::source_node< Output >::my_body
private

Definition at line 1382 of file flow_graph.h.

◆ my_cached_item

template<typename Output >
output_type tbb::flow::interface11::source_node< Output >::my_cached_item
private

Definition at line 1387 of file flow_graph.h.

◆ my_has_cached_item

template<typename Output >
bool tbb::flow::interface11::source_node< Output >::my_has_cached_item
private

Definition at line 1386 of file flow_graph.h.

◆ my_init_body

template<typename Output >
internal::source_body<output_type>* tbb::flow::interface11::source_node< Output >::my_init_body
private

Definition at line 1383 of file flow_graph.h.

◆ my_mutex

template<typename Output >
spin_mutex tbb::flow::interface11::source_node< Output >::my_mutex
private

Definition at line 1379 of file flow_graph.h.

◆ my_reserved

template<typename Output >
bool tbb::flow::interface11::source_node< Output >::my_reserved
private

Definition at line 1385 of file flow_graph.h.

◆ my_successors

template<typename Output >
internal::broadcast_cache< output_type > tbb::flow::interface11::source_node< Output >::my_successors
private

Definition at line 1384 of file flow_graph.h.


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.