17 #ifndef __TBB_concurrent_lru_cache_H 18 #define __TBB_concurrent_lru_cache_H 20 #if ! TBB_PREVIEW_CONCURRENT_LRU_CACHE 21 #error Set TBB_PREVIEW_CONCURRENT_LRU_CACHE to include concurrent_lru_cache.h 29 #if __TBB_CPP11_RVALUE_REF_PRESENT 37 namespace interface6 {
40 template <
typename key_type,
typename value_type,
typename value_functor_type = value_type (*)(key_type) >
55 map_value_type (value_type
const& a_value, ref_counter_type a_ref_counter,
typename lru_list_type::iterator a_lru_list_iterator,
bool a_is_ready)
56 : my_value(a_value), my_ref_counter(a_ref_counter), my_lru_list_iterator (a_lru_list_iterator), my_is_ready(a_is_ready)
80 : my_value_function(f),my_number_of_lru_history_items(number_of_lru_history_items)
103 #if !__TBB_CPP11_RVALUE_REF_PRESENT 106 typename map_storage_type::reference my_map_record_ref;
107 handle_move_t(
concurrent_lru_cache & cache_ref,
typename map_storage_type::reference value_ref):my_cache_ref(cache_ref),my_map_record_ref(value_ref) {};
116 operator bool()
const {
117 return (my_cache_pointer && my_map_record_ptr);
119 #if __TBB_CPP11_RVALUE_REF_PRESENT 122 __TBB_ASSERT((src.my_cache_pointer && src.my_map_record_ptr) || (!src.my_cache_pointer && !src.my_map_record_ptr),
"invalid state of moving object?");
123 src.my_cache_pointer = NULL;
124 src.my_map_record_ptr = NULL;
127 __TBB_ASSERT((src.my_cache_pointer && src.my_map_record_ptr) || (!src.my_cache_pointer && !src.my_map_record_ptr),
"invalid state of moving object?");
128 if (my_cache_pointer) {
131 my_cache_pointer = src.my_cache_pointer;
132 my_map_record_ptr = src.my_map_record_ptr;
133 src.my_cache_pointer = NULL;
134 src.my_map_record_ptr = NULL;
138 handle_object(handle_move_t m) : my_cache_pointer(&m.my_cache_ref), my_map_record_ptr(&m.my_map_record_ref) {}
140 if (my_cache_pointer) {
143 my_cache_pointer = &m.my_cache_ref;
144 my_map_record_ptr = &m.my_map_record_ref;
147 operator handle_move_t(){
150 #endif // __TBB_CPP11_RVALUE_REF_PRESENT 152 __TBB_ASSERT(my_cache_pointer,
"get value from already moved object?");
153 __TBB_ASSERT(my_map_record_ptr,
"get value from an invalid or already moved object?");
154 return my_map_record_ptr->second.my_value;
157 if (my_cache_pointer){
162 #if __TBB_CPP11_RVALUE_REF_PRESENT 178 return handle_move_t(*cache_pointer, *map_record_ptr);
180 #endif // __TBB_CPP11_RVALUE_REF_PRESENT 199 if (my_operation_type==op_retive){
212 my_result_map_record_pointer = & container.
retrieve_serial(my_key,my_is_new_value_needed);
214 typename map_storage_type::reference
result(){
return * my_result_map_record_pointer; }
230 op_list=op_list->
next;
236 typename map_storage_type::reference
retrieve_serial(key_type k,
bool& is_new_value_needed){
237 typename map_storage_type::iterator it = my_map_storage.find(k);
238 if (it == my_map_storage.end()){
239 it = my_map_storage.insert(it,std::make_pair(k,
map_value_type(value_type(),0,my_lru_list.end(),
false)));
240 is_new_value_needed =
true;
242 typename lru_list_type::iterator list_it = it->second.my_lru_list_iterator;
243 if (list_it!=my_lru_list.end()) {
244 __TBB_ASSERT(!it->second.my_ref_counter,
"item to be evicted should not have a live references");
247 my_lru_list.erase(list_it);
248 it->second.my_lru_list_iterator= my_lru_list.end();
251 ++(it->second.my_ref_counter);
256 typename map_storage_type::iterator it = my_map_storage.find(map_record_ref.first);
257 __TBB_ASSERT(it!=my_map_storage.end(),
"cache should not return past-end iterators to outer world");
258 __TBB_ASSERT(&(*it) == &map_record_ref,
"dangling reference has been returned to outside world? data race ?");
259 __TBB_ASSERT( my_lru_list.end()== std::find(my_lru_list.begin(),my_lru_list.end(),it),
260 "object in use should not be in list of unused objects ");
261 if (! --(it->second.my_ref_counter)){
266 for (
size_t i=0; i<number_of_elements_to_evict; ++i){
267 typename map_storage_type::iterator it_to_evict = my_lru_list.back();
268 __TBB_ASSERT(!it_to_evict->second.my_ref_counter,
"item to be evicted should not have a live references");
269 my_lru_list.pop_back();
270 my_map_storage.erase(it_to_evict);
273 my_lru_list.push_front(it);
274 it->second.my_lru_list_iterator = my_lru_list.begin();
283 #endif //__TBB_concurrent_lru_cache_H std::list< typename map_storage_type::iterator > lru_list_type
tbb::internal::aggregator< aggregator_function_type, aggregated_operation_type > aggregator_type
e_op_type my_operation_type
friend handle_object && move(handle_object &h)
map_storage_type my_map_storage
handle_object(handle_object &&src)
void spin_wait_while_eq(const volatile T &location, U value)
Spin WHILE the value of the variable is equal to a given value.
std::size_t const my_number_of_lru_history_items
concurrent_lru_cache * my_cache_pointer
tbb::internal::aggregating_functor< self_type, aggregated_operation_type > aggregator_function_type
aggregator_operation aggregated_operation_type
void handle_operations(aggregator_operation *op_list)
void cast_and_handle(self_type &container)
uintptr_t status
Zero value means "wait" status, all other values are "user" specified values and are defined into the...
aggregator_operation(e_op_type operation_type)
void operator=(const no_assign &)
lru_list_type my_lru_list
bool is_new_value_needed()
void initialize_handler(handler_type h)
map_storage_type::reference my_map_record_ref
handle_object(concurrent_lru_cache &cache_ref, typename map_storage_type::reference value_ref)
void itt_store_word_with_release(tbb::atomic< T > &dst, U src)
map_storage_type::pointer my_map_record_ptr
map_value_type(value_type const &a_value, ref_counter_type a_ref_counter, typename lru_list_type::iterator a_lru_list_iterator, bool a_is_ready)
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
handle_object operator[](key_type k)
void handle(self_type &container)
handle_object & operator=(handle_object &&src)
bool my_is_new_value_needed
aggregator_type my_aggregator
void move(tbb_thread &t1, tbb_thread &t2)
ref_counter_type my_ref_counter
aggregated_operation base class
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle * key
void __TBB_store_with_release(volatile T &location, V value)
retrieve_aggregator_operation(key_type key)
std::map< key_type, map_value_type > map_storage_type
map_storage_type::reference retrieve_serial(key_type k, bool &is_new_value_needed)
value_functor_type value_function_type
signal_end_of_usage_aggregator_operation(typename map_storage_type::reference map_record_ref)
concurrent_lru_cache(value_function_type f, std::size_t number_of_lru_history_items)
void execute(operation_type *op)
void signal_end_of_usage_serial(typename map_storage_type::reference map_record_ref)
lru_list_type::iterator my_lru_list_iterator
map_storage_type::pointer my_result_map_record_pointer
Base class for types that should not be assigned.
concurrent_lru_cache self_type
std::size_t ref_counter_type
void signal_end_of_usage(typename map_storage_type::reference value_ref)
value_function_type my_value_function
void handle(self_type &container)
map_storage_type::reference result()
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 ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function h