17#include <userver/dump/operations.hpp>
20#include <userver/utils/impl/wait_token_storage.hpp>
24USERVER_NAMESPACE_BEGIN
111 template <
class Class>
113 Class* obj, std::string name,
114 void (Class::*func)(
const std::shared_ptr<const T>&));
122 void Set(std::unique_ptr<const T> value_ptr);
125 template <
typename... Args>
126 void Emplace(Args&&... args);
139 virtual std::unique_ptr<const T> ReadContents(
dump::Reader& reader)
const;
143 void OnAllComponentsLoaded() final;
145 void Cleanup() final;
147 void GetAndWrite(
dump::Writer& writer) const final;
148 void ReadAndSet(
dump::Reader& reader) final;
150 rcu::Variable<
std::shared_ptr<const T>> cache_;
151 concurrent::AsyncEventChannel<const
std::shared_ptr<const T>&> event_channel_;
152 utils::impl::WaitTokenStorage wait_token_storage_;
159 cache::CacheUpdateTrait(config, context),
161 const auto initial_config = GetConfig();
170 wait_token_storage_.WaitForAllTokens();
183template <
typename Class>
185 Class* obj, std::string name,
186 void (Class::*func)(
const std::shared_ptr<const T>&)) {
196 return event_channel_;
206 auto deleter = [token = wait_token_storage_.GetToken(),
207 &cache_task_processor =
208 GetCacheTaskProcessor()](
const T* raw_ptr)
mutable {
209 std::unique_ptr<const T> ptr{raw_ptr};
220 const std::shared_ptr<const T> new_value(value_ptr.release(),
228void CachingComponentBase<T>::Set(T&& value) {
229 Emplace(std::move(value));
233template <
typename... Args>
234void CachingComponentBase<T>::Emplace(Args&&... args) {
235 Set(std::make_unique<T>(std::forward<Args>(args)...));
239void CachingComponentBase<T>::Clear() {
240 cache_.
Assign(std::make_unique<const T>());
256void CachingComponentBase<T>::ReadAndSet(
dump::Reader& reader) {
257 Set(ReadContents(reader));
262 const T& contents)
const {
263 if constexpr (dump::kIsDumpable<T>) {
264 writer.
Write(contents);
266 dump::ThrowDumpUnimplemented(
Name());
273 if constexpr (dump::kIsDumpable<T>) {
275 return std::unique_ptr<const T>{
new T(reader.
Read<T>())};
277 dump::ThrowDumpUnimplemented(
Name());
282void CachingComponentBase<T>::OnAllComponentsLoaded() {
283 AssertPeriodicUpdateStarted();
287void CachingComponentBase<T>::Cleanup() {
299 return impl::GetCachingComponentBaseSchema();