bool abstract_actor::link_to_impl(const actor_addr& other) { if (other && other != this) { guard_type guard{m_mtx}; auto ptr = actor_cast<abstract_actor_ptr>(other); // send exit message if already exited if (exited()) { ptr->enqueue(address(), message_id::invalid, make_message(exit_msg{address(), exit_reason()}), m_host); } // add link if not already linked to other // (checked by establish_backlink) else if (ptr->establish_backlink(address())) { m_links.push_back(ptr); return true; } } return false; }
bool abstract_actor::establish_link_impl(const actor_addr& other) { CAF_LOG_TRACE(CAF_TSARG(other)); if (other && other != this) { guard_type guard{mtx_}; auto ptr = actor_cast<abstract_actor_ptr>(other); // send exit message if already exited if (exited()) { ptr->enqueue(address(), invalid_message_id, make_message(exit_msg{address(), exit_reason()}), host_); } else if (ptr->establish_backlink(address())) { // add link if not already linked to other // (checked by establish_backlink) auto tmp = default_attachable::make_link(other); attach_impl(tmp); return true; } } return false; }
bool abstract_actor::link_to_impl(const actor_addr& other) { if (other && other != this) { guard_type guard{m_mtx}; auto ptr = detail::raw_access::get(other); // send exit message if already exited if (exited()) { ptr->enqueue({address(), ptr}, make_any_tuple(exit_msg{address(), exit_reason()}), m_host); } // add link if not already linked to other // (checked by establish_backlink) else if (ptr->establish_backlink(address())) { m_links.push_back(ptr); return true; } } return false; }