uvco 0.1
Loading...
Searching...
No Matches
Scheduler

Classes

class  uvco::Scheduler

Functions

 uvco::Scheduler::Scheduler ()
 uvco::Scheduler::Scheduler (const Scheduler &)=delete
 uvco::Scheduler::Scheduler (Scheduler &&)=delete
Scheduleruvco::Scheduler::operator= (const Scheduler &)=delete
Scheduleruvco::Scheduler::operator= (Scheduler &&)=delete
 uvco::Scheduler::~Scheduler ()
void uvco::Scheduler::enqueue (std::coroutine_handle<> handle)
 Schedule a coroutine for resumption.
void uvco::Scheduler::cancel (std::coroutine_handle<> handle)
void uvco::Scheduler::runAll ()
 Run all scheduled coroutines sequentially.
std::coroutine_handle uvco::Scheduler::getNext ()
void uvco::Scheduler::close ()
bool uvco::Scheduler::empty () const
std::coroutine_handle uvco::Scheduler::getNextInner ()

Variables

static constexpr bool uvco::logSchedulerOperations = false
 If set to true, log scheduler operations to stdout.
std::deque< std::coroutine_handle<> > uvco::Scheduler::resumable_

Detailed Description

Function Documentation

◆ cancel()

void uvco::Scheduler::cancel ( std::coroutine_handle<> handle)
44 {
45 BOOST_ASSERT(handle != nullptr);
46 if constexpr (logSchedulerOperations) {
47 fmt::print("Cancelling coroutine {:x}\n", (uintptr_t)handle.address());
48 }
49
50 for (auto &it : resumable_) {
51 if (it == handle) {
52 it = nullptr;
53 }
54 }
55}
static constexpr bool logSchedulerOperations
If set to true, log scheduler operations to stdout.
Definition scheduler.h:17
std::deque< std::coroutine_handle<> > resumable_
Definition scheduler.h:84

◆ close()

void uvco::Scheduler::close ( )

close() should be called once the main promise has finished, and the process is preparing to exit; however, while the event loop is still running. Example: Once a user has pressed Ctrl-D in a tty application.

Otherwise, resources may be leaked. (This is usually not super important, because the event loop is finishing soon after anyway).

32{ BOOST_ASSERT(resumable_.empty()); }

◆ empty()

bool uvco::Scheduler::empty ( ) const
inlinenodiscard
79{ return resumable_.empty(); }

◆ enqueue()

void uvco::Scheduler::enqueue ( std::coroutine_handle<> handle)

Schedule a coroutine for resumption.

34 {
35 if constexpr (logSchedulerOperations) {
36 fmt::print("Enqueuing coroutine {:x}\n", (uintptr_t)handle.address());
37 }
38 resumable_.push_back(handle);
39}

◆ getNext()

std::coroutine_handle uvco::Scheduler::getNext ( )

Returns a handle to the next runnable suspended coroutine. This is mainly used by Loop::getNext() which in turns is used to implement symmetric hand-off, i.e. decentralized scheduling. By using this, all suspending awaiters can hand off control directly to the next coroutine instead of going through the scheduler first. This behavior can be disabled by setting the useSymmetricHandoff compile-time variable to false in scheduler.cc.

57 {
58 if constexpr (useSymmetricHandoff) {
59 return getNextInner();
60 } else {
61 return std::noop_coroutine();
62 }
63}
std::coroutine_handle getNextInner()
Definition scheduler.cc:65
static constexpr bool useSymmetricHandoff
Definition scheduler.cc:19

◆ getNextInner()

std::coroutine_handle uvco::Scheduler::getNextInner ( )
private
65 {
66 std::coroutine_handle<> next{nullptr};
67 while (!resumable_.empty() && (next == nullptr || next.done())) {
68 next = resumable_.front();
69 resumable_.pop_front();
70 }
71 if (next == nullptr || next.done()) {
72 return std::noop_coroutine();
73 }
74 if constexpr (logSchedulerOperations) {
75 fmt::print("Dequeuing coroutine {:x}, {} left\n", (uintptr_t)next.address(),
76 resumable_.size());
77 }
78 return next;
79}

◆ operator=() [1/2]

Scheduler & uvco::Scheduler::operator= ( const Scheduler & )
delete

◆ operator=() [2/2]

Scheduler & uvco::Scheduler::operator= ( Scheduler && )
delete

◆ runAll()

void uvco::Scheduler::runAll ( )

Run all scheduled coroutines sequentially.

21 {
22 while (!resumable_.empty()) {
23 const std::coroutine_handle<> next = getNextInner();
24 BOOST_ASSERT(next != nullptr && !next.done());
25 if constexpr (logSchedulerOperations) {
26 fmt::print("Resuming coroutine {:x}\n", (uintptr_t)next.address());
27 }
28 next.resume();
29 }
30}

◆ Scheduler() [1/3]

uvco::Scheduler::Scheduler ( )
default

◆ Scheduler() [2/3]

uvco::Scheduler::Scheduler ( const Scheduler & )
delete

◆ Scheduler() [3/3]

uvco::Scheduler::Scheduler ( Scheduler && )
delete

◆ ~Scheduler()

uvco::Scheduler::~Scheduler ( )
default

Variable Documentation

◆ logSchedulerOperations

bool uvco::logSchedulerOperations = false
staticconstexpr

If set to true, log scheduler operations to stdout.

◆ resumable_

std::deque<std::coroutine_handle<> > uvco::Scheduler::resumable_
private