Intel(R) Threading Building Blocks Doxygen Documentation version 4.2.3
internal::reserving_port< T > Class Template Reference

The two-phase join port. More...

#include <_flow_graph_join_impl.h>

Inheritance diagram for internal::reserving_port< T >:
Collaboration diagram for internal::reserving_port< T >:

Classes

class  reserving_port_operation
 

Public Types

typedef T input_type
 
typedef receiver< input_type >::predecessor_type predecessor_type
 

Public Member Functions

 reserving_port ()
 Constructor. More...
 
 reserving_port (const reserving_port &)
 
void set_join_node_pointer (forwarding_base *join)
 
bool register_predecessor (predecessor_type &src) __TBB_override
 Add a predecessor. More...
 
bool remove_predecessor (predecessor_type &src) __TBB_override
 Remove a predecessor. More...
 
bool reserve (T &v)
 Reserve an item from the port. More...
 
void release ()
 Release the port. More...
 
void consume ()
 Complete use of the port. More...
 
void reset_receiver (reset_flags f) __TBB_override
 

Protected Member Functions

tasktry_put_task (const T &) __TBB_override
 
graph & graph_reference () const __TBB_override
 

Private Types

enum  op_type {
  reg_pred , rem_pred , res_item , rel_res ,
  con_res
}
 
typedef reserving_port< T > class_type
 
typedef internal::aggregating_functor< class_type, reserving_port_operationhandler_type
 

Private Member Functions

void handle_operations (reserving_port_operation *op_list)
 

Private Attributes

aggregator< handler_type, reserving_port_operationmy_aggregator
 
forwarding_basemy_join
 
reservable_predecessor_cache< T, null_mutex > my_predecessors
 
bool reserved
 

Friends

class internal::aggregating_functor< class_type, reserving_port_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
 

Detailed Description

template<typename T>
class internal::reserving_port< T >

The two-phase join port.

Definition at line 209 of file _flow_graph_join_impl.h.

Member Typedef Documentation

◆ class_type

template<typename T >
typedef reserving_port<T> internal::reserving_port< T >::class_type
private

Definition at line 224 of file _flow_graph_join_impl.h.

◆ handler_type

◆ input_type

template<typename T >
typedef T internal::reserving_port< T >::input_type

Definition at line 211 of file _flow_graph_join_impl.h.

◆ predecessor_type

template<typename T >
typedef receiver<input_type>::predecessor_type internal::reserving_port< T >::predecessor_type

Definition at line 212 of file _flow_graph_join_impl.h.

Member Enumeration Documentation

◆ op_type

template<typename T >
enum internal::reserving_port::op_type
private
Enumerator
reg_pred 
rem_pred 
res_item 
rel_res 
con_res 

Definition at line 219 of file _flow_graph_join_impl.h.

220#if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
221 , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy
222#endif
223 };

Constructor & Destructor Documentation

◆ reserving_port() [1/2]

template<typename T >
internal::reserving_port< T >::reserving_port ( )
inline

Constructor.

Definition at line 329 of file _flow_graph_join_impl.h.

329 : reserved(false) {
330 my_join = NULL;
331 my_predecessors.set_owner( this );
332 my_aggregator.initialize_handler(handler_type(this));
333 }
internal::aggregating_functor< class_type, reserving_port_operation > handler_type
reservable_predecessor_cache< T, null_mutex > my_predecessors
aggregator< handler_type, reserving_port_operation > my_aggregator

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::my_join, and internal::reserving_port< T >::my_predecessors.

◆ reserving_port() [2/2]

template<typename T >
internal::reserving_port< T >::reserving_port ( const reserving_port< T > &  )
inline

Definition at line 336 of file _flow_graph_join_impl.h.

336 : receiver<T>() {
337 reserved = false;
338 my_join = NULL;
339 my_predecessors.set_owner( this );
340 my_aggregator.initialize_handler(handler_type(this));
341 }

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::my_join, internal::reserving_port< T >::my_predecessors, and internal::reserving_port< T >::reserved.

