16#include "pw_async2/context.h"
17#include "pw_async2/internal/config.h"
18#include "pw_async2/lock.h"
19#include "pw_async2/task.h"
20#include "pw_async2/waker.h"
21#include "pw_containers/intrusive_list.h"
22#include "pw_metric/metric.h"
23#include "pw_sync/lock_annotations.h"
24#include "pw_sync/mutex.h"
35using PendOutputOf =
typename decltype(std::declval<T>().Pend(
36 std::declval<Context&>()))::value_type;
63 return task.dispatcher_ ==
this;
85 bool should_sleep()
const {
return should_sleep_; }
88 SleepInfo(
bool should_sleep) : should_sleep_(should_sleep) {}
119 bool completed_main_task,
121 : completed_all_tasks_(completed_all_tasks),
122 completed_main_task_(completed_main_task),
123 ran_a_task_(ran_a_task) {}
124 bool completed_all_tasks()
const {
return completed_all_tasks_; }
125 bool completed_main_task()
const {
return completed_main_task_; }
126 bool ran_a_task()
const {
return ran_a_task_; }
129 bool completed_all_tasks_;
130 bool completed_main_task_;
137 Task* task_to_look_for);
139 uint32_t tasks_polled()
const {
return tasks_polled_.value(); }
140 uint32_t tasks_completed()
const {
return tasks_completed_.value(); }
141 uint32_t sleep_count()
const {
return sleep_count_.value(); }
142 uint32_t wake_count()
const {
return wake_count_.value(); }
145 friend class Dispatcher;
150 wake_count_.Increment();
166 void RemoveWokenTaskLocked(
Task&)
168 void RemoveSleepingTaskLocked(
Task&)
177 void LogRegisteredTasks();
179#if PW_ASYNC2_DEBUG_WAIT_REASON
180 void LogTaskWakers(
const Task& task)
201 PW_METRIC_GROUP(metrics_,
"pw::async2::NativeDispatcherBase");
202 PW_METRIC(metrics_, tasks_polled_,
"tasks_polled", 0u);
203 PW_METRIC(metrics_, tasks_completed_,
"tasks_completed", 0u);
204 PW_METRIC(metrics_, sleep_count_,
"sleep_count", 0u);
205 PW_METRIC(metrics_, wake_count_,
"wake_count", 0u);
A single-threaded cooperatively scheduled runtime for async tasks.
Definition: dispatcher.h:48
Definition: dispatcher_base.h:116
Definition: dispatcher_base.h:81
Definition: dispatcher_base.h:49
RunOneTaskResult RunOneTask(Dispatcher &dispatcher, Task *task_to_look_for)
bool HasPostedTask(Task &task)
Check that a task is posted on this Dispatcher.
Definition: dispatcher_base.h:61
SleepInfo AttemptRequestWake(bool allow_empty)
Definition: intrusive_list.h:88
pw::sync::InterruptSpinLock & dispatcher_lock()
Definition: lock.h:33
#define PW_MODIFY_DIAGNOSTICS_POP()
Definition: compiler.h:194
#define PW_MODIFY_DIAGNOSTIC_GCC(kind, option)
Definition: compiler.h:211
#define PW_MODIFY_DIAGNOSTICS_PUSH()
Definition: compiler.h:189
#define PW_GUARDED_BY(x)
Definition: lock_annotations.h:60
#define PW_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: lock_annotations.h:146
#define PW_LOCKS_EXCLUDED(...)
Definition: lock_annotations.h:176