18#include "pw_assert/assert.h"
19#include "pw_async2/internal/config.h"
20#include "pw_async2/internal/lock.h"
21#include "pw_containers/intrusive_forward_list.h"
22#include "pw_log/tokenized_args.h"
23#include "pw_sync/lock_annotations.h"
33template <
typename Callable>
34[[nodiscard]]
constexpr auto InvokeWithNodiscard(Callable&& callable) {
38[[nodiscard]]
bool CloneWaker(Waker& waker_in,
40 log::Token wait_reason)
43[[nodiscard]]
bool StoreWaker(Context& context,
45 log::Token wait_reason)
64#define PW_ASYNC_STORE_WAKER(context, waker_out, wait_reason_string) \
66 bool waker_had_space = \
67 PW_ASYNC_TRY_STORE_WAKER(context, waker_out, wait_reason_string); \
68 PW_ASSERT(waker_had_space); \
84#define PW_ASYNC_TRY_STORE_WAKER(context, waker_out, wait_reason_string) \
85 _PW_ASYNC_TRY_GET_WAKER(::pw::async2::internal::StoreWaker, \
102#define PW_ASYNC_CLONE_WAKER(waker_in, waker_out, wait_reason_string) \
104 bool waker_had_space = \
105 PW_ASYNC_TRY_CLONE_WAKER(waker_in, waker_out, wait_reason_string); \
106 PW_ASSERT(waker_had_space); \
121#define PW_ASYNC_TRY_CLONE_WAKER(waker_in, waker_out, wait_reason_string) \
122 _PW_ASYNC_TRY_GET_WAKER(::pw::async2::internal::CloneWaker, \
130#define _PW_ASYNC_TRY_GET_WAKER(func, source, waker_out, wait_reason_string) \
131 ::pw::async2::internal::InvokeWithNodiscard( \
132 [&]() PW_NO_LOCK_SAFETY_ANALYSIS { \
133 [[maybe_unused]] constexpr const char* \
134 pw_async2_wait_reason_must_be_string = wait_reason_string; \
135 constexpr ::pw::log::Token pw_async2_wait_reason = \
136 PW_LOG_TOKEN("pw_async2", wait_reason_string); \
137 return func(source, waker_out, pw_async2_wait_reason); \
157 constexpr Waker() =
default;
160 *
this = std::move(other);
201 friend
bool internal::CloneWaker(
Waker& waker_in,
203 log::Token wait_reason);
205 friend
bool internal::StoreWaker(
Context& context,
207 log::Token wait_reason);
211 void set_wait_reason([[maybe_unused]] log::Token wait_reason)
213#if PW_ASYNC2_DEBUG_WAIT_REASON
214 wait_reason_ = wait_reason;
218 bool TrySetTask(
Context& context, log::Token wait_reason)
227 bool CloneInto(
Waker& waker_out, log::Token wait_reason)
232 if (task_ !=
nullptr) {
244#if PW_ASYNC2_DEBUG_WAIT_REASON
245 log::Token wait_reason_
PW_GUARDED_BY(internal::lock()) = log::kDefaultToken;
253inline bool CloneWaker(Waker& waker_in,
255 log::Token wait_reason) {
256 return waker_in.CloneInto(waker_out, wait_reason);
259inline bool StoreWaker(Context& context,
261 log::Token wait_reason) {
262 return waker_out.TrySetTask(context, wait_reason);
Definition: intrusive_forward_list.h:99
Definition: dispatcher.h:74
Waker & operator=(Waker &&other) noexcept
#define PW_GUARDED_BY(x)
Definition: lock_annotations.h:60
#define PW_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: lock_annotations.h:147
#define PW_LOCKS_EXCLUDED(...)
Definition: lock_annotations.h:178