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; } } }
void launch(Actor* self, execution_unit*) { CPPA_REQUIRE(self != nullptr); CPPA_PUSH_AID(self->id()); CPPA_LOG_TRACE(CPPA_ARG(self)); intrusive_ptr<Actor> mself{self}; self->attach_to_scheduler(); std::thread([=] { CPPA_PUSH_AID(mself->id()); CPPA_LOG_TRACE(""); detail::cs_thread fself; for (;;) { if (mself->resume(&fself, nullptr) == resumable::done) { return; } // await new data before resuming actor await_data(mself.get()); CPPA_REQUIRE(self->mailbox().blocked() == false); } self->detach_from_scheduler(); }).detach(); }