mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-29 21:46:07 +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",
|
"PUBLIC",
|
||||||
],
|
],
|
||||||
deps = [
|
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"),
|
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