object_manager.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "object_manager_impl.h"
  2. #include <boost/asio/io_context.hpp>
  3. #include <boost/asio/post.hpp>
  4. using boost::asio::io_context;
  5. using boost::asio::post;
  6. object_manager::impl::obj_st_type::~obj_st_type() {
  7. assert(del_func != nullptr);
  8. del_func(ptr);
  9. }
  10. object_manager::impl::obj_st_type *
  11. object_manager::impl::query_st(name_type obj_name) {
  12. assert(switch_ctx() == nullptr);
  13. auto iter = obj_pool.find(obj_name);
  14. assert(iter != obj_pool.end());
  15. return &iter->second;
  16. }
  17. std::optional<object_manager::obj_info>
  18. object_manager::impl::query_info(name_type obj_name) {
  19. assert(obj_name != invalid_obj_name);
  20. assert(switch_ctx() == nullptr);
  21. auto iter = obj_pool.find(obj_name);
  22. if (iter == obj_pool.end()) [[unlikely]] return {};
  23. auto &st = iter->second;
  24. return obj_info{
  25. .type = st.type, .pl_ptr = st.ptr, .meta = &st.meta,
  26. .sig = &st.sig, .last_save_ts = st.stats_timer.last_ts()};
  27. }
  28. object_manager::obj_stats
  29. object_manager::impl::query_obj_stats(name_type obj_name) {
  30. auto obj_st = query_st(obj_name);
  31. auto info = obj_st->stats_timer.query();
  32. auto ret = obj_stats{
  33. .save_interval = info.interval,
  34. .save_frequency = info.frequency};
  35. return ret;
  36. }
  37. void object_manager::impl::create_placeholder(name_type obj_name, std::type_index obj_type,
  38. void *ptr, del_func_type del_func) {
  39. assert(switch_ctx() == nullptr);
  40. if (auto iter = obj_pool.find(obj_name);
  41. iter != obj_pool.end()) {
  42. obj_pool.erase(iter);
  43. }
  44. assert(!obj_pool.contains(obj_name));
  45. obj_pool.emplace(std::piecewise_construct,
  46. std::forward_as_tuple(obj_name),
  47. std::forward_as_tuple(ptr, del_func, obj_type));
  48. }
  49. void object_manager::impl::notify_signal(name_type obj_name) {
  50. auto cur_ts = current_timestamp();
  51. auto obj_st = query_st(obj_name);
  52. if (!obj_st->is_pending) {
  53. post(*ctx, [=] {
  54. obj_st->sig(obj_name);
  55. obj_st->is_pending = false;
  56. });
  57. obj_st->is_pending = true;
  58. }
  59. obj_st->stats_timer.record(cur_ts);
  60. }
  61. io_context *object_manager::impl::switch_ctx() const {
  62. if (std::this_thread::get_id() == tid) [[likely]] return nullptr;
  63. return ctx;
  64. }
  65. object_manager::object_manager(create_config conf)
  66. : pimpl(std::make_unique<impl>()) {
  67. pimpl->ctx = conf.ctx;
  68. }
  69. object_manager::~object_manager() = default;
  70. void object_manager::create_placeholder(name_type obj_name, std::type_index obj_type,
  71. void *ptr, del_func_type del_func) {
  72. pimpl->create_placeholder(obj_name, obj_type, ptr, del_func);
  73. }
  74. std::optional<object_manager::obj_info>
  75. object_manager::query_info(name_type obj_name) {
  76. return pimpl->query_info(obj_name);
  77. }
  78. object_manager::obj_stats
  79. object_manager::query_obj_stats(name_type obj_name) {
  80. return pimpl->query_obj_stats(obj_name);
  81. }
  82. io_context *object_manager::switch_ctx() {
  83. return pimpl->switch_ctx();
  84. }
  85. void object_manager::notify_signal(name_type obj_name) {
  86. pimpl->notify_signal(obj_name);
  87. }