bool handle_system_message(mailbox_element& x, execution_unit* context, bool trap_exit, F& down_msg_handler) { auto& content = x.content(); if (content.type_token() == make_type_token<down_msg>()) { if (content.shared()) { auto vptr = content.copy(0); down_msg_handler(vptr->get_mutable_as<down_msg>()); } else { down_msg_handler(content.get_mutable_as<down_msg>(0)); } return true; } return handle_system_message(x, context, trap_exit); }
bool monitorable_actor::handle_system_message(mailbox_element& x, execution_unit* ctx, bool trap_exit) { auto& msg = x.content(); if (!trap_exit && msg.size() == 1 && msg.match_element<exit_msg>(0)) { // exits for non-normal exit reasons auto& em = msg.get_mutable_as<exit_msg>(0); if (em.reason) cleanup(std::move(em.reason), ctx); return true; } if (msg.size() > 1 && msg.match_element<sys_atom>(0)) { if (!x.sender) return true; error err; mailbox_element_ptr res; msg.apply( [&](sys_atom, get_atom, std::string& what) { CAF_LOG_TRACE(CAF_ARG(what)); if (what != "info") { err = sec::unsupported_sys_key; return; } res = make_mailbox_element(ctrl(), x.mid.response_id(), {}, ok_atom::value, std::move(what), strong_actor_ptr{ctrl()}, name()); } ); if (!res && !err) err = sec::unsupported_sys_message; if (err && x.mid.is_request()) res = make_mailbox_element(ctrl(), x.mid.response_id(), {}, std::move(err)); if (res) { auto s = actor_cast<strong_actor_ptr>(x.sender); if (s) s->enqueue(std::move(res), ctx); } return true; } return false; }
typename Inspector::result_type inspect(Inspector& f, mailbox_element& x) { return f(meta::type_name("mailbox_element"), x.sender, x.mid, meta::omittable_if_empty(), x.stages, x.content()); }