mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-01-12 22:50:10 +08:00
Fabric: Introducing SimpleThreadSafeCache
Summary: SimpleThreadSafeCache is a simple thread-safe LRU cache; it's a generalized version of ParagraphMeasurementCache. Reviewed By: mdvacca Differential Revision: D14296516 fbshipit-source-id: 2b40ac1979ada12551848ece3642b2d99e369672
This commit is contained in:
committed by
Facebook Github Bot
parent
70447775f7
commit
15ee4545f4
@@ -26,6 +26,10 @@ rn_xplat_cxx_library(
|
||||
"PUBLIC",
|
||||
],
|
||||
deps = [
|
||||
"fbsource//xplat/folly:evicting_cache_map",
|
||||
"fbsource//xplat/folly:headers_only",
|
||||
"fbsource//xplat/folly:memory",
|
||||
"fbsource//xplat/folly:molly",
|
||||
react_native_xplat_target("better:better"),
|
||||
],
|
||||
)
|
||||
|
||||
74
ReactCommon/utils/SimpleThreadSafeCache.h
Normal file
74
ReactCommon/utils/SimpleThreadSafeCache.h
Normal file
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include <better/optional.h>
|
||||
#include <folly/container/EvictingCacheMap.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
/*
|
||||
* Simple thread-safe LRU cache.
|
||||
*/
|
||||
template<typename KeyT, typename ValueT, int maxSize>
|
||||
class SimpleThreadSafeCache {
|
||||
public:
|
||||
SimpleThreadSafeCache() : map_{maxSize} {}
|
||||
|
||||
/*
|
||||
* Returns a value from the map with a given key.
|
||||
* If the value wasn't found in the cache, constructs the value using given
|
||||
* generator function, stores it inside a cache and returns it.
|
||||
* Can be called from any thread.
|
||||
*/
|
||||
ValueT get(const KeyT &key, std::function<ValueT(const KeyT &key)> generator) const {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
auto iterator = map_.find(key);
|
||||
if (iterator == map_.end()) {
|
||||
auto value = generator(key);
|
||||
map_.set(key, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
return iterator->second;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a value from the map with a given key.
|
||||
* If the value wasn't found in the cache, returns empty optional.
|
||||
* Can be called from any thread.
|
||||
*/
|
||||
better::optional<ValueT> get(const KeyT &key) const {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
auto iterator = map_.find(key);
|
||||
if (iterator == map_.end()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return iterator->second;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets a key-value pair in the LRU cache.
|
||||
* Can be called from any thread.
|
||||
*/
|
||||
void set(const KeyT &key, const ValueT &value) const {
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
map_.set(std::move(key), std::move(value));
|
||||
}
|
||||
|
||||
private:
|
||||
mutable folly::EvictingCacheMap<KeyT, ValueT> map_;
|
||||
mutable std::mutex mutex_;
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
} // namespace facebook
|
||||
Reference in New Issue
Block a user