4#ifndef SYMBIAN_GUEST_THREAD_FIBER_H_
5#define SYMBIAN_GUEST_THREAD_FIBER_H_
20#include "absl/functional/any_invocable.h"
21#include "absl/status/status.h"
22#include "absl/time/time.h"
39 virtual std::size_t
PickNext(std::span<Fiber* const> ready) = 0;
53 absl::Status RunReady(std::size_t max_turns);
54 bool HasReady()
const;
55 std::chrono::steady_clock::time_point NextDeadline()
const;
63 void Add(
Fiber* fiber);
64 void Remove(
Fiber* fiber);
65 void Wake(
Fiber* fiber);
66 bool WakeWithoutNotify(
Fiber* fiber);
68 void PreparePark(
Fiber* fiber,
69 std::chrono::steady_clock::time_point deadline);
70 void CancelPark(
Fiber* fiber);
71 void Suspend(
Fiber* fiber);
75 mutable
std::mutex mu_;
78 Fiber* current_ =
nullptr;
79 std::uintptr_t root_sp_ = 0;
84 using Work = absl::AnyInvocable<void() &&>;
85 static constexpr std::size_t kDefaultStackBytes = 16 * 1024;
88 std::size_t stack_bytes = kDefaultStackBytes);
91 requires(std::is_invocable_r_v<void, std::decay_t<F>> &&
92 !std::is_same_v<std::decay_t<F>,
Work>)
94 std::size_t stack_bytes = kDefaultStackBytes)
95 :
Fiber(scheduler,
Work(std::forward<F>(work)), stack_bytes) {}
102 std::lock_guard lock(scheduler_.mu_);
110 static
Fiber* Current() noexcept;
112 static
void SleepFor(absl::Duration duration);
122 std::atomic<
bool> cancel_requested_{
false};
123 std::unique_ptr<std::uintptr_t[]> stack_;
124 std::uintptr_t stack_sp_ = 0;
125 bool queued_ =
false;
126 bool waiting_ =
false;
127 bool finished_ =
false;
128 std::chrono::steady_clock::time_point deadline_ =
129 std::chrono::steady_clock::time_point::max();
Definition boost_primitives.h:110
Fiber(const Fiber &)=delete
bool Finished() const noexcept
Definition fiber.h:101
Fiber(Scheduler &scheduler, F &&work, std::size_t stack_bytes=kDefaultStackBytes)
Definition fiber.h:93
absl::AnyInvocable< void() && > Work
Definition fiber.h:84
Fiber & operator=(const Fiber &)=delete
Definition boost_primitives.h:34
Definition selectables.h:15
virtual ~SchedulerPolicy()=default
virtual void NotifyReady() noexcept=0
virtual std::size_t PickNext(std::span< Fiber *const > ready)=0
Scheduler & operator=(const Scheduler &)=delete
Scheduler(const Scheduler &)=delete
Definition exception_count.cc:8
bool Cancelled()
Definition fiber.cc:289
Case OnCancel()
Definition fiber.cc:294
void SleepFor(absl::Duration duration)
Definition boost_primitives.h:263
void FiberEntry()
Definition fiber.cc:229
A Case represents a selectable case in a Select statement.
Definition cases.h:55