supervisor_test.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // Copyright (c) 2019-2022 Ivan Baidakou (basiliscos) (the dot dmol at gmail dot com)
  3. //
  4. // Distributed under the MIT Software License
  5. //
  6. #include "supervisor_test.h"
  7. #include "access.h"
  8. #include "cassert"
  9. using namespace rotor::test;
  10. using namespace rotor;
  11. supervisor_test_t::supervisor_test_t(supervisor_config_test_t &config_)
  12. : supervisor_t{config_}, locality{config_.locality}, configurer{std::move(config_.configurer)},
  13. interceptor{std::move(config_.interceptor)} {
  14. supervisor_t *root_sup = this;
  15. if (!locality) {
  16. while (root_sup->access<test::to::parent_supervisor>()) {
  17. root_sup = root_sup->access<test::to::parent_supervisor>();
  18. }
  19. locality = root_sup;
  20. }
  21. }
  22. supervisor_test_t::~supervisor_test_t() { printf("~supervisor_test_t, %p(%p)\n", (void *)this, (void *)address.get()); }
  23. address_ptr_t supervisor_test_t::make_address() noexcept { return instantiate_address(locality); }
  24. void supervisor_test_t::do_start_timer(const pt::time_duration &, timer_handler_base_t &handler) noexcept {
  25. printf("starting timer %zu (%p)\n", handler.request_id, (void *)this);
  26. active_timers.emplace_back(&handler);
  27. }
  28. void supervisor_test_t::do_cancel_timer(request_id_t timer_id) noexcept {
  29. printf("cancelling timer %zu (%p)\n", timer_id, (void *)this);
  30. auto it = active_timers.begin();
  31. while (it != active_timers.end()) {
  32. auto &handler = *it;
  33. if (handler->request_id == timer_id) {
  34. auto &actor_ptr = handler->owner;
  35. actor_ptr->access<to::on_timer_trigger, request_id_t, bool>(timer_id, true);
  36. active_timers.erase(it);
  37. return;
  38. } else {
  39. ++it;
  40. }
  41. }
  42. assert(0 && "should not happen");
  43. }
  44. void supervisor_test_t::do_invoke_timer(request_id_t timer_id) noexcept {
  45. printf("invoking timer %zu (%p)\n", timer_id, (void *)this);
  46. auto predicate = [&](auto &handler) { return handler->request_id == timer_id; };
  47. auto it = std::find_if(active_timers.begin(), active_timers.end(), predicate);
  48. assert(it != active_timers.end());
  49. auto &handler = *it;
  50. auto &actor_ptr = handler->owner;
  51. actor_ptr->access<to::on_timer_trigger, request_id_t, bool>(timer_id, false);
  52. active_timers.erase(it);
  53. }
  54. subscription_container_t &supervisor_test_t::get_points() noexcept {
  55. auto plugin = get_plugin(plugin::lifetime_plugin_t::class_identity);
  56. return static_cast<plugin::lifetime_plugin_t *>(plugin)->access<to::points>();
  57. }
  58. request_id_t supervisor_test_t::get_timer(std::size_t index) noexcept {
  59. auto it = active_timers.begin();
  60. for (std::size_t i = 0; i < index; ++i) {
  61. ++it;
  62. }
  63. return (*it)->request_id;
  64. }
  65. void supervisor_test_t::enqueue(message_ptr_t message) noexcept { get_leader().queue.emplace_back(std::move(message)); }
  66. pt::time_duration rotor::test::default_timeout{pt::milliseconds{1}};
  67. size_t supervisor_test_t::get_children_count() noexcept { return manager->access<to::actors_map>().size(); }
  68. supervisor_test_t &supervisor_test_t::get_leader() {
  69. return *static_cast<supervisor_test_t *>(access<to::locality_leader>());
  70. }
  71. void supervisor_test_t::configure(plugin::plugin_base_t &plugin) noexcept {
  72. supervisor_t::configure(plugin);
  73. if (configurer) {
  74. configurer(*this, plugin);
  75. }
  76. }
  77. void supervisor_test_t::intercept(message_ptr_t &message, const void *tag,
  78. const continuation_t &continuation) noexcept {
  79. if (interceptor) {
  80. return interceptor(message, tag, continuation);
  81. }
  82. continuation();
  83. }
  84. // let trigger memory leaks
  85. system_test_context_t::~system_test_context_t() {
  86. auto &sup = access<to::supervisor>();
  87. if (sup) {
  88. auto &queue = sup->access<to::queue>();
  89. auto &inbound = sup->access<to::inbound_queue>();
  90. while (!queue.empty()) {
  91. inbound.push(queue.front().detach());
  92. queue.pop_front();
  93. }
  94. }
  95. }