actor_ptr default_actor_addressing::read(deserializer* source) { CPPA_REQUIRE(source != nullptr); auto cname = source->seek_object(); if (cname == "@0") { CPPA_LOGMF(CPPA_DEBUG, self, "deserialized nullptr"); source->begin_object("@0"); source->end_object(); return nullptr; } else if (cname == "@actor") { process_information::node_id_type nid; source->begin_object(cname); auto aid = source->read<uint32_t>(); auto pid = source->read<uint32_t>(); source->read_raw(process_information::node_id_size, nid.data()); source->end_object(); // local actor? auto pinf = process_information::get(); if (pid == pinf->process_id() && nid == pinf->node_id()) { return get_actor_registry()->get(aid); } else { process_information tmp(pid, nid); return get_or_put(tmp, aid); } } else throw runtime_error("expected type name \"@0\" or \"@actor\"; " "found: " + cname); }
error load_actor(strong_actor_ptr& storage, execution_unit* ctx, actor_id aid, const node_id& nid) { if (!ctx) return sec::no_context; auto& sys = ctx->system(); if (sys.node() == nid) { storage = sys.registry().get(aid); CAF_LOG_DEBUG("fetch actor handle from local actor registry: " << (storage ? "found" : "not found")); return none; } auto prp = ctx->proxy_registry_ptr(); if (!prp) return sec::no_proxy_registry; // deal with (proxies for) remote actors storage = prp->get_or_put(nid, aid); return none; }
actor_ptr default_actor_addressing::read(deserializer* source) { CPPA_REQUIRE(source != nullptr); process_information::node_id_type nid; auto aid = source->read<uint32_t>(); auto pid = source->read<uint32_t>(); source->read_raw(process_information::node_id_size, nid.data()); // local actor? auto pinf = process_information::get(); if (aid == 0 && pid == 0) { return nullptr; } else if (pid == pinf->process_id() && nid == pinf->node_id()) { return get_actor_registry()->get(aid); } else { process_information tmp{pid, nid}; return get_or_put(tmp, aid); } }
actor_addr actor_namespace::read(deserializer* source) { CAF_ASSERT(source != nullptr); node_id::host_id_type hid; auto aid = source->read<uint32_t>(); // actor id source->read_raw(node_id::host_id_size, hid.data()); // host id auto pid = source->read<uint32_t>(); // process id node_id this_node = detail::singletons::get_node_id(); if (aid == 0 && pid == 0) { // 0:0 identifies an invalid actor return invalid_actor_addr; } if (pid == this_node.process_id() && hid == this_node.host_id()) { // identifies this exact process on this host, ergo: local actor auto a = detail::singletons::get_actor_registry()->get(aid); // might be invalid return a ? a->address() : invalid_actor_addr; } // identifies a remote actor; create proxy if needed return get_or_put({pid, hid}, aid)->address(); }