From: Steve Chew (stechew) Date: Tue, 10 Dec 2019 22:11:14 +0000 (+0000) Subject: Merge pull request #1887 in SNORT/snort3 from ~ANTOROZC/snort3:duapalme_lru_cache... X-Git-Tag: 3.0.0-267~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2323fe5cc218943d85fe5d4c7c21be07302c7123;p=thirdparty%2Fsnort3.git Merge pull request #1887 in SNORT/snort3 from ~ANTOROZC/snort3:duapalme_lru_cache to master Squashed commit of the following: commit 34fe7d4675a47b58c4fc6f9c5d3305f59d7ef999 Author: Duane Palmer Date: Thu Nov 14 15:04:28 2019 -0600 lru_cache_shared: added find_else_insert to add user managed objects to the cache --- diff --git a/src/hash/lru_cache_shared.h b/src/hash/lru_cache_shared.h index 16bc26cfb..155bee1ab 100644 --- a/src/hash/lru_cache_shared.h +++ b/src/hash/lru_cache_shared.h @@ -73,6 +73,9 @@ public: // Same as operator[]; additionally, sets the boolean if a new entry is created. Data find_else_create(const Key& key, bool* new_data); + // Returns true if found, takes a ref to a user managed entry + bool find_else_insert(const Key& key, std::shared_ptr& data); + // Return all data from the LruCache in order (most recently used to least) std::vector > get_all_data(); @@ -264,6 +267,38 @@ find_else_create(const Key& key, bool* new_data) return data; } +template +bool LruCacheShared:: +find_else_insert(const Key& key, std::shared_ptr& data) +{ + LruMapIter map_iter; + + std::list tmp_data; + std::lock_guard cache_lock(cache_mutex); + + map_iter = map.find(key); + if (map_iter != map.end()) + { + stats.find_hits++; + list.splice(list.begin(), list, map_iter->second); // update LRU + return true; + } + + stats.find_misses++; + stats.adds++; + + // Add key/data pair to front of list. + list.emplace_front(std::make_pair(key, data)); + increase_size(); + + // Add list iterator for the new entry to map. + map[key] = list.begin(); + + prune(tmp_data); + + return false; +} + template std::vector< std::pair> > LruCacheShared::get_all_data() diff --git a/src/hash/test/lru_cache_shared_test.cc b/src/hash/test/lru_cache_shared_test.cc index 3df194b0b..3993a6cd4 100644 --- a/src/hash/test/lru_cache_shared_test.cc +++ b/src/hash/test/lru_cache_shared_test.cc @@ -144,6 +144,18 @@ TEST(lru_cache_shared, remove_test) CHECK(vec[1].first == 1 and *vec[1].second == "one"); } +TEST(lru_cache_shared, find_else_insert) +{ + std::shared_ptr data(new std::string("12345")); + LruCacheShared > lru_cache(1); + + CHECK(false == lru_cache.find_else_insert(1,data)); + CHECK(1 == lru_cache.size()); + + CHECK(true == lru_cache.find_else_insert(1,data)); + CHECK(1 == lru_cache.size()); +} + // Test statistics counters. TEST(lru_cache_shared, stats_test) {