Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
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();
    }
}
Ejemplo n.º 3
0
 inline message_id_t request_id() const {
     return message_id_t(m_value & request_id_mask);
 }
Ejemplo n.º 4
0
 inline message_id_t response_id() const {
     return message_id_t(valid() ? m_value | response_flag_mask : 0);
 }