| 161 | } |
| 162 | |
| 163 | bool instance::dispatch(scheduler* ctx, const strong_actor_ptr& sender, |
| 164 | const node_id& dest_node, uint64_t dest_actor, |
| 165 | uint8_t flags, message_id mid, const message& msg) { |
| 166 | auto lg = log::io::trace("sender = {}, dest_node = {}, mid = {}, msg = {}", |
| 167 | sender, dest_node, mid, msg); |
| 168 | CAF_ASSERT(dest_node && this_node_ != dest_node); |
| 169 | auto path = lookup(dest_node); |
| 170 | if (!path) |
| 171 | return false; |
| 172 | auto& source_node = sender ? sender->node() : this_node_; |
| 173 | if (dest_node == path->next_hop && source_node == this_node_) { |
| 174 | header hdr{message_type::direct_message, |
| 175 | flags, |
| 176 | 0, |
| 177 | mid.integer_value(), |
| 178 | sender ? sender->id() : invalid_actor_id, |
| 179 | dest_actor}; |
| 180 | auto writer = make_callback([&](binary_serializer& sink) { // |
| 181 | return sink.apply(msg); |
| 182 | }); |
| 183 | write(*sys_, ctx, callee_.get_buffer(path->hdl), hdr, &writer); |
| 184 | } else { |
| 185 | header hdr{message_type::routed_message, |
| 186 | flags, |
| 187 | 0, |
| 188 | mid.integer_value(), |
| 189 | sender ? sender->id() : invalid_actor_id, |
| 190 | dest_actor}; |
| 191 | auto writer = make_callback([&](binary_serializer& sink) { |
| 192 | log::io::debug( |
| 193 | "send routed message: source_node = {} dest_node = {} msg = {}", |
| 194 | source_node, dest_node, msg); |
| 195 | return sink.apply(source_node) // |
| 196 | && sink.apply(dest_node) // |
| 197 | && sink.apply(msg); |
| 198 | }); |
| 199 | write(*sys_, ctx, callee_.get_buffer(path->hdl), hdr, &writer); |
| 200 | } |
| 201 | flush(*path); |
| 202 | return true; |
| 203 | } |
| 204 | |
| 205 | void instance::write(actor_system& sys, scheduler*, byte_buffer& buf, |
| 206 | header& hdr, payload_writer* pw) { |
no test coverage detected