Home ⌂Doc Index ◂Up ▴
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.

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  }
reservable_predecessor_cache< T, null_mutex > my_predecessors
aggregator< handler_type, reserving_port_operation > my_aggregator
internal::aggregating_functor< class_type, reserving_port_operation > handler_type
void set_owner(successor_type *owner)

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::my_join, internal::reserving_port< T >::my_predecessors, and internal::predecessor_cache< T, M >::set_owner().

Here is the call graph for this function:

◆ 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  }
reservable_predecessor_cache< T, null_mutex > my_predecessors
aggregator< handler_type, reserving_port_operation > my_aggregator
internal::aggregating_functor< class_type, reserving_port_operation > handler_type
void set_owner(successor_type *owner)

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::my_join, internal::reserving_port< T >::my_predecessors, internal::reserving_port< T >::reserved, and internal::predecessor_cache< T, M >::set_owner().

Here is the call graph for this function:

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  }
aggregator< handler_type, reserving_port_operation > my_aggregator

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;
285  __TBB_store_with_release(current->status, SUCCEEDED);
286  break;
287  case con_res:
288  reserved = false;
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  }
reservable_predecessor_cache< T, null_mutex > my_predecessors
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:713
virtual task * decrement_port_count(bool handle_task)=0
virtual void increment_port_count()=0

References tbb::internal::__TBB_store_with_release(), internal::node_cache< T, M >::add(), internal::reserving_port< T >::con_res, internal::forwarding_base::decrement_port_count(), internal::node_cache< T, M >::empty(), 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::node_cache< T, M >::remove(), internal::reserving_port< T >::res_item, internal::reserving_port< T >::reserved, tbb::interface6::internal::aggregated_operation< Derived >::status, internal::SUCCEEDED, internal::reservable_predecessor_cache< T, M >::try_consume(), internal::reservable_predecessor_cache< T, M >::try_release(), internal::reservable_predecessor_cache< T, M >::try_reserve(), 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  }
aggregator< handler_type, reserving_port_operation > my_aggregator

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  }
aggregator< handler_type, reserving_port_operation > my_aggregator

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  }
aggregator< handler_type, reserving_port_operation > my_aggregator

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  }
aggregator< handler_type, reserving_port_operation > my_aggregator

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  {
412  else
414  reserved = false;
415  __TBB_ASSERT(!(f&rf_clear_edges) || my_predecessors.empty(), "port edges not removed");
416  }
reservable_predecessor_cache< T, null_mutex > my_predecessors
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, internal::reservable_predecessor_cache< T, M >::clear(), internal::node_cache< T, M >::empty(), internal::reserving_port< T >::my_predecessors, internal::reserving_port< T >::reserved, internal::reservable_predecessor_cache< T, M >::reset(), and tbb::flow::interface11::rf_clear_edges.

Here is the call graph for this function:

◆ 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 245 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.