rotor
Event loop friendly C++ actor micro-framework
Loading...
Searching...
No Matches
supervisor_ev.h
1#pragma once
2
3//
4// Copyright (c) 2019-2022 Ivan Baidakou (basiliscos) (the dot dmol at gmail dot com)
5//
6// Distributed under the MIT Software License
7//
8
9#include "rotor/supervisor.h"
10#include "rotor/ev/export.h"
11#include "rotor/ev/supervisor_config_ev.h"
12#include "rotor/ev/system_context_ev.h"
13#include "rotor/system_context.h"
14#include <ev.h>
15#include <memory>
16#include <unordered_map>
17
18namespace rotor {
19namespace ev {
20
35struct ROTOR_EV_API supervisor_ev_t : public supervisor_t {
38
40 template <typename Supervisor> using config_builder_t = supervisor_config_ev_builder_t<Supervisor>;
41
56
58 using timer_ptr_t = std::unique_ptr<timer_t>;
59
62 virtual void do_initialize(system_context_t *ctx) noexcept override;
64
65 void start() noexcept override;
66 void shutdown() noexcept override;
67 void enqueue(message_ptr_t message) noexcept override;
68 void shutdown_finish() noexcept override;
69
71 inline struct ev_loop *get_loop() noexcept { return loop; }
72
74 template <typename T> auto &access() noexcept;
75
76 protected:
78 using timers_map_t = std::unordered_map<request_id_t, timer_ptr_t>;
79
81 static void async_cb(EV_P_ ev_async *w, int revents) noexcept;
82
83 void do_start_timer(const pt::time_duration &interval, timer_handler_base_t &handler) noexcept override;
84 void do_cancel_timer(request_id_t timer_id) noexcept override;
85
93 virtual void on_async() noexcept;
94
96 struct ev_loop *loop;
97
100
103
105 ev_tstamp poll_duration;
106
109
110 friend struct supervisor_ev_shutdown_t;
111
112 private:
113 void move_inbound_queue() noexcept;
114};
115
116} // namespace ev
117} // namespace rotor
namespace for ev adapters for rotor
Definition ev.hpp:20
namespace for rotor core messages (which just transform payloads)
Definition messages.hpp:317
Basic namespace for all rotor functionalities.
Definition rotor.hpp:21
intrusive_ptr_t< message_base_t > message_ptr_t
intrusive pointer for message
Definition message.h:118
boost::intrusive_ptr< T > intrusive_ptr_t
alias for intrusive pointer
Definition arc.hpp:27
std::size_t request_id_t
timer identifier type in the scope of the actor
Definition forward.hpp:34
CRTP supervisor ev config builder.
Definition supervisor_config_ev.h:30
libev supervisor config, which holds a pointer to the ev event loop and a loop ownership flag
Definition supervisor_config_ev.h:19
inheritance of ev_timer, which holds rotor timer_id
Definition supervisor_ev.h:45
supervisor_ptr_t sup
intrusive pointer to the supervisor
Definition supervisor_ev.h:54
intrusive_ptr_t< supervisor_ev_t > supervisor_ptr_t
intrusive pointer to ev supervisor (type)
Definition supervisor_ev.h:48
timer_handler_base_t * handler
non-owning pointer to timer handler
Definition supervisor_ev.h:51
supervisor_ev_t(supervisor_config_ev_t &config)
constructs new supervisor from ev supervisor config
void do_cancel_timer(request_id_t timer_id) noexcept override
cancels timer (to be implemented in descendants)
supervisor_config_ev_builder_t< Supervisor > config_builder_t
injects templated supervisor_config_ev_builder_t
Definition supervisor_ev.h:40
static void async_cb(EV_P_ ev_async *w, int revents) noexcept
EV-specific trampoline function for on_async method.
std::unordered_map< request_id_t, timer_ptr_t > timers_map_t
a type for mapping timer_id to timer pointer
Definition supervisor_ev.h:78
ev_tstamp poll_duration
how much time spend in active inbound queue polling
Definition supervisor_ev.h:105
struct ev_loop * get_loop() noexcept
retuns ev-loop associated with the supervisor
Definition supervisor_ev.h:71
void shutdown() noexcept override
thread-safe version of do_shutdown, i.e. send shutdown request let it be processed by the supervisor
struct ev_loop * loop
a pointer to EV event loop, copied from config
Definition supervisor_ev.h:96
void start() noexcept override
thread-safe version of do_process
timers_map_t timers_map
timer_id to timer map
Definition supervisor_ev.h:108
virtual void on_async() noexcept
Process external messages (from inbound queue).
supervisor_config_ev_t config_t
injects an alias for supervisor_config_ev_t
Definition supervisor_ev.h:37
auto & access() noexcept
generic non-public fields accessor
void shutdown_finish() noexcept override
finalizes shutdown
virtual void do_initialize(system_context_t *ctx) noexcept override
early actor initialization (pre-initialization)
void do_start_timer(const pt::time_duration &interval, timer_handler_base_t &handler) noexcept override
starts non-recurring timer (to be implemented in descendants)
ev_async async_watcher
ev-loop specific thread-safe wake-up notifier for external messages delivery
Definition supervisor_ev.h:102
bool loop_ownership
whether loop should be destroyed by supervisor, copied from config
Definition supervisor_ev.h:99
void enqueue(message_ptr_t message) noexcept override
enqueues messages thread safe way and triggers processing
std::unique_ptr< timer_t > timer_ptr_t
an alias for unique pointer, holding timer_t
Definition supervisor_ev.h:58
supervisor_t(supervisor_config_t &config)
constructs new supervisor with optional parent supervisor
The system context holds root supervisor_t (intrusive pointer) and may be loop-related details in der...
Definition system_context.h:32
Base class for timer handler.
Definition timer_handler.hpp:17