bool invoke(Policy& policy, Client* client, recursive_queue_node* node) { CPPA_REQUIRE(!m_elements.empty()); CPPA_REQUIRE(client != nullptr); CPPA_REQUIRE(node != nullptr); // use a copy, because the invoked behavior might change m_elements behavior what = m_elements.back().first; auto id = m_elements.back().second; if (policy.invoke(client, node, what, id)) { // try to match cached messages do { // remove synchronous response handler if needed if (id.valid()) { auto last = m_elements.end(); auto i = std::find_if(m_elements.begin(), last, [id](element_type& e) { return id == e.second; }); if (i != last) { m_erased_elements.emplace_back(std::move(i->first)); m_elements.erase(i); } } id = empty() ? message_id_t() : m_elements.back().second; } while (!empty() && policy.invoke_from_cache(client, back(), id)); return true; } return false; }
void local_actor::forward_message(const actor_ptr& new_receiver) { if (new_receiver == nullptr) { return; } auto& from = last_sender(); auto id = m_current_node->mid; if (id.valid() == false || id.is_response()) { new_receiver->enqueue(from.get(), m_current_node->msg); } else { new_receiver->sync_enqueue(from.get(), id, m_current_node->msg); // treat this message as asynchronous message from now on m_current_node->mid = message_id_t(); } }
inline message_id_t request_id() const { return message_id_t(m_value & request_id_mask); }
inline message_id_t response_id() const { return message_id_t(valid() ? m_value | response_flag_mask : 0); }