Home ⌂Doc Index ◂Up ▴
Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type > Class Template Reference

#include <concurrent_lru_cache.h>

Inheritance diagram for tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >:
Collaboration diagram for tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >:

Classes

struct  aggregator_operation
 
class  handle_object
 
struct  map_value_type
 
struct  retrieve_aggregator_operation
 
struct  signal_end_of_usage_aggregator_operation
 

Public Types

typedef handle_object handle
 

Public Member Functions

 concurrent_lru_cache (value_function_type f, std::size_t number_of_lru_history_items)
 
handle_object operator[] (key_type k)
 

Private Types

typedef concurrent_lru_cache self_type
 
typedef value_functor_type value_function_type
 
typedef std::size_t ref_counter_type
 
typedef std::map< key_type, map_value_typemap_storage_type
 
typedef std::list< typename map_storage_type::iterator > lru_list_type
 
typedef aggregator_operation aggregated_operation_type
 
typedef tbb::internal::aggregating_functor< self_type, aggregated_operation_typeaggregator_function_type
 
typedef tbb::internal::aggregator< aggregator_function_type, aggregated_operation_typeaggregator_type
 

Private Member Functions

void signal_end_of_usage (typename map_storage_type::reference value_ref)
 
void handle_operations (aggregator_operation *op_list)
 
map_storage_type::reference retrieve_serial (key_type k, bool &is_new_value_needed)
 
void signal_end_of_usage_serial (typename map_storage_type::reference map_record_ref)
 
- Private Member Functions inherited from tbb::internal::no_assign
void operator= (const no_assign &)=delete
 
 no_assign (const no_assign &)=default
 
 no_assign ()=default
 

Private Attributes

value_function_type my_value_function
 
std::size_t const my_number_of_lru_history_items
 
map_storage_type my_map_storage
 
lru_list_type my_lru_list
 
aggregator_type my_aggregator
 

Friends

class tbb::internal::aggregating_functor< self_type, aggregated_operation_type >
 

Detailed Description

template<typename key_type, typename value_type, typename value_functor_type = value_type (*)(key_type)>
class tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >

Definition at line 44 of file concurrent_lru_cache.h.

Member Typedef Documentation

◆ aggregated_operation_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef aggregator_operation tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::aggregated_operation_type
private

Definition at line 65 of file concurrent_lru_cache.h.

◆ aggregator_function_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef tbb::internal::aggregating_functor<self_type,aggregated_operation_type> tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::aggregator_function_type
private

Definition at line 67 of file concurrent_lru_cache.h.

◆ aggregator_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef tbb::internal::aggregator<aggregator_function_type, aggregated_operation_type> tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::aggregator_type
private

Definition at line 69 of file concurrent_lru_cache.h.

◆ handle

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef handle_object tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::handle

Definition at line 79 of file concurrent_lru_cache.h.

◆ lru_list_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef std::list<typename map_storage_type::iterator> tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::lru_list_type
private

Definition at line 51 of file concurrent_lru_cache.h.

◆ map_storage_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef std::map<key_type, map_value_type> tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::map_storage_type
private

Definition at line 49 of file concurrent_lru_cache.h.

◆ ref_counter_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef std::size_t tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::ref_counter_type
private

Definition at line 48 of file concurrent_lru_cache.h.

◆ self_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef concurrent_lru_cache tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::self_type
private

Definition at line 46 of file concurrent_lru_cache.h.

◆ value_function_type

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
typedef value_functor_type tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::value_function_type
private

Definition at line 47 of file concurrent_lru_cache.h.

Constructor & Destructor Documentation

◆ concurrent_lru_cache()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::concurrent_lru_cache ( value_function_type  f,
std::size_t  number_of_lru_history_items 
)
inline

Definition at line 82 of file concurrent_lru_cache.h.

83  : my_value_function(f),my_number_of_lru_history_items(number_of_lru_history_items)
84  {
86  }
tbb::internal::aggregating_functor< self_type, aggregated_operation_type > aggregator_function_type

References tbb::interface6::internal::aggregator< handler_type, operation_type >::initialize_handler(), and tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_aggregator.

Here is the call graph for this function:

Member Function Documentation

◆ handle_operations()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
void tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::handle_operations ( aggregator_operation op_list)
inlineprivate

Definition at line 229 of file concurrent_lru_cache.h.

229  {
230  while(op_list){
231  op_list->cast_and_handle(*this);
232  aggregator_operation* tmp = op_list;
233  op_list=op_list->next;
234  tbb::internal::itt_store_word_with_release(tmp->status, uintptr_t(1));
235  }
236  }
void itt_store_word_with_release(tbb::atomic< T > &dst, U src)

References tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::aggregator_operation::cast_and_handle(), tbb::internal::itt_store_word_with_release(), tbb::interface6::internal::aggregated_operation< Derived >::next, and tbb::interface6::internal::aggregated_operation< Derived >::status.

Here is the call graph for this function:

◆ operator[]()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
handle_object tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::operator[] ( key_type  k)
inline

Definition at line 88 of file concurrent_lru_cache.h.

