6#include <userver/engine/deadline.hpp>
7#include <userver/engine/future_status.hpp>
8#include <userver/engine/impl/context_accessor.hpp>
9#include <userver/engine/impl/wait_list_fwd.hpp>
10#include <userver/utils/result_store.hpp>
12USERVER_NAMESPACE_BEGIN
14namespace engine::impl {
16class FutureStateBase :
private engine::impl::ContextAccessor {
18 bool IsReady()
const noexcept final;
22 void OnFutureCreated();
25 ContextAccessor* TryGetContextAccessor()
noexcept {
return this; }
30 FutureStateBase()
noexcept;
33 void LockResultStore();
34 void ReleaseResultStore();
38 void AppendWaiter(impl::TaskContext& context)
noexcept final;
39 void RemoveWaiter(impl::TaskContext& context)
noexcept final;
41 FastPimplWaitListLight finish_waiters_;
42 std::atomic<
bool> is_ready_;
43 std::atomic<
bool> is_result_store_locked_;
44 std::atomic<
bool> is_future_created_;
48class FutureState
final :
public FutureStateBase {
50 [[nodiscard]] T Get();
52 void SetValue(
const T& value);
53 void SetValue(T&& value);
54 void SetException(std::exception_ptr&& ex);
57 void RethrowErrorResult()
const override;
59 utils::ResultStore<T> result_store_;
63class FutureState<
void>
final :
public FutureStateBase {
68 void SetException(std::exception_ptr&& ex);
71 void RethrowErrorResult()
const override;
73 utils::ResultStore<
void> result_store_;
77T FutureState<T>::Get() {
79 return result_store_.Retrieve();
83void FutureState<T>::SetValue(
const T& value) {
85 result_store_.SetValue(value);
90void FutureState<T>::SetValue(T&& value) {
92 result_store_.SetValue(std::move(value));
97void FutureState<T>::SetException(std::exception_ptr&& ex) {
99 result_store_.SetException(std::move(ex));
100 ReleaseResultStore();
104void FutureState<T>::RethrowErrorResult()
const {
105 (
void)result_store_.Get();
108inline void FutureState<
void>::Get() {
113inline void FutureState<
void>::SetValue() {
116 ReleaseResultStore();
119inline void FutureState<
void>::SetException(std::exception_ptr&& ex) {
122 ReleaseResultStore();
125inline void FutureState<
void>::RethrowErrorResult()
const {
126 (
void)result_store_.Get();