예제 #1
0
 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;
 }
예제 #2
0
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());
    }
}