88  {
89  retrieve_aggregator_operation op(k);
91  if (op.is_new_value_needed()){
92  op.result().second.my_value = my_value_function(k);
93  __TBB_store_with_release(op.result().second.my_is_ready, true);
94  }else{
95  tbb::internal::spin_wait_while_eq(op.result().second.my_is_ready,false);
96  }
97  return handle_object(*this,op.result());
98  }
void spin_wait_while_eq(const volatile T &location, U value)
Spin WHILE the value of the variable is equal to a given value.
Definition: tbb_machine.h:391
void __TBB_store_with_release(volatile T &location, V value)
Definition: tbb_machine.h:713

References tbb::internal::__TBB_store_with_release(), tbb::interface6::internal::aggregator< handler_type, operation_type >::execute(), tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::retrieve_aggregator_operation::is_new_value_needed(), tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_aggregator, tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_value_function, tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::retrieve_aggregator_operation::result(), and tbb::internal::spin_wait_while_eq().

Here is the call graph for this function:

◆ retrieve_serial()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
map_storage_type::reference tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::retrieve_serial ( key_type  k,
bool &  is_new_value_needed 
)
inlineprivate

Definition at line 239 of file concurrent_lru_cache.h.

239  {
240  typename map_storage_type::iterator it = my_map_storage.find(k);
241  if (it == my_map_storage.end()){
242  it = my_map_storage.insert(it,std::make_pair(k,map_value_type(value_type(),0,my_lru_list.end(),false)));
243  is_new_value_needed = true;
244  }else {
245  typename lru_list_type::iterator list_it = it->second.my_lru_list_iterator;
246  if (list_it!=my_lru_list.end()) {
247  __TBB_ASSERT(!it->second.my_ref_counter,"item to be evicted should not have a live references");
248  //item is going to be used. Therefore it is not a subject for eviction
249  //so - remove it from LRU history.
250  my_lru_list.erase(list_it);
251  it->second.my_lru_list_iterator= my_lru_list.end();
252  }
253  }
254  ++(it->second.my_ref_counter);
255  return *it;
256  }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_lru_list, and tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_map_storage.

Referenced by tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::retrieve_aggregator_operation::handle().

Here is the caller graph for this function:

◆ signal_end_of_usage()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
void tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::signal_end_of_usage ( typename map_storage_type::reference  value_ref)
inlineprivate

Definition at line 100 of file concurrent_lru_cache.h.

100  {
101  signal_end_of_usage_aggregator_operation op(value_ref);
102  my_aggregator.execute(&op);
103  }

References tbb::interface6::internal::aggregator< handler_type, operation_type >::execute(), and tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_aggregator.

Referenced by tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::handle_object::operator=(), and tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::handle_object::~handle_object().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ signal_end_of_usage_serial()

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
void tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::signal_end_of_usage_serial ( typename map_storage_type::reference  map_record_ref)
inlineprivate

Definition at line 258 of file concurrent_lru_cache.h.

258  {
259  typename map_storage_type::iterator it = my_map_storage.find(map_record_ref.first);
260  __TBB_ASSERT(it!=my_map_storage.end(),"cache should not return past-end iterators to outer world");
261  __TBB_ASSERT(&(*it) == &map_record_ref,"dangling reference has been returned to outside world? data race ?");
262  __TBB_ASSERT( my_lru_list.end()== std::find(my_lru_list.begin(),my_lru_list.end(),it),
263  "object in use should not be in list of unused objects ");
264  if (! --(it->second.my_ref_counter)){
265  //it was the last reference so put it to the LRU history
267  //evict items in order to get a space
268  size_t number_of_elements_to_evict = 1 + my_lru_list.size() - my_number_of_lru_history_items;
269  for (size_t i=0; i<number_of_elements_to_evict; ++i){
270  typename map_storage_type::iterator it_to_evict = my_lru_list.back();
271  __TBB_ASSERT(!it_to_evict->second.my_ref_counter,"item to be evicted should not have a live references");
272  my_lru_list.pop_back();
273  my_map_storage.erase(it_to_evict);
274  }
275  }
276  my_lru_list.push_front(it);
277  it->second.my_lru_list_iterator = my_lru_list.begin();
278  }
279  }
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_lru_list, tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_map_storage, and tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_number_of_lru_history_items.

Referenced by tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::signal_end_of_usage_aggregator_operation::handle().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ tbb::internal::aggregating_functor< self_type, aggregated_operation_type >

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
friend class tbb::internal::aggregating_functor< self_type, aggregated_operation_type >
friend

Definition at line 68 of file concurrent_lru_cache.h.

Member Data Documentation

◆ my_aggregator

◆ my_lru_list

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
lru_list_type tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_lru_list
private

◆ my_map_storage

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
map_storage_type tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_map_storage
private

◆ my_number_of_lru_history_items

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
std::size_t const tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_number_of_lru_history_items
private

◆ my_value_function

template<typename key_type , typename value_type , typename value_functor_type = value_type (*)(key_type)>
value_function_type tbb::interface6::concurrent_lru_cache< key_type, value_type, value_functor_type >::my_value_function
private

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.