stdexec: update to latest commit
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I36aae702521ba1e9ab22e607ae18b7051a59feca
diff --git a/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
index 84c3387..31148a4 100644
--- a/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
@@ -104,13 +104,11 @@
template <class _Sender, class _CPO>
concept __has_completion_scheduler =
- __callable<get_completion_scheduler_t<_CPO>,
- __call_result_t<get_env_t, const _Sender&>>;
+ __callable<get_completion_scheduler_t<_CPO>, env_of_t<const _Sender&>>;
template <class _Sender, class _CPO>
using __completion_scheduler_for =
- __call_result_t<get_completion_scheduler_t<_CPO>,
- __call_result_t<get_env_t, const _Sender&>>;
+ __call_result_t<get_completion_scheduler_t<_CPO>, env_of_t<const _Sender&>>;
//////////////////////////////////////////////////////////////////////////////////////////////////
namespace __get_completion_signatures
diff --git a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
index 29ef238..c32f3af 100644
--- a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
+++ b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
@@ -97,10 +97,10 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completion_signatures<_Env>
requires true;
diff --git a/include/sdbusplus/async/stdexec/commit.info b/include/sdbusplus/async/stdexec/commit.info
index 68f5a47..61a5c9f 100644
--- a/include/sdbusplus/async/stdexec/commit.info
+++ b/include/sdbusplus/async/stdexec/commit.info
@@ -1 +1 @@
-865e0370f92655691cf1e9a5abcdc2c4dab2ccb4
+a64298d0b51b7e7c6c6dacf3f43d56c6475581f7
diff --git a/include/sdbusplus/async/stdexec/concepts.hpp b/include/sdbusplus/async/stdexec/concepts.hpp
index c11d132..b64a95a 100644
--- a/include/sdbusplus/async/stdexec/concepts.hpp
+++ b/include/sdbusplus/async/stdexec/concepts.hpp
@@ -244,6 +244,13 @@
#endif
template <class _Ty>
+concept __nothrow_move_constructible = __nothrow_constructible_from<_Ty, _Ty>;
+
+template <class _Ty>
+concept __nothrow_copy_constructible =
+ __nothrow_constructible_from<_Ty, const _Ty&>;
+
+template <class _Ty>
concept __decay_copyable = constructible_from<__decay_t<_Ty>, _Ty>;
template <class _Ty>
diff --git a/include/sdbusplus/async/stdexec/execution.hpp b/include/sdbusplus/async/stdexec/execution.hpp
index 0c6d023..267deea 100644
--- a/include/sdbusplus/async/stdexec/execution.hpp
+++ b/include/sdbusplus/async/stdexec/execution.hpp
@@ -41,6 +41,7 @@
#pragma diagnostic push
#pragma diag_suppress 1302
#pragma diag_suppress 497
+#pragma diag_suppress type_qualifiers_ignored_on_reference
#endif
#ifdef STDEXEC_ENABLE_R5_DEPRECATIONS
@@ -320,6 +321,133 @@
using __id = empty_env;
};
+template <class _Tag>
+struct __deleted
+{};
+
+template <__nothrow_move_constructible _Fun>
+struct __env_fn
+{
+ using __t = __env_fn;
+ using __id = __env_fn;
+ STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
+
+ template <class _Tag>
+ requires __callable<const _Fun&, _Tag>
+ friend auto tag_invoke(_Tag, const __env_fn& __self) //
+ noexcept(__nothrow_callable<const _Fun&, _Tag>)
+ -> __call_result_t<const _Fun&, _Tag>
+ {
+ return __self.__fun_(_Tag());
+ }
+};
+
+template <class _Fun>
+__env_fn(_Fun) -> __env_fn<_Fun>;
+
+template <__nothrow_move_constructible _Env>
+struct __env_fwd
+{
+ using __t = __env_fwd;
+ using __id = __env_fwd;
+ STDEXEC_NO_UNIQUE_ADDRESS _Env __env_;
+
+ template <__forwarding_query _Tag>
+ requires __callable<_Tag, const _Env&>
+ friend auto tag_invoke(_Tag, const __env_fwd& __self) //
+ noexcept(__nothrow_callable<_Tag, const _Env&>)
+ -> __call_result_t<_Tag, const _Env&>
+ {
+ return _Tag()(__self.__env_);
+ }
+};
+
+template <__nothrow_move_constructible _Env,
+ __nothrow_move_constructible _Base = empty_env>
+struct __env_join : __env_fwd<_Base>
+{
+ using __t = __env_join;
+ using __id = __env_join;
+ STDEXEC_NO_UNIQUE_ADDRESS _Env __env_;
+
+ const _Base& base() const noexcept
+ {
+ return this->__env_fwd<_Base>::__env_;
+ }
+
+ template <class _Tag>
+ requires __callable<_Tag, const _Env&>
+ friend auto tag_invoke(_Tag, const __env_join& __self) //
+ noexcept(__nothrow_callable<_Tag, const _Env&>)
+ -> __call_result_t<_Tag, const _Env&>
+ {
+ return _Tag()(__self.__env_);
+ }
+};
+
+template <class _Tag, class _Base>
+struct __env_join<__env_fn<__deleted<_Tag>>, _Base> : __env_fwd<_Base>
+{
+ using __t = __env_join;
+ using __id = __env_join;
+ STDEXEC_NO_UNIQUE_ADDRESS __env_fn<__deleted<_Tag>> __env_;
+
+ friend void tag_invoke(_Tag, const __env_join&) noexcept = delete;
+};
+
+template <class _Env>
+_Env __join_env(_Env&& __env) noexcept
+{
+ return (_Env&&)__env;
+}
+
+template <class _Env, class _Base>
+__env_join<_Env, _Base> __join_env(_Env&& __env, _Base&& __base) noexcept
+{
+ static_assert(!same_as<__decay_t<_Env>, no_env>);
+ return {{{(_Base&&)__base}}, (_Env&&)__env};
+}
+
+template <class _Base>
+_Base __join_env(empty_env, _Base&& __base) noexcept
+{
+ return (_Base&&)__base;
+}
+
+template <class _Env>
+_Env __join_env(_Env&& __env, empty_env) noexcept
+{
+ static_assert(!same_as<__decay_t<_Env>, no_env>);
+ return (_Env&&)__env;
+}
+
+inline empty_env __join_env(empty_env, empty_env) noexcept
+{
+ return {};
+}
+
+template <class _Env>
+no_env __join_env(_Env&&, no_env) noexcept
+ requires true
+{
+ static_assert(!same_as<__decay_t<_Env>, no_env>);
+ return {};
+}
+
+template <class _Env0, class _Env1, class _Env2, class... _Envs>
+auto __join_env(_Env0&& __env0, _Env1&& __env1, _Env2&& __env2,
+ _Envs&&... __envs) noexcept
+{
+ return __env::__join_env(
+ (_Env0&&)__env0,
+ __env::__join_env(
+ (_Env1&&)__env1,
+ __env::__join_env((_Env2&&)__env2, (_Envs&&)__envs...)));
+}
+
+template <class... _Envs>
+using __env_join_t = decltype(__env::__join_env(__declval<_Envs>()...));
+
// To be kept in sync with the promise type used in __connect_awaitable
template <class _Env>
struct __env_promise
@@ -343,118 +471,39 @@
-> const _Env&;
};
-template <__class _Tag, class _Value = __none_such>
- requires copy_constructible<std::unwrap_reference_t<_Value>>
-struct __with
+template <class _Tag, __nothrow_move_constructible _Value>
+constexpr auto __with_(_Tag, _Value __val) noexcept
{
- using __tag_t = _Tag;
- using __value_t = _Value;
- _Value __value_;
-
- struct __t
- {
- using __id = __with;
- using __val_or_ref_t = std::unwrap_reference_t<_Value>;
-
- STDEXEC_NO_UNIQUE_ADDRESS __val_or_ref_t __value_;
-
- __t(__with&& __w) : __value_(((__with&&)__w).__value_) {}
-
- template <same_as<_Tag> _Tp, class... _Ts>
- friend __val_or_ref_t tag_invoke(_Tp, const __t& __self, _Ts&&...) //
- noexcept(std::is_nothrow_copy_constructible_v<__val_or_ref_t>)
- {
- return __self.__value_;
- }
- };
-};
-
-template <class _Tag>
-struct __with<_Tag, __none_such>
-{
- using __tag_t = _Tag;
- using __value_t = __none_such;
-
- struct __t
- {
- using __id = __with;
-
- __t(__with) {}
-
- template <same_as<_Tag> _Tp, class... _Ts>
- friend void tag_invoke(_Tp, const __t&, _Ts&&...) = delete;
- };
-};
-
-template <__class _Tag, class _Value>
-__with<_Tag, __decay_t<_Value>> __with_(_Tag, _Value&& __val)
-{
- return {(_Value&&)__val};
+ return __env_fn{
+ [__val = std::move(__val)](_Tag) noexcept(
+ __nothrow_copy_constructible<_Value>) { return __val; }};
}
-template <__class _Tag>
-__with<_Tag> __with_(_Tag)
+template <class _Tag>
+__env_fn<__deleted<_Tag>> __with_(_Tag) noexcept
{
return {};
}
-template <class _BaseEnvId, class... _WithIds>
-struct __env
-{
- using _BaseEnv = stdexec::__t<_BaseEnvId>;
- template <class _WithId>
- using __tag_of = typename _WithId::__tag_t;
- template <class _Self>
- using __base_env_of = __mfront<_BaseEnv, _Self>;
+template <class... _Ts>
+using __with = decltype(__env::__with_(__declval<_Ts>()...));
- struct __t : stdexec::__t<_WithIds>...
- {
- using __id = __env;
- STDEXEC_NO_UNIQUE_ADDRESS _BaseEnv __base_env_{};
-
- // Forward the receiver queries:
- template <__forwarding_query _Tag, same_as<__t> _Self, class... _As>
- requires __none_of<_Tag, __tag_of<_WithIds>...> &&
- __callable<_Tag, const __base_env_of<_Self>&, _As...>
- friend auto tag_invoke(_Tag __tag, const _Self& __self,
- _As&&... __as) noexcept
- -> __call_result_if_t<same_as<_Self, __t>, _Tag,
- const __base_env_of<_Self>&, _As...>
- {
- return ((_Tag&&)__tag)(__self.__base_env_, (_As&&)__as...);
- }
- };
-};
-template <class _BaseEnv, class... _WithIds>
-using __env_t = __t<__env<stdexec::__id<_BaseEnv>, _WithIds...>>;
-
-// For making an evaluation environment from key/value pairs and optionally
+// For making an environment from key/value pairs and optionally
// another environment.
struct __make_env_t
{
- template <class _Tag, class _Value, class... _Tags, class... _Values>
- auto operator()(__with<_Tag, _Value> __w,
- __with<_Tags, _Values>... __ws) const
- noexcept(std::is_nothrow_move_constructible_v<_Value> &&
- (std::is_nothrow_move_constructible_v<_Values> && ...))
- -> __env_t<empty_env, __with<_Tag, _Value>,
- __with<_Tags, _Values>...>
+ template <__nothrow_move_constructible _Base,
+ __nothrow_move_constructible _Env>
+ auto operator()(_Base&& __base, _Env&& __env) const noexcept
+ -> __env_join_t<_Env, _Base>
{
- return {{std::move(__w)}, {std::move(__ws)}..., {}};
+ return stdexec::__env::__join_env((_Env&&)__env, (_Base&&)__base);
}
- template <__none_of<no_env> _BaseEnv, class... _Tags, class... _Values>
- requires __is_not_instance_of<_BaseEnv, __with>
- auto operator()(_BaseEnv&& __base_env, __with<_Tags, _Values>... __ws) const
- -> __env_t<__decay_t<_BaseEnv>, __with<_Tags, _Values>...>
+ template <__nothrow_move_constructible _Env>
+ _Env operator()(_Env&& __env) const noexcept
{
- return {{std::move(__ws)}..., (_BaseEnv&&)__base_env};
- }
-
- template <class... _Tags, class... _Values>
- no_env operator()(no_env, __with<_Tags, _Values>...) const noexcept
- {
- return {};
+ return (_Env&&)__env;
}
};
@@ -463,12 +512,12 @@
{
template <class _EnvProvider>
requires tag_invocable<get_env_t, const _EnvProvider&>
- constexpr auto operator()(const _EnvProvider& __with_env) const
- noexcept(nothrow_tag_invocable<get_env_t, const _EnvProvider&>)
- -> tag_invoke_result_t<get_env_t, const _EnvProvider&>
+ constexpr auto operator()(const _EnvProvider& __with_env) const noexcept
+ -> tag_invoke_result_t<get_env_t, const _EnvProvider&>
{
static_assert(
queryable<tag_invoke_result_t<get_env_t, const _EnvProvider&>>);
+ static_assert(nothrow_tag_invocable<get_env_t, const _EnvProvider&>);
return tag_invoke(*this, __with_env);
}
@@ -805,7 +854,7 @@
template <class _Receiver>
concept __receiver_r5_or_r7 = //
enable_receiver<_Receiver> //
- || tag_invocable<get_env_t, __cref_t<_Receiver>>;
+ || tag_invocable<get_env_t, _Receiver>;
template <class _Receiver>
concept __receiver = //
@@ -1753,7 +1802,7 @@
}
// Pass through the get_env receiver query
- friend auto tag_invoke(get_env_t, const __t& __self)
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
-> env_of_t<_Receiver>
{
return get_env(__self.__rcvr_);
@@ -1997,9 +2046,6 @@
template <class _Value>
using __expected_t =
std::variant<std::monostate, __value_or_void_t<_Value>, std::exception_ptr>;
-template <class _Promise>
-using __env_t = __minvoke<__with_default<__q<__call_result_t>, empty_env>,
- get_env_t, _Promise>;
template <class _Value>
struct __receiver_base
@@ -2060,7 +2106,8 @@
}
// Forward get_env query to the coroutine promise
- friend __env_t<_Promise&> tag_invoke(get_env_t, const __t& __self)
+ friend env_of_t<_Promise&> tag_invoke(get_env_t,
+ const __t& __self) noexcept
{
auto __continuation =
__coro::coroutine_handle<_Promise>::from_address(
@@ -2072,7 +2119,7 @@
template <class _Sender, class _Promise>
using __value_t =
- __decay_t<__single_sender_value_t<_Sender, __env_t<_Promise>>>;
+ __decay_t<__single_sender_value_t<_Sender, env_of_t<_Promise&>>>;
template <class _Sender, class _Promise>
using __receiver_t =
@@ -2140,7 +2187,7 @@
template <class _Sender, class _Promise>
concept __awaitable_sender =
- __single_typed_sender<_Sender, __env_t<_Promise>> && //
+ __single_typed_sender<_Sender, env_of_t<_Promise&>> && //
sender_to<_Sender, __receiver_t<_Sender, _Promise>> && //
requires(_Promise& __promise) {
{
@@ -2388,10 +2435,10 @@
}
// Forward all receiever queries.
- friend auto tag_invoke(get_env_t, const __t& __self)
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
-> env_of_t<_Receiver>
{
- return get_env((const _Receiver&)__self.__op_state_->__rcvr_);
+ return get_env(__self.__op_state_->__rcvr_);
}
};
};
@@ -2458,11 +2505,19 @@
using completion_signatures =
stdexec::completion_signatures<set_value_t()>;
- template <typename _Receiver>
+ template <receiver_of<completion_signatures> _Receiver>
friend __op<_Receiver> tag_invoke(connect_t, __sender, _Receiver __rcvr)
{
return {{}, (_Receiver&&)__rcvr};
}
+
+ friend auto tag_invoke(get_env_t, __sender) noexcept
+ {
+ return __env::__env_fn{
+ [](get_completion_scheduler_t<set_value_t>) noexcept {
+ return __scheduler{};
+ }};
+ }
};
friend __sender tag_invoke(schedule_t, __scheduler)
@@ -2731,7 +2786,7 @@
friend void tag_invoke(_Tag, __as_receiver&&) noexcept
{}
- friend empty_env tag_invoke(get_env_t, const __as_receiver&)
+ friend empty_env tag_invoke(get_env_t, const __as_receiver&) noexcept
{
return {};
}
@@ -2950,11 +3005,11 @@
// but 'int(type::existing_member_function)' is an error (as desired).
#define _DISPATCH_MEMBER(_TAG) \
template <class _Self, class... _Ts> \
- STDEXEC_DETAIL_CUDACC_HOST_DEVICE static auto \
- __call_##_TAG(_Self&& __self, _Ts&&... __ts) noexcept( \
- noexcept(((_Self&&)__self)._TAG((_Ts&&)__ts...))) \
- ->decltype(((_Self&&)__self)._TAG((_Ts&&)__ts...)) \
+ STDEXEC_DETAIL_CUDACC_HOST_DEVICE static auto __call_##_TAG( \
+ _Self&& __self, _Ts&&... __ts) noexcept \
+ -> decltype(((_Self&&)__self)._TAG((_Ts&&)__ts...)) \
{ \
+ static_assert(noexcept(((_Self&&)__self)._TAG((_Ts&&)__ts...))); \
return ((_Self&&)__self)._TAG((_Ts&&)__ts...); \
} /**/
#define _CALL_MEMBER(_TAG, ...) __call_##_TAG(__VA_ARGS__)
@@ -3089,17 +3144,18 @@
template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
friend auto
- tag_invoke(_GetEnv, const _Derived& __self)
- -> decltype(_CALL_MEMBER(get_env, (const _Dp&)__self))
+ tag_invoke(_GetEnv, const _Derived& __self) noexcept
+ -> decltype(_CALL_MEMBER(get_env, (const _Dp&)__self))
{
+ static_assert(noexcept(_CALL_MEMBER(get_env, __self)));
return _CALL_MEMBER(get_env, __self);
}
template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
requires _MISSING_MEMBER(_Dp, get_env)
STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
- friend auto tag_invoke(_GetEnv, const _Derived& __self)
- -> __call_result_t<get_env_t, __base_t<const _Dp&>>
+ friend auto tag_invoke(_GetEnv, const _Derived& __self) noexcept
+ -> env_of_t<__base_t<const _Dp&>>
{
return stdexec::get_env(__get_base(__self));
}
@@ -3117,47 +3173,35 @@
using receiver_adaptor =
typename __adaptors::receiver_adaptor<_Derived, _Base>::__t;
-template <class _Receiver, class... _As>
-concept __receiver_of_maybe_void =
- (same_as<__types<void>, __types<_As...>> &&
- receiver_of<_Receiver, completion_signatures<set_value_t()>>) ||
- receiver_of<_Receiver, completion_signatures<set_value_t(_As...)>>;
-
template <class _Receiver, class _Fun, class... _As>
-concept __receiver_of_invoke_result =
- __receiver_of_maybe_void<_Receiver, std::invoke_result_t<_Fun, _As...>>;
+concept __receiver_of_invoke_result = //
+ receiver_of<_Receiver, completion_signatures<
+ __minvoke<__remove<void, __qf<set_value_t>>,
+ std::invoke_result_t<_Fun, _As...>>>>;
-template <class _Receiver, class _Fun, class... _As>
-void __set_value_invoke_(_Receiver&& __rcvr, _Fun&& __fun, _As&&... __as) //
- noexcept(__nothrow_invocable<_Fun, _As...>)
-{
- if constexpr (same_as<void, std::invoke_result_t<_Fun, _As...>>)
- {
- std::invoke((_Fun&&)__fun, (_As&&)__as...);
- set_value((_Receiver&&)__rcvr);
- }
- else
- {
- set_value((_Receiver&&)__rcvr,
- std::invoke((_Fun&&)__fun, (_As&&)__as...));
- }
-}
-
-template <class _Receiver, class _Fun, class... _As>
+template <bool _CanThrow = false, class _Receiver, class _Fun, class... _As>
void __set_value_invoke(_Receiver&& __rcvr, _Fun&& __fun,
- _As&&... __as) noexcept
+ _As&&... __as) noexcept(!_CanThrow)
{
- if constexpr (__nothrow_invocable<_Fun, _As...>)
+ if constexpr (_CanThrow || __nothrow_invocable<_Fun, _As...>)
{
- stdexec::__set_value_invoke_((_Receiver&&)__rcvr, (_Fun&&)__fun,
- (_As&&)__as...);
+ if constexpr (same_as<void, std::invoke_result_t<_Fun, _As...>>)
+ {
+ std::invoke((_Fun&&)__fun, (_As&&)__as...);
+ set_value((_Receiver&&)__rcvr);
+ }
+ else
+ {
+ set_value((_Receiver&&)__rcvr,
+ std::invoke((_Fun&&)__fun, (_As&&)__as...));
+ }
}
else
{
try
{
- stdexec::__set_value_invoke_((_Receiver&&)__rcvr, (_Fun&&)__fun,
- (_As&&)__as...);
+ stdexec::__set_value_invoke<true>((_Receiver&&)__rcvr,
+ (_Fun&&)__fun, (_As&&)__as...);
}
catch (...)
{
@@ -3248,8 +3292,8 @@
__tag((_Receiver&&)__self.__op_->__rcvr_, (_As&&)__as...);
}
- friend auto tag_invoke(get_env_t, const __t& __self)
- -> __call_result_t<get_env_t, const _Receiver&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Receiver&>
{
return get_env(__self.__op_->__rcvr_);
}
@@ -3332,17 +3376,16 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completion_signatures<_Self, _Env>
requires true;
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -3489,16 +3532,15 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completion_signatures<_Self, _Env>
requires true;
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -3640,16 +3682,15 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completion_signatures<_Self, _Env>
requires true;
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -3822,17 +3863,16 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completion_signatures<_Self, _Env>
requires true;
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -4047,7 +4087,7 @@
std::optional<typename stop_token_of_t<env_of_t<_Receiver>&>::
template callback_type<__on_stop_requested>>;
- _Receiver __recvr_;
+ _Receiver __rcvr_;
__on_stop __on_stop_{};
std::shared_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
__shared_state_;
@@ -4061,7 +4101,7 @@
__shared_state) //
noexcept(std::is_nothrow_move_constructible_v<_Receiver>) :
__operation_base{nullptr, __notify},
- __recvr_((_Receiver&&)__rcvr),
+ __rcvr_((_Receiver&&)__rcvr),
__shared_state_(std::move(__shared_state))
{}
@@ -4077,7 +4117,7 @@
std::apply(
[&](auto __tag,
const auto&... __args) noexcept -> void {
- __tag((_Receiver&&)__op->__recvr_, __args...);
+ __tag((_Receiver&&)__op->__rcvr_, __args...);
},
__tupl);
},
@@ -4096,7 +4136,7 @@
if (__old != __completion_state)
{
__self.__on_stop_.emplace(
- get_stop_token(get_env(__self.__recvr_)),
+ get_stop_token(get_env(__self.__rcvr_)),
__on_stop_requested{__shared_state->__stop_source_});
}
@@ -4186,8 +4226,8 @@
}
template <__decays_to<__t> _Self, class _OtherEnv>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
- -> __completions_t<_Self>;
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&,
+ _OtherEnv&&) -> __completions_t<_Self>;
};
};
@@ -4303,7 +4343,8 @@
__self.__shared_state_.reset();
}
- friend const __env_t<_Env>& tag_invoke(get_env_t, const __t& __self)
+ friend const __env_t<_Env>& tag_invoke(get_env_t,
+ const __t& __self) noexcept
{
return __self.__shared_state_->__env_;
}
@@ -4562,14 +4603,14 @@
}
template <same_as<__t> _Self, class _OtherEnv>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
- -> __completions_t<_Self>;
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&,
+ _OtherEnv&&) -> __completions_t<_Self>;
};
};
struct ensure_started_t;
-// When looking for user-defined customizations of split, these
+// When looking for user-defined customizations of ensure_started, these
// are the signatures to test against, in order:
using _CvrefSender = __0;
using _Env = __1;
@@ -4772,7 +4813,7 @@
__tag(std::move(__self.__op_state_->__rcvr_), (_As&&)__as...);
}
- friend auto tag_invoke(get_env_t, const __t& __self)
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
-> env_of_t<_Receiver>
{
return get_env(__self.__op_state_->__rcvr_);
@@ -4847,7 +4888,7 @@
__mapply<
__transform<__mbind_front_q<__tfx_signal_t, _Env, _Fun, _Set>,
__q<__concat_completion_signatures_t>>,
- completion_signatures_of_t<_Sender, _Env>>;
+ __completion_signatures_of_t<_Sender, _Env>>;
template <__decays_to<__t> _Self, receiver _Receiver>
requires sender_to<__copy_cvref_t<_Self, _Sender>,
@@ -4860,19 +4901,18 @@
((_Self&&)__self).__fun_};
}
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completions<__copy_cvref_t<_Self, _Sender>, _Env>
requires true;
@@ -5062,9 +5102,8 @@
return {((_Self&&)__self).__sndr_, (_Receiver&&)__rcvr};
}
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -5078,7 +5117,7 @@
using __set_error_t = completion_signatures<set_error_t(_Ty)>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> make_completion_signatures<
__copy_cvref_t<_Self, _Sender>, _Env,
completion_signatures<set_error_t(std::exception_ptr)>,
@@ -5447,7 +5486,7 @@
_Tag{}((_Receiver&&)__self.__op_state_->__rcvr_, (_As&&)__as...);
}
- friend auto tag_invoke(get_env_t, const __t& __self)
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
-> env_of_t<_Receiver>
{
return get_env(__self.__op_state_->__rcvr_);
@@ -5504,7 +5543,7 @@
(__t&&)__self, (_Args&&)__args...);
}
- friend auto tag_invoke(get_env_t, const __t& __self)
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
-> env_of_t<_Receiver>
{
return get_env(__self.__op_state_->__rcvr_);
@@ -5605,13 +5644,13 @@
{
using _Scheduler = stdexec::__t<_SchedulerId>;
using _Sender = stdexec::__t<_SenderId>;
- using _Attrs = stdexec::__t<__env<_SchedulerId>>;
+ using _Env = stdexec::__t<__env<_SchedulerId>>;
struct __t
{
using __id = __sender;
using is_sender = void;
- _Attrs __env_;
+ _Env __env_;
_Sender __sndr_;
template <class _Self, class _Receiver>
@@ -5659,15 +5698,15 @@
__decay_signature<set_value_t>, __decay_signature<set_error_t>>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completions_t<_Self, _Env>
requires true;
- friend const _Attrs& tag_invoke(get_env_t, const __t& __self) noexcept
+ friend const _Env& tag_invoke(get_env_t, const __t& __self) noexcept
{
return __self.__env_;
}
@@ -5784,7 +5823,7 @@
return __op_state_->__rcvr_;
}
- auto get_env() const
+ auto get_env() const noexcept
-> __make_env_t<env_of_t<_Receiver>,
__with<get_scheduler_t, _Scheduler>>
{
@@ -5922,9 +5961,8 @@
(_Receiver&&)__rcvr};
}
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
@@ -5933,7 +5971,7 @@
using __value_t = completion_signatures<>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __try_make_completion_signatures<
schedule_result_t<_Scheduler>, _Env,
__try_make_completion_signatures<
@@ -6056,7 +6094,8 @@
set_stopped((_Receiver&&)__self.__rcvr_);
}
- friend env_of_t<_Receiver> tag_invoke(get_env_t, const __t& __self)
+ friend env_of_t<_Receiver> tag_invoke(get_env_t,
+ const __t& __self) noexcept
{
return get_env(__self.__rcvr_);
}
@@ -6110,15 +6149,14 @@
__receiver_t<_Receiver>{(_Receiver&&)__rcvr});
}
- friend auto tag_invoke(get_env_t, const __t& __self) //
- noexcept(__nothrow_callable<get_env_t, const _Sender&>)
- -> __call_result_t<get_env_t, const _Sender&>
+ friend auto tag_invoke(get_env_t, const __t& __self) noexcept
+ -> env_of_t<const _Sender&>
{
return get_env(__self.__sndr_);
}
template <class _Env>
- friend auto tag_invoke(get_completion_signatures_t, __t&&, _Env) //
+ friend auto tag_invoke(get_completion_signatures_t, __t&&, _Env&&) //
-> __compl_sigs<_Env>;
};
};
@@ -6165,41 +6203,19 @@
}
};
-template <class _EnvId>
-struct __env
+template <class _Env>
+auto __make_env(_Env&& __env, in_place_stop_source& __stop_source) noexcept
{
- using _Env = stdexec::__t<_EnvId>;
-
- struct __t
- {
- using __id = __env;
- _Env __base_env_;
- in_place_stop_token __stok_;
-
- friend in_place_stop_token tag_invoke(get_stop_token_t,
- const __t& __self) noexcept
- {
- return __self.__stok_;
- }
-
- // Forward the receiver queries:
- template < //
- __none_of<get_completion_signatures_t, get_stop_token_t> _Tag, //
- same_as<__t> _Self, //
- class... _As>
- requires __callable<_Tag, const __mfront<_Env, _Self>&, _As...>
- friend auto tag_invoke(_Tag __tag, const _Self& __self,
- _As&&... __as) noexcept
- -> __call_result_if_t<same_as<_Self, __t>, _Tag,
- const __mfront<_Env, _Self>&, _As...>
- {
- return ((_Tag&&)__tag)(__self.__base_env_, (_As&&)__as...);
- }
- };
-};
+ return __env::__join_env(__env::__env_fn{[&](get_stop_token_t) noexcept {
+ return __stop_source.get_token();
+ }},
+ (_Env&&)__env);
+}
template <class _Env>
-using __env_t = __t<__if_c<same_as<_Env, no_env>, no_env, __env<__id<_Env>>>>;
+using __env_t = //
+ decltype(__when_all::__make_env(__declval<_Env>(),
+ __declval<in_place_stop_source&>()));
template <class _Tp>
using __decay_rvalue_ref = __decay_t<_Tp>&&;
@@ -6320,7 +6336,7 @@
if constexpr (!same_as<_ValuesTuple, __ignore>)
{
// All child operations completed successfully:
- __when_all::__set_values(__recvr_, __values_);
+ __when_all::__set_values(__rcvr_, __values_);
}
break;
case __error:
@@ -6328,17 +6344,17 @@
std::variant<std::monostate>>)
{
// One or more child operations completed with an error:
- std::visit(__complete_fn{set_error, __recvr_}, __errors_);
+ std::visit(__complete_fn{set_error, __rcvr_}, __errors_);
}
break;
case __stopped:
- stdexec::set_stopped((_Receiver&&)__recvr_);
+ stdexec::set_stopped((_Receiver&&)__rcvr_);
break;
default:;
}
}
- _Receiver __recvr_;
+ _Receiver __rcvr_;
std::atomic<std::size_t> __count_;
in_place_stop_source __stop_source_{};
// Could be non-atomic here and atomic_ref everywhere except __completion_fn
@@ -6460,11 +6476,11 @@
__self.__op_state_->__arrive();
}
- friend __env_t<env_of_t<_Receiver>> tag_invoke(get_env_t,
- const __t& __self)
+ friend __env_t<env_of_t<_Receiver>>
+ tag_invoke(get_env_t, const __t& __self) noexcept
{
- return {stdexec::get_env(__self.__op_state_->__recvr_),
- __self.__op_state_->__stop_source_.get_token()};
+ return __when_all::__make_env(get_env(__self.__op_state_->__rcvr_),
+ __self.__op_state_->__stop_source_);
}
__operation_base<_ReceiverId, _ValuesTuple, _ErrorsVariant>*
@@ -6580,13 +6596,13 @@
{
// register stop callback:
__self.__on_stop_.emplace(
- get_stop_token(get_env(__self.__recvr_)),
+ get_stop_token(get_env(__self.__rcvr_)),
__on_stop_requested{__self.__stop_source_});
if (__self.__stop_source_.stop_requested())
{
// Stop has already been requested. Don't bother starting
// the child operations.
- stdexec::set_stopped((_Receiver&&)__self.__recvr_);
+ stdexec::set_stopped((_Receiver&&)__self.__rcvr_);
}
else
{
@@ -6652,10 +6668,10 @@
}
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__decays_to<__t> _Self, class _Env>
- friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&)
-> __completions_t<_Self, _Env>
requires true;
@@ -6830,10 +6846,10 @@
}
template <class _Env>
- friend auto tag_invoke(get_completion_signatures_t, __sender, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, __sender, _Env&&)
-> dependent_completion_signatures<_Env>;
template <__none_of<no_env> _Env>
- friend auto tag_invoke(get_completion_signatures_t, __sender, _Env)
+ friend auto tag_invoke(get_completion_signatures_t, __sender, _Env&&)
-> __completions_t<_Env>;
friend empty_env tag_invoke(get_env_t, const __t& __self) noexcept
@@ -6923,25 +6939,16 @@
template <class _Sender>
using __into_variant_result_t = decltype(into_variant(__declval<_Sender>()));
-struct __env
+inline auto __make_env(run_loop& __loop) noexcept
{
- using __t = __env;
- using __id = __env;
- run_loop::__scheduler __sched_;
+ return __env::__env_fn{
+ [&](__one_of<get_scheduler_t,
+ get_delegatee_scheduler_t> auto) noexcept {
+ return __loop.get_scheduler();
+ }};
+}
- friend auto tag_invoke(get_scheduler_t, const __env& __self) noexcept
- -> run_loop::__scheduler
- {
- return __self.__sched_;
- }
-
- friend auto tag_invoke(get_delegatee_scheduler_t,
- const __env& __self) noexcept
- -> run_loop::__scheduler
- {
- return __self.__sched_;
- }
-};
+using __env = decltype(__sync_wait::__make_env(__declval<run_loop&>()));
// What should sync_wait(just_stopped()) return?
template <sender_in<__env> _Sender, class _Continuation>
@@ -7016,7 +7023,7 @@
friend __env tag_invoke(get_env_t, const __t& __rcvr) noexcept
{
- return {__rcvr.__loop_->get_scheduler()};
+ return __sync_wait::__make_env(*__rcvr.__loop_);
}
};
};
diff --git a/tools/sdbusplus/templates/signal.prototype.hpp.mako b/tools/sdbusplus/templates/signal.prototype.hpp.mako
index 10fae50..ec8ee7e 100644
--- a/tools/sdbusplus/templates/signal.prototype.hpp.mako
+++ b/tools/sdbusplus/templates/signal.prototype.hpp.mako
@@ -9,9 +9,8 @@
r += default_value(p)
return r
- def parameters_as_list(pre="", post=""):
- return ", ".join([ "%s%s%s" % (pre, p.camelCase, post)
- for p in signal.properties ])
+ def parameters_as_list():
+ return ", ".join([ p.camelCase for p in signal.properties ])
def parameters_types_as_list():
return ", ".join([ p.cppTypeParam(interface.name, full=True)