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 () __TBB_override
 

Private Types

enum  op_type {
  reg_pred, rem_pred, res_item, rel_res,
  con_res
}
 
enum  op_stat { WAIT =0, SUCCEEDED, FAILED }
 
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 225 of file _flow_graph_join_impl.h.

◆ handler_type

template<typename T >
typedef internal::aggregating_functor<class_type, reserving_port_operation> internal::reserving_port< T >::handler_type
private

Definition at line 245 of file _flow_graph_join_impl.h.

◆ 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_stat

◆ 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 330 of file _flow_graph_join_impl.h.

330  : reserved(false) {
331  my_join = NULL;
332  my_predecessors.set_owner( this );
333  my_aggregator.initialize_handler(handler_type(this));
334  }
void set_owner(successor_type *owner)
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

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 337 of file _flow_graph_join_impl.h.

337  : receiver<T>() {
338  reserved = false;
339  my_join = NULL;
340  my_predecessors.set_owner( this );
341  my_aggregator.initialize_handler(handler_type(this));
342  }
void set_owner(successor_type *owner)
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

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 376 of file _flow_graph_join_impl.h.

376  {
377  reserving_port_operation op_data(con_res);
378  my_aggregator.execute(&op_data);
379  }
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 ( )
inlineprotected

◆ handle_operations()

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

Definition at line 249 of file _flow_graph_join_impl.h.

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

349  {
350  reserving_port_operation op_data(src, reg_pred);
351  my_aggregator.execute(&op_data);
352  return op_data.status == SUCCEEDED;
353  }
aggregator< handler_type, reserving_port_operation > my_aggregator

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::reg_pred, and internal::reserving_port< T >::SUCCEEDED.

◆ release()

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

Release the port.

Definition at line 370 of file _flow_graph_join_impl.h.

370  {
371  reserving_port_operation op_data(rel_res);
372  my_aggregator.execute(&op_data);
373  }
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 356 of file _flow_graph_join_impl.h.

356  {
357  reserving_port_operation op_data(src, rem_pred);
358  my_aggregator.execute(&op_data);
359  return op_data.status == SUCCEEDED;
360  }
aggregator< handler_type, reserving_port_operation > my_aggregator

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::rem_pred, and internal::reserving_port< T >::SUCCEEDED.

◆ reserve()

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

Reserve an item from the port.

Definition at line 363 of file _flow_graph_join_impl.h.

363  {
364  reserving_port_operation op_data(v, res_item);
365  my_aggregator.execute(&op_data);
366  return op_data.status == SUCCEEDED;
367  }
aggregator< handler_type, reserving_port_operation > my_aggregator

References internal::reserving_port< T >::my_aggregator, internal::reserving_port< T >::res_item, and internal::reserving_port< T >::SUCCEEDED.

◆ reset_receiver()

◆ set_join_node_pointer()

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

Definition at line 344 of file _flow_graph_join_impl.h.

344  {
345  my_join = join;
346  }

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 319 of file _flow_graph_join_impl.h.

319  {
320  return NULL;
321  }

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 246 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 317 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 318 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 316 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-2019 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.