continue_writing_result continue_writing() override { CPPA_LOG_TRACE(""); CPPA_LOG_DEBUG_IF(!m_has_unwritten_data, "nothing to write (done)"); while (m_has_unwritten_data) { size_t written; try { written = m_out->write_some(m_buf.data(), m_buf.size()); } catch (std::exception& e) { CPPA_LOG_ERROR(to_verbose_string(e)); static_cast<void>(e); // keep compiler happy return write_failure; } if (written != m_buf.size()) { CPPA_LOG_DEBUG("tried to write " << m_buf.size() << "bytes, " << "only " << written << " bytes written"); m_buf.erase_leading(written); return write_continue_later; } else { m_buf.clear(); m_has_unwritten_data = false; CPPA_LOG_DEBUG("write done, " << written << " bytes written"); } } return write_done; }
continue_helper& continue_helper::continue_with(behavior::continuation_fun f) { auto ref_opt = m_self->sync_handler(m_mid); if (ref_opt) { behavior cpy = *ref_opt; *ref_opt = cpy.add_continuation(std::move(f)); } else { CPPA_LOG_ERROR("failed to add continuation"); } return *this; }
void alteration(const continuable_reader_ptr& ptr, event_bitmask e, fd_meta_event etype) { native_socket_type fd; switch (e) { case event::read: fd = ptr->read_handle(); break; case event::write: { auto wptr = ptr->as_io(); if (wptr) fd = wptr->write_handle(); else { CPPA_LOG_ERROR("ptr->downcast() returned nullptr"); return; } break; } case event::both: { fd = ptr->read_handle(); auto wptr = ptr->as_io(); if (wptr) { auto wrfd = wptr->write_handle(); if (fd != wrfd) { CPPA_LOG_DEBUG("read_handle != write_handle, split " "into two function calls"); // split into two function calls e = event::read; alteration(ptr, event::write, etype); } } else { CPPA_LOG_ERROR("ptr->downcast() returned nullptr"); return; } break; } default: CPPA_LOG_ERROR("invalid bitmask"); return; } m_alterations.emplace_back(fd_meta_info(fd, ptr, e), etype); }
actor_ptr default_actor_addressing::get_or_put(const process_information& inf, actor_id aid) { auto result = get(inf, aid); if (result == nullptr) { CPPA_LOGMF(CPPA_INFO, self, "created new proxy instance; " << CPPA_TARG(inf, to_string) << ", " << CPPA_ARG(aid)); if (m_parent == nullptr) { CPPA_LOG_ERROR("m_parent == nullptr (cannot create proxy without MM)"); } else { auto ptr = make_counted<default_actor_proxy>(aid, new process_information(inf), m_parent); put(inf, aid, ptr); result = ptr; } } return result; }
void default_actor_addressing::write(serializer* sink, const actor_ptr& ptr) { CPPA_REQUIRE(sink != nullptr); if (ptr == nullptr) { CPPA_LOG_DEBUG("serialize nullptr"); sink->write_value(static_cast<actor_id>(0)); process_information::serialize_invalid(sink); } else { // local actor? if (!ptr->is_proxy()) { get_actor_registry()->put(ptr->id(), ptr); } auto pinf = m_pinf; if (ptr->is_proxy()) { auto dptr = ptr.downcast<default_actor_proxy>(); if (dptr) pinf = dptr->process_info(); else CPPA_LOG_ERROR("downcast failed"); } sink->write_value(ptr->id()); sink->write_value(pinf->process_id()); sink->write_raw(process_information::node_id_size, pinf->node_id().data()); } }