uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | List of all members
uvco::TimerAwaiter Class Reference

Public Member Functions

 TimerAwaiter (const TimerAwaiter &)=delete
 
 TimerAwaiter (TimerAwaiter &&other) noexcept
 
TimerAwaiteroperator= (const TimerAwaiter &)=delete
 
TimerAwaiteroperator= (TimerAwaiter &&other) noexcept
 
 TimerAwaiter (const Loop &loop, uint64_t millis, bool repeating=false)
 
 ~TimerAwaiter ()
 
Promise< void > close ()
 
bool await_ready ()
 
bool await_suspend (std::coroutine_handle<> handle)
 
bool await_resume () const
 
bool isReady ()
 
void stop ()
 
void resume ()
 

Private Attributes

std::unique_ptr< uv_timer_t > timer_
 
std::optional< std::coroutine_handle<> > handle_
 
bool closed_ = false
 
bool stopped_ = false
 

Constructor & Destructor Documentation

◆ TimerAwaiter() [1/3]

uvco::TimerAwaiter::TimerAwaiter ( const TimerAwaiter )
delete

◆ TimerAwaiter() [2/3]

uvco::TimerAwaiter::TimerAwaiter ( TimerAwaiter &&  other)
inlinenoexcept
30 : timer_{std::move(other.timer_)}, handle_{other.handle_},
31 stopped_{other.stopped_} {
32 setData(timer_.get(), this);
33 other.closed_ = true;
34 }
std::optional< std::coroutine_handle<> > handle_
Definition timer.cc:107
bool stopped_
Definition timer.cc:109
std::unique_ptr< uv_timer_t > timer_
Definition timer.cc:106
void setData(Handle *handle, Data *data)
Definition internal_utils.h:55

◆ TimerAwaiter() [3/3]

uvco::TimerAwaiter::TimerAwaiter ( const Loop loop,
uint64_t  millis,
bool  repeating = false 
)
inline
45 : timer_{std::make_unique<uv_timer_t>()} {
46 uv_timer_init(loop.uvloop(), timer_.get());
47 setData(timer_.get(), this);
48 if (repeating) {
49 uv_timer_start(timer_.get(), onMultiTimerFired, millis, millis);
50 } else {
51 uv_timer_start(timer_.get(), onSingleTimerDone, millis, 0);
52 }
53 }
void onMultiTimerFired(uv_timer_t *handle)
Definition timer.cc:118
void onSingleTimerDone(uv_timer_t *handle)
Definition timer.cc:112

◆ ~TimerAwaiter()

uvco::TimerAwaiter::~TimerAwaiter ( )
inline
54 {
55 stop();
56 if (!closed_ && timer_) {
57 fmt::print(stderr,
58 "TimerAwaiter::~TimerAwaiter(): closing timer in dtor; "
59 "this will leak memory. "
60 "Please co_await timer.close() if possible.\n");
61 closeHandle(timer_.release());
62 }
63 }
bool closed_
Definition timer.cc:108
void stop()
Definition timer.cc:91
Promise< void > closeHandle(T *handle, C closer)
Definition close.h:28

Member Function Documentation

◆ await_ready()

bool uvco::TimerAwaiter::await_ready ( )
inline
80{ return isReady(); }
bool isReady()
Definition timer.cc:87

◆ await_resume()

bool uvco::TimerAwaiter::await_resume ( ) const
inline
85{ return !stopped_; }

◆ await_suspend()

bool uvco::TimerAwaiter::await_suspend ( std::coroutine_handle<>  handle)
inline
81 {
82 handle_ = handle;
83 return true;
84 }

◆ close()

Promise< void > uvco::TimerAwaiter::close ( )
inline
65 {
66 if (!timer_ || closed_) {
67 co_return;
68 }
69 // If the timer is already closing, we don't need to close it again.
70 // This would cause an error in libuv.
71 if (uv_is_closing((uv_handle_t *)timer_.get()) != 0) {
72 co_return;
73 }
74 stop();
75 co_await closeHandle(timer_.get());
76 closed_ = true;
77 timer_.reset();
78 }

◆ isReady()

bool uvco::TimerAwaiter::isReady ( )
inline
87 {
88 uint64_t due = uv_timer_get_due_in(timer_.get());
89 return due == 0;
90 }

◆ operator=() [1/2]

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

◆ operator=() [2/2]

TimerAwaiter & uvco::TimerAwaiter::operator= ( TimerAwaiter &&  other)
inlinenoexcept
36 {
37 timer_ = std::move(other.timer_);
38 handle_ = other.handle_;
39 stopped_ = other.stopped_;
40 setData(timer_.get(), this);
41 other.closed_ = true;
42 return *this;
43 }

◆ resume()

void uvco::TimerAwaiter::resume ( )
inline
97 {
98 if (handle_) {
99 auto handle = *handle_;
100 handle_.reset();
101 Loop::enqueue(handle);
102 }
103 }
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73

◆ stop()

void uvco::TimerAwaiter::stop ( )
inline
91 {
92 if (!stopped_) {
93 uv_timer_stop(timer_.get());
94 stopped_ = true;
95 }
96 }

Member Data Documentation

◆ closed_

bool uvco::TimerAwaiter::closed_ = false
private

◆ handle_

std::optional<std::coroutine_handle<> > uvco::TimerAwaiter::handle_
private

◆ stopped_

bool uvco::TimerAwaiter::stopped_ = false
private

◆ timer_

std::unique_ptr<uv_timer_t> uvco::TimerAwaiter::timer_
private

The documentation for this class was generated from the following file: