void blocking_actor::dequeue(behavior& bhvr, message_id mid) { CAF_LOG_TRACE(CAF_MARG(mid, integer_value)); // try to dequeue from cache first if (invoke_from_cache(bhvr, mid)) { return; } // requesting an invalid timeout will reset our active timeout uint32_t timeout_id = 0; if (mid == invalid_message_id) { timeout_id = request_timeout(bhvr.timeout()); } else { request_sync_timeout_msg(bhvr.timeout(), mid); } // read incoming messages for (;;) { await_data(); auto msg = next_message(); switch (invoke_message(msg, bhvr, mid)) { case im_success: if (mid == invalid_message_id) { reset_timeout(timeout_id); } return; case im_skipped: if (msg) { push_to_cache(std::move(msg)); } break; default: // delete msg break; } } }
void blocking_actor::dequeue(behavior& bhvr, message_id mid) { // try to dequeue from cache first if (invoke_from_cache(bhvr, mid)) { return; } // requesting an invalid timeout will reset our active timeout auto timeout_id = request_timeout(bhvr.timeout()); // read incoming messages for (;;) { await_data(); auto msg = next_message(); switch (invoke_message(msg, bhvr, mid)) { case im_success: reset_timeout(timeout_id); return; case im_skipped: if (msg) { push_to_cache(std::move(msg)); } break; default: // delete msg break; } } }
inline void handle_timeout(behavior& bhvr) { bhvr.handle_timeout(); }