void broker::scribe::consume(const void*, size_t num_bytes) { CAF_LOG_TRACE(CAF_ARG(num_bytes)); if (m_disconnected) { // we are already disconnected from the broker while the multiplexer // did not yet remove the socket, this can happen if an IO event causes // the broker to call close_all() while the pollset contained // further activities for the broker return; } auto& buf = rd_buf(); buf.resize(num_bytes); // make sure size is correct read_msg().buf.swap(buf); // swap into message m_broker->invoke_message(invalid_actor_addr, // call client invalid_message_id, m_read_msg); read_msg().buf.swap(buf); // swap buffer back to stream flush(); // implicit flush of wr_buf() }
void scribe::consume(execution_unit* ctx, const void*, size_t num_bytes) { CAF_ASSERT(ctx != nullptr); CAF_LOG_TRACE(CAF_ARG(num_bytes)); if (detached()) { // we are already disconnected from the broker while the multiplexer // did not yet remove the socket, this can happen if an IO event causes // the broker to call close_all() while the pollset contained // further activities for the broker return; } // keep a strong reference to our parent until we leave scope // to avoid UB when becoming detached during invocation auto guard = parent_; auto& buf = rd_buf(); CAF_ASSERT(buf.size() >= num_bytes); // make sure size is correct, swap into message, and then call client buf.resize(num_bytes); auto& msg_buf = msg().buf; msg_buf.swap(buf); invoke_mailbox_element(ctx); // swap buffer back to stream and implicitly flush wr_buf() msg_buf.swap(buf); flush(); }