Commit 0318bad6 authored by Dmitry Panin's avatar Dmitry Panin Committed by Dave Watson

Add optional parameter pruneHook to EvictingCacheMap::set(..)

Summary:
Inside `set()` we can do pruning, but it will happen
with default pruneHook.
Adding it as an optional param makes API more convenient.
(Instead, the users of API could just call `setPruneHook(pruneHook)` before `set`,
and then `setPruneHook(nullptr)` afterwards -- but it looks too ugly)

Test Plan:
```
fbconfig -r folly/ && fbmake runtests
```
passes:
```
Summary (total time 60.11s):
PASS: 1758
FAIL: 0
SKIP: 0
FATAL: 0
TIMEOUT: 0
```

Reviewed By: njormrod@fb.com

Subscribers: trunkagent, agartrell, njormrod, folly-diffs@

FB internal diff: D1665690

Tasks: 5551091

Signature: t1:1665690:1415391406:e4d2a956f9212aed70ab518159dbb19553764ce4
parent 81e0e450
...@@ -166,11 +166,14 @@ class EvictingCacheMap : private boost::noncopyable { ...@@ -166,11 +166,14 @@ class EvictingCacheMap : private boost::noncopyable {
* If you intend to resize dynamically using this, then picking an index size * If you intend to resize dynamically using this, then picking an index size
* that works well and initializing with corresponding maxSize is the only * that works well and initializing with corresponding maxSize is the only
* reasonable option. * reasonable option.
*
* @param maxSize new maximum size of the cache map.
* @param pruneHook callback to use on eviction.
*/ */
void setMaxSize(size_t maxSize) { void setMaxSize(size_t maxSize, PruneHookCall pruneHook = nullptr) {
if (maxSize != 0 && maxSize < size()) { if (maxSize != 0 && maxSize < size()) {
// Prune the excess elements with our new constraints. // Prune the excess elements with our new constraints.
prune(std::max(size() - maxSize, clearSize_)); prune(std::max(size() - maxSize, clearSize_), pruneHook);
} }
maxSize_ = maxSize; maxSize_ = maxSize;
} }
...@@ -286,8 +289,12 @@ class EvictingCacheMap : private boost::noncopyable { ...@@ -286,8 +289,12 @@ class EvictingCacheMap : private boost::noncopyable {
* @param promote boolean flag indicating whether or not to move something * @param promote boolean flag indicating whether or not to move something
* to the front of an LRU. This only really matters if you're setting * to the front of an LRU. This only really matters if you're setting
* a value that already exists. * a value that already exists.
* @param pruneHook callback to use on eviction (if it occurs).
*/ */
void set(const TKey& key, TValue value, bool promote = true) { void set(const TKey& key,
TValue value,
bool promote = true,
PruneHookCall pruneHook = nullptr) {
auto it = findInIndex(key); auto it = findInIndex(key);
if (it != index_.end()) { if (it != index_.end()) {
it->pr.second = std::move(value); it->pr.second = std::move(value);
...@@ -302,7 +309,7 @@ class EvictingCacheMap : private boost::noncopyable { ...@@ -302,7 +309,7 @@ class EvictingCacheMap : private boost::noncopyable {
// no evictions if maxSize_ is 0 i.e. unlimited capacity // no evictions if maxSize_ is 0 i.e. unlimited capacity
if (maxSize_ > 0 && size() > maxSize_) { if (maxSize_ > 0 && size() > maxSize_) {
prune(clearSize_); prune(clearSize_, pruneHook);
} }
} }
} }
...@@ -323,8 +330,8 @@ class EvictingCacheMap : private boost::noncopyable { ...@@ -323,8 +330,8 @@ class EvictingCacheMap : private boost::noncopyable {
return index_.empty(); return index_.empty();
} }
void clear() { void clear(PruneHookCall pruneHook = nullptr) {
prune(size()); prune(size(), pruneHook);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment