123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- #pragma once
- #include "forward.hpp"
- #include "address.hpp"
- #include "actor_config.h"
- #include "messages.hpp"
- #include "state.h"
- #include "handler.h"
- #include "extended_error.h"
- #include "timer_handler.hpp"
- #include <set>
- namespace rotor {
- struct actor_base_t : public arc_base_t<actor_base_t> {
-
- using config_t = actor_config_t;
-
- template <typename Actor> using config_builder_t = actor_config_builder_t<Actor>;
-
- template <typename Handler>
- using is_handler =
- std::enable_if_t<std::is_member_function_pointer_v<Handler> || std::is_base_of_v<handler_base_t, Handler>>;
-
-
- using plugins_list_t = std::tuple<
- plugin::address_maker_plugin_t,
- plugin::lifetime_plugin_t,
- plugin::init_shutdown_plugin_t,
- plugin::link_server_plugin_t,
- plugin::link_client_plugin_t,
- plugin::registry_plugin_t,
- plugin::resources_plugin_t,
- plugin::starter_plugin_t>;
-
-
- actor_base_t(config_t &cfg);
- virtual ~actor_base_t();
-
- virtual void do_initialize(system_context_t *ctx) noexcept;
-
- virtual void do_shutdown(const extended_error_ptr_t &reason = {}) noexcept;
-
- virtual void on_start() noexcept;
-
- template <typename M, typename... Args> void send(const address_ptr_t &addr, Args &&...args);
-
- template <typename R, typename... Args>
- request_builder_t<typename request_wrapper_t<R>::request_t> request(const address_ptr_t &dest_addr, Args &&...args);
-
- template <typename R, typename... Args>
- request_builder_t<typename request_wrapper_t<R>::request_t>
- request_via(const address_ptr_t &dest_addr, const address_ptr_t &reply_addr, Args &&...args);
-
- template <typename Request, typename... Args> void reply_to(Request &message, Args &&...args);
-
- template <typename Request> void reply_with_error(Request &message, const extended_error_ptr_t &ec);
-
- template <typename Request, typename... Args> auto make_response(Request &message, Args &&...args);
-
- template <typename Request> auto make_response(Request &message, const extended_error_ptr_t &ec);
-
- template <typename Handler> subscription_info_ptr_t subscribe(Handler &&h, const address_ptr_t &addr) noexcept;
-
- template <typename Handler> subscription_info_ptr_t subscribe(Handler &&h) noexcept;
-
- template <typename Handler, typename = is_handler<Handler>>
- void unsubscribe(Handler &&h, address_ptr_t &addr) noexcept;
-
- template <typename Handler, typename = is_handler<Handler>> void unsubscribe(Handler &&h) noexcept;
-
-
- inline void unsubscribe(const handler_ptr_t &h) noexcept { lifetime->unsubscribe(h, address); }
-
- void activate_plugins() noexcept;
-
- void commit_plugin_activation(plugin::plugin_base_t &plugin, bool success) noexcept;
-
- void deactivate_plugins() noexcept;
-
- void commit_plugin_deactivation(plugin::plugin_base_t &plugin) noexcept;
-
- void on_subscription(message::subscription_t &message) noexcept;
-
- void on_unsubscription(message::unsubscription_t &message) noexcept;
-
- void on_unsubscription_external(message::unsubscription_external_t &message) noexcept;
-
- address_ptr_t create_address() noexcept;
-
- virtual void shutdown_start() noexcept;
-
- void shutdown_continue() noexcept;
-
- virtual void shutdown_finish() noexcept;
-
- virtual void init_start() noexcept;
-
- void init_continue() noexcept;
-
- virtual void init_finish() noexcept;
-
- virtual void configure(plugin::plugin_base_t &plugin) noexcept;
-
- template <typename T> auto &access() noexcept;
-
- template <typename T, typename... Args> auto access(Args... args) noexcept;
-
- template <typename T> auto &access() const noexcept;
-
- template <typename T, typename... Args> auto access(Args... args) const noexcept;
-
- inline const address_ptr_t &get_address() const noexcept { return address; }
-
- inline supervisor_t &get_supervisor() const noexcept { return *supervisor; }
-
- template <typename Delegate, typename Method>
- request_id_t start_timer(const pt::time_duration &interval, Delegate &delegate, Method method) noexcept;
-
- void cancel_timer(request_id_t request_id) noexcept;
-
- inline const extended_error_ptr_t &get_shutdown_reason() const noexcept { return shutdown_reason; }
-
- inline const std::string &get_identity() const noexcept { return identity; }
-
- static const constexpr std::uint32_t PROGRESS_INIT = 1 << 0;
-
- static const constexpr std::uint32_t PROGRESS_SHUTDOWN = 1 << 1;
-
- static const constexpr std::uint32_t ESCALATE_FALIURE = 1 << 2;
-
- static const constexpr std::uint32_t AUTOSHUTDOWN_SUPERVISOR = 1 << 3;
-
- virtual bool should_restart() const noexcept;
- protected:
-
- using timers_map_t = std::unordered_map<request_id_t, timer_handler_ptr_t>;
-
- void on_timer_trigger(request_id_t request_id, bool cancelled) noexcept;
-
- template <typename Delegate, typename Method>
- void start_timer(request_id_t request_id, const pt::time_duration &interval, Delegate &delegate,
- Method method) noexcept;
-
- void assign_shutdown_reason(extended_error_ptr_t reason) noexcept;
-
- extended_error_ptr_t make_error(const std::error_code &ec, const extended_error_ptr_t &next = {}) noexcept;
-
- virtual bool on_unlink(const address_ptr_t &server_addr) noexcept;
-
- intrusive_ptr_t<message::init_request_t> init_request;
-
- intrusive_ptr_t<message::shutdown_request_t> shutdown_request;
-
- address_ptr_t address;
-
- address_ptr_t spawner_address;
-
- std::string identity;
-
- supervisor_t *supervisor;
-
- plugin_storage_ptr_t plugins_storage;
-
- plugins_t plugins;
-
- pt::time_duration init_timeout;
-
- pt::time_duration shutdown_timeout;
-
- state_t state;
-
- plugin::address_maker_plugin_t *address_maker = nullptr;
-
- plugin::lifetime_plugin_t *lifetime = nullptr;
-
- plugin::link_server_plugin_t *link_server = nullptr;
-
- plugin::resources_plugin_t *resources = nullptr;
-
- plugin::plugin_base_t *get_plugin(const void *identity) const noexcept;
-
- std::set<const void *> activating_plugins;
-
- std::set<const void *> deactivating_plugins;
-
- timers_map_t timers_map;
-
- std::uint32_t continuation_mask = 0;
-
- extended_error_ptr_t shutdown_reason;
- friend struct plugin::plugin_base_t;
- friend struct plugin::lifetime_plugin_t;
- friend struct supervisor_t;
- template <typename T> friend struct request_builder_t;
- template <typename T, typename M> friend struct accessor_t;
- };
- }
|