Member Function Documentation

◆ consume()

template<typename T >
void internal::reserving_port< T >::consume ( )
inline

Complete use of the port.

Definition at line 375 of file _flow_graph_join_impl.h.

375 {
376 reserving_port_operation op_data(con_res);
377 my_aggregator.execute(&op_data);
378 }

References internal::reserving_port< T >::con_res, and internal::reserving_port< T >::my_aggregator.

◆ graph_reference()

template<typename T >
graph & internal::reserving_port< T >::graph_reference ( ) const
inlineprotected

◆ handle_operations()

template<typename T >
void internal::reserving_port< T >::handle_operations ( reserving_port_operation op_list)
inlineprivate

Definition at line 248 of file _flow_graph_join_impl.h.

248 {
249 reserving_port_operation *current;
250 bool no_predecessors;
251 while(op_list) {
252 current = op_list;
253 op_list = op_list->next;
254 switch(current->type) {
255 case reg_pred:
256 no_predecessors = my_predecessors.empty();
257 my_predecessors.add(*(current->my_pred));
258 if ( no_predecessors ) {
259 (void) my_join->decrement_port_count(true); // may try to forward
260 }
261 __TBB_store_with_release(current->status, SUCCEEDED);
262 break;
263 case rem_pred:
264 my_predecessors.remove(*(current->my_pred));
266 __TBB_store_with_release(current->status, SUCCEEDED);
267 break;
268 case res_item:
269 if ( reserved ) {
270 __TBB_store_with_release(current->status, FAILED);
271 }
272 else if ( my_predecessors.try_reserve( *(current->my_arg) ) ) {
273 reserved = true;
274 __TBB_store_with_release(current->status, SUCCEEDED);
275 } else {
276 if ( my_predecessors.empty() ) {
278 }
279 __TBB_store_with_release(current->status, FAILED);
280 }
281 break;
282 case rel_res:
283 reserved = false;
284 my_predecessors.try_release( );
285 __TBB_store_with_release(current->status, SUCCEEDED);
286 break;
287 case con_res:
288 reserved = false;
289 my_predecessors.try_consume( );
290 __TBB_store_with_release(current->status, SUCCEEDED);
291 break;
292#if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
293 case add_blt_pred:
294 my_predecessors.internal_add_built_predecessor(*(current->my_pred));
295 __TBB_store_with_release(current->status, SUCCEEDED);
296 break;
297 case del_blt_pred:
298 my_predecessors.internal_delete_built_predecessor(*(current->my_pred));
299 __TBB_store_with_release(current->status, SUCCEEDED);
300 break;
301 case blt_pred_cnt:
302 current->cnt_val = my_predecessors.predecessor_count();
303 __TBB_store_with_release(current->status, SUCCEEDED);
304 break;
305 case blt_pred_cpy:
306 my_predecessors.copy_predecessors(*(current->plist));
307 __TBB_store_with_release(current->status, SUCCEEDED);
308 break;
309#endif /* TBB_DEPRECATED_FLOW_NODE_EXTRACTION */
310 }
311 }
312 }
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:713
virtual void increment_port_count()=0
virtual task * decrement_port_count(bool handle_task)=0

References tbb::internal::__TBB_store_with_release(), internal::reserving_port< T >::con_res, internal::forwarding_base::decrement_port_count(), internal::FAILED, internal::forwarding_base::increment_port_count(), internal::reserving_port< T >::reserving_port_operation::my_arg, internal::reserving_port< T >::my_join, internal::reserving_port< T >::reserving_port_operation::my_pred, internal::reserving_port< T >::my_predecessors, tbb::interface6::internal::aggregated_operation< Derived >::next, internal::reserving_port< T >::reg_pred, internal::reserving_port< T >::rel_res, internal::reserving_port< T >::rem_pred, internal::reserving_port< T >::res_item, internal::reserving_port< T >::reserved, tbb::interface6::internal::aggregated_operation< Derived >::status, internal::SUCCEEDED, internal::reserving_port< T >::reserving_port_operation::type, and void.

Here is the call graph for this function:

◆ register_predecessor()

template<typename T >
bool internal::reserving_port< T >::register_predecessor ( predecessor_type src)
inline

Add a predecessor.

Definition at line 348 of file _flow_graph_join_impl.h.

348 {
349 reserving_port_operation op_data(src, reg_pred);
350 my_aggregator.execute(&op_data);
351 return op_data.status == SUCCEEDED;
352 }

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::reg_pred, tbb::interface6::internal::aggregated_operation< Derived >::status, and internal::SUCCEEDED.

◆ release()

template<typename T >
void internal::reserving_port< T >::release ( )
inline

Release the port.

Definition at line 369 of file _flow_graph_join_impl.h.

369 {
370 reserving_port_operation op_data(rel_res);
371 my_aggregator.execute(&op_data);
372 }

References internal::reserving_port< T >::my_aggregator, and internal::reserving_port< T >::rel_res.

◆ remove_predecessor()

template<typename T >
bool internal::reserving_port< T >::remove_predecessor ( predecessor_type src)
inline

Remove a predecessor.

Definition at line 355 of file _flow_graph_join_impl.h.

355 {
356 reserving_port_operation op_data(src, rem_pred);
357 my_aggregator.execute(&op_data);
358 return op_data.status == SUCCEEDED;
359 }

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::rem_pred, tbb::interface6::internal::aggregated_operation< Derived >::status, and internal::SUCCEEDED.

◆ reserve()

template<typename T >
bool internal::reserving_port< T >::reserve ( T &  v)
inline

Reserve an item from the port.

Definition at line 362 of file _flow_graph_join_impl.h.

362 {
363 reserving_port_operation op_data(v, res_item);
364 my_aggregator.execute(&op_data);
365 return op_data.status == SUCCEEDED;
366 }

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::res_item, tbb::interface6::internal::aggregated_operation< Derived >::status, and internal::SUCCEEDED.

◆ reset_receiver()

template<typename T >
void internal::reserving_port< T >::reset_receiver ( reset_flags  f)
inline

Definition at line 410 of file _flow_graph_join_impl.h.

410 {
411 if(f & rf_clear_edges) my_predecessors.clear();
412 else
413 my_predecessors.reset();
414 reserved = false;
415 __TBB_ASSERT(!(f&rf_clear_edges) || my_predecessors.empty(), "port edges not removed");
416 }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, internal::reserving_port< T >::my_predecessors, internal::reserving_port< T >::reserved, and tbb::flow::interface11::rf_clear_edges.

◆ set_join_node_pointer()

template<typename T >
void internal::reserving_port< T >::set_join_node_pointer ( forwarding_base join)
inline

Definition at line 343 of file _flow_graph_join_impl.h.

343 {
344 my_join = join;
345 }

References internal::reserving_port< T >::my_join.

◆ try_put_task()

template<typename T >
task * internal::reserving_port< T >::try_put_task ( const T &  )
inlineprotected

Definition at line 318 of file _flow_graph_join_impl.h.

318 {
319 return NULL;
320 }

Friends And Related Function Documentation

◆ internal::aggregating_functor< class_type, reserving_port_operation >

template<typename T >
friend class internal::aggregating_functor< class_type, reserving_port_operation >
friend

Definition at line 244 of file _flow_graph_join_impl.h.

◆ internal::broadcast_cache

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

Definition at line 316 of file _flow_graph_join_impl.h.

◆ internal::round_robin_cache

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

Definition at line 317 of file _flow_graph_join_impl.h.

◆ run_and_put_task

template<typename T >
template<typename R , typename B >
friend class run_and_put_task
friend

Definition at line 315 of file _flow_graph_join_impl.h.

Member Data Documentation

◆ my_aggregator

◆ my_join

◆ my_predecessors

◆ reserved


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.