Skip to content

Commit

Permalink
Fill in async timer
Browse files Browse the repository at this point in the history
  • Loading branch information
rnburn authored and Johannes Tax committed Jul 7, 2020
1 parent 0cef1d8 commit 8c2b945
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 11 deletions.
17 changes: 15 additions & 2 deletions sdk/src/event/async_timer/dispatcher.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "src/event/async_timer/dispatcher.h"

#include <thread>

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
Expand All @@ -13,9 +15,20 @@ std::unique_ptr<event::Timer> Dispatcher::CreateTimer(TimerCallback callback) no
return nullptr;
}

void Dispatcher::Exit() noexcept {}
void Dispatcher::Exit() noexcept {
running_ = false;
}

void Dispatcher::Run() noexcept {}
void Dispatcher::Run() noexcept {
while (running_ && !events_.empty()) {
auto next_event = events_.begin();
std::this_thread::sleep_until(next_event->first);
if (next_event->second) {
next_event->second();
}
events_.erase(next_event);
}
}
} // namespace async_timer
} // namespace event
} // namespace sdk
Expand Down
4 changes: 3 additions & 1 deletion sdk/src/event/async_timer/dispatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ class Dispatcher final : public event::Dispatcher
void Run() noexcept override;

private:
std::map<std::chrono::steady_clock::time_point, TimerCallback> events_;
friend class Timer;
bool running_{true};
std::multimap<std::chrono::steady_clock::time_point, TimerCallback> events_;
};
} // namespace async_timer
} // namespace event
Expand Down
22 changes: 19 additions & 3 deletions sdk/src/event/async_timer/timer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,30 @@ namespace event
{
namespace async_timer
{
Timer::Timer(Dispatcher::EventIterator iterator) noexcept : iterator_{iterator} {}
Timer::Timer(TimerCallback callback, Dispatcher &dispatcher) noexcept
: callback_{callback}, dispatcher_{dispatcher}, event_{dispatcher.events_.end()}
{}

Timer::~Timer()
{
this->DisableTimer();
}

void Timer::EnableTimer(std::chrono::microseconds timeout) noexcept
{
(void)timeout;
this->DisableTimer();
auto time_point = std::chrono::steady_clock::now() + timeout;
// Note: terminates on std::bad_alloc
event_ = dispatcher_.events_.emplace(time_point, callback_);
}

void Timer::DisableTimer() noexcept {}
void Timer::DisableTimer() noexcept
{
if (event_ != dispatcher_.events_.end())
{
dispatcher_.events_.erase(event_);
}
}
} // namespace async_timer
} // namespace event
} // namespace sdk
Expand Down
14 changes: 9 additions & 5 deletions sdk/src/event/async_timer/timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,19 @@ namespace sdk
namespace event
{
namespace async_timer {
class Timer final : event::Timer {
class Timer final : public event::Timer {
public:
explicit Timer(Dispatcher::EventIterator iterator) noexcept;
Timer(TimerCallback callback, Dispatcher &dispatcher) noexcept;

void EnableTimer(std::chrono::microseconds timeout) noexcept override;
~Timer();

void DisableTimer() noexcept override;
void EnableTimer(std::chrono::microseconds timeout) noexcept override;

void DisableTimer() noexcept override;
private:
Dispatcher::EventIterator iterator_;
TimerCallback callback_;
Dispatcher& dispatcher_;
Dispatcher::EventIterator event_;
};
} // namespace async_timer
} // namespace event
Expand Down

0 comments on commit 8c2b945

Please sign in to comment.