24#include "ipc/transport/struc/shm/schema/detail/serialization.capnp.h"
27#include <boost/move/unique_ptr.hpp>
28#include <boost/shared_ptr.hpp>
30#include <capnp/rpc-twoparty.h>
32#include <capnp/rpc.capnp.h>
33#include <flow/log/log.hpp>
52using Rpc_conn = ::capnp::TwoPartyVatNetworkBase::Connection;
81using Vat_id = ::capnp::rpc::twoparty::VatId;
369template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
371 public ::capnp::TwoPartyVatNetworkBase,
374 public flow::log::Log_context,
376 private boost::noncopyable
402 using Base = ::capnp::TwoPartyVatNetworkBase;
663 kj::Promise<kj::Own<Rpc_conn>>
accept()
override;
673 kj::Own<::capnp::RpcFlowController>
newStream()
override;
707 kj::Promise<void>
shutdown()
override;
967template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1006 void setFds(kj::Array<int> fds)
override;
1012 void send()
override;
1020 size_t sizeInWords()
override;
1088template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1124 kj::ArrayPtr<kj::AutoCloseFd> getAttachedFds()
override;
1132 size_t sizeInWords()
override;
1164template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1169 m_msg(std::move(msg)),
1170 m_shm_lnd_brw(m_daddy->m_shm_lnd_brw),
1171 m_shm_arena(m_daddy->m_shm_arena),
1173 m_capnp_msg_in_shm(m_daddy->get_logger(), m_shm_arena.get(),
1174 seg0_word_sz * sizeof(::
capnp::word))
1179template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1182template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1186 using ::capnp::AnyPointer;
1190 return m_capnp_msg_in_shm.template getRoot<AnyPointer>();
1193template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1196 using ::capnp::AnyPointer;
1197 namespace rpc = ::capnp::rpc;
1217 auto capnp_msg_in_heap_root
1218 = m_msg->getBody().initAs<schema::detail::CapnpRpcMsgTopSerialization>();
1220 const auto capnp_msg_in_shm_root_rdr = getBody().asReader();
1221 if (!Rpc_msg_in::isShortLivedRpcMessage(capnp_msg_in_shm_root_rdr))
1223 capnp_msg_in_heap_root.setIsShortLivedMsg(
false);
1226 const bool ok = m_capnp_msg_in_shm.lend(&capnp_msg_in_heap_root,
m_shm_lnd_brw.get());
1234 "Was asked to send a capnp-message by the RPC-system, but Capnp_message_builder::lend() "
1235 "yielded failure which means the Flow-IPC session just went down (on account of opposing "
1236 "process ending session, e.g., so it can exit), and this has been or will soon be "
1237 "reported via the Flow-IPC session on-error callback. Basically SHM cannot be used, so "
1238 "we cannot transmit a message with zero-copy over it. Stuff is going down. This is not "
1239 "usually some catastrophe; just the IPC conversation has finished.");
1244 const auto msg_out_sz_words = m_msg->sizeInWords();
1245 assert(msg_out_sz_words != 0);
1246 if (msg_out_sz_words > m_daddy->m_msg_out_max_sz_words)
1254 if (
const auto logger_ptr = m_daddy->get_logger())
1256 const auto log_component = m_daddy->get_log_component();
1257 if (logger_ptr->should_log(flow::log::Sev::S_TRACE, log_component))
1259 FLOW_LOG_SET_CONTEXT(logger_ptr, log_component);
1260 FLOW_LOG_TRACE_WITHOUT_CHECKING(
"Session_vat_network [" << *m_daddy <<
"]: Outgoing message send: "
1261 "next byte-streamed (little) message size updated: "
1262 "[" << m_daddy->m_msg_out_max_sz_words <<
"] words => "
1263 "[" << msg_out_sz_words <<
"] words.");
1267 m_daddy->m_msg_out_max_sz_words = msg_out_sz_words;
1271 if (
const auto logger_ptr = m_daddy->get_logger())
1273 const auto log_component = m_daddy->get_log_component();
1274 if (logger_ptr->should_log(flow::log::Sev::S_TRACE, log_component))
1276 const auto root_as_rpc_msg = capnp_msg_in_shm_root_rdr.template getAs<rpc::Message>();
1277 FLOW_LOG_SET_CONTEXT(logger_ptr, log_component);
1278 FLOW_LOG_TRACE_WITHOUT_CHECKING(
"Session_vat_network [" << *m_daddy <<
"]: Outgoing message send: "
1279 "message (possibly truncated) "
1281 "size = [" << m_capnp_msg_in_shm.sizeInWords() <<
"] words x "
1282 "[" <<
sizeof(::capnp::word) <<
"] bytes/word; outer serialization (of "
1283 "little SHM-handle+ in heap/to copy into transport) = "
1284 "[" << msg_out_sz_words <<
"] words.");
1285 FLOW_LOG_DATA(
"Here is the complete message:"
1293template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1339 return m_capnp_msg_in_shm.sizeInWords();
1342template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1345 m_msg->setFds(std::move(fds));
1350template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1354 m_msg(std::move(msg)),
1357 m_capnp_msg_in_shm(daddy->get_logger())
1359 namespace rpc = ::capnp::rpc;
1364 KJ_REQUIRE(!err_code,
1365 "Was asked to accept a capnp-in-message by the RPC-system, but Capnp_message_reader::borrow() "
1366 "yielded failure which means the Flow-IPC session just went down (on account of opposing "
1367 "process ending session, e.g., so it can exit), and this has been or will soon be "
1368 "reported via the Flow-IPC session on-error callback. Basically SHM cannot be used, so "
1369 "we cannot receive a message with zero-copy over it. Stuff is going down. This is not "
1370 "usually some catastrophe; just the IPC conversation has finished.");
1386 const auto logger_ptr = daddy->get_logger();
1389 const auto log_component = daddy->get_log_component();
1390 if (logger_ptr->should_log(flow::log::Sev::S_TRACE, log_component))
1392 FLOW_LOG_SET_CONTEXT(logger_ptr, log_component);
1394 const auto root_as_rpc_msg = root.template getAs<rpc::Message>();
1396 FLOW_LOG_TRACE_WITHOUT_CHECKING(
"Session_vat_network [" << *daddy <<
"]: Incoming message receive: "
1397 "message (possibly truncated) "
1400 "[" <<
sizeof(::capnp::word) <<
" bytes/word]; outer serialization (of "
1401 "little SHM-handle+ in heap/copied from transport) = "
1402 "[" <<
m_msg->sizeInWords() <<
"] words.");
1403 FLOW_LOG_DATA(
"Here is the complete message:"
1409template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1412template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1416 return m_capnp_msg_in_shm.template getRoot<::capnp::AnyPointer>();
1419template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1435 return m_capnp_msg_in_shm.sizeInWords();
1438template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1439kj::ArrayPtr<kj::AutoCloseFd>
1442 return m_msg->getAttachedFds();
1447template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1449 (flow::log::Logger* logger_ptr, kj::AsyncIoContext* kj_io,
1452 Native_handle&& bidir_transport,
unsigned int hndl_transport_limit_or_0) :
1464 using ::capnp::MallocMessageBuilder;
1465 using ::capnp::BufferedMessageStream;
1466 using ::capnp::ReaderOptions;
1467 using ::capnp::AnyPointer;
1468 using kj::newPromiseAndFulfiller;
1469 using boost::movelib::make_unique;
1477 assert(bidir_transport.null());
1480 "Either specify neither or both; just one is weird.");
1486 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: Constructing Session_vat_network: "
1488 "session/SHM session/borrower-lender [" << *
m_shm_lnd_brw <<
"], "
1490 "bidirectional byte transport native-handle [" << bidir_transport_hndl.get() <<
"], "
1491 "in-FD count limit (0 = do not transmit native handles) = [" << hndl_transport_limit_or_0 <<
"].");
1495 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: Constructing Session_vat_network: "
1496 "degenerate mode -- no zero-copy enabled -- will be identical to regular TwoPartyVatNetwork; "
1498 "bidirectional byte transport native-handle [" << bidir_transport_hndl.get() <<
"], "
1499 "in-FD count limit (0 = do not transmit native handles) = [" << hndl_transport_limit_or_0 <<
"].");
1539 BufferedMessageStream::IsShortLivedCallback is_short_lived_msg_func;
1546 return msg_in.getRoot<AnyPointer>().
template getAs<schema::detail::CapnpRpcMsgTopSerialization>()
1547 .getIsShortLivedMsg();
1552 is_short_lived_msg_func = Rpc_msg_in::getShortLivedCallback();
1555 ReaderOptions network_reader_opts;
1563 network_reader_opts.traversalLimitInWords = std::numeric_limits<uint64_t>::max() /
sizeof(::capnp::word);
1566 if (hndl_transport_limit_or_0 == 0)
1571 kj::LowLevelAsyncIoProvider::TAKE_OWNERSHIP);
1573 std::move(is_short_lived_msg_func));
1576 : ::capnp::rpc::twoparty::Side::CLIENT,
1577 network_reader_opts);
1586 kj::LowLevelAsyncIoProvider::TAKE_OWNERSHIP);
1588 std::move(is_short_lived_msg_func));
1591 : ::capnp::rpc::twoparty::Side::CLIENT,
1592 network_reader_opts);
1608 constexpr size_t VAT_ID_SZ = 4;
1614 MallocMessageBuilder peer_vat_id{VAT_ID_SZ};
1615 peer_vat_id.initRoot<
Vat_id>()
1617 : ::capnp::rpc::twoparty::Side::SERVER);
1618 auto conn_uptr_maybe =
m_network->connect(peer_vat_id.getRoot<
Vat_id>());
1619 KJ_IF_MAYBE(conn_uptr_ptr, conn_uptr_maybe)
1621 m_conn = std::move(*conn_uptr_ptr);
1625 FLOW_LOG_FATAL(
"Session_vat_network [" << *
this <<
"]: "
1626 "There is no reason for TwoPartyVatNetwork::connect() to fail here; "
1627 "it should have essentially just returned its `*this`. Yet it failed. Bug? Aborting.");
1634 auto paf = newPromiseAndFulfiller<void>();
1640template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1642 (flow::log::Logger* logger_ptr, kj::AsyncIoContext* kj_io,
1644 Native_handle&& bidir_transport,
unsigned int hndl_transport_limit_or_0) :
1648 std::move(shm_enabled_session),
1650 shm_enabled_session ?
Shm_arena_ptr{shm_enabled_session, shm_enabled_session->session_shm()}
1652 std::move(bidir_transport), hndl_transport_limit_or_0)
1657template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1660 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1661 "Shutting down. Any RPC-system relying on us must have already also shut down; or there might be "
1665template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1669 using ::capnp::sizeInWords;
1680 return m_shm_lnd_brw
1681 ? kj::heap<Rpc_msg_out_impl>
1682 (m_conn->newOutgoingMessage((m_msg_out_max_sz_words == 0)
1684 + sizeInWords<schema::detail::CapnpRpcMsgTopSerialization>())
1685 : m_msg_out_max_sz_words),
1688 : m_conn->newOutgoingMessage(seg0_word_sz);
1691template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1692kj::Promise<kj::Maybe<kj::Own<Rpc_msg_in>>>
1702 auto vanilla_result = m_conn->receiveIncomingMessage();
1705 return vanilla_result;
1709 return vanilla_result.then([
this](kj::Maybe<kj::Own<Rpc_msg_in>>&& msg_uptr_maybe)
1710 -> kj::Maybe<kj::Own<Rpc_msg_in>>
1712 KJ_IF_MAYBE(msg_uptr_ptr, msg_uptr_maybe)
1715 return kj::heap<Rpc_msg_in_impl>(kj::mv(*msg_uptr_ptr),
this);
1722template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1731 if (ref.getSide() == (m_srv_else_cli ? ::capnp::rpc::twoparty::Side::SERVER
1732 : ::capnp::rpc::twoparty::Side::CLIENT))
1734 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1735 "Session_vat_network::connect() invoked (perhaps by a capnp RPC-system) "
1736 "targeting our own side: failure. This appears, empirically, to be normal "
1737 "behavior by RpcSystem-et-al, hence this message is not a WARNING.");
1741 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1742 "Session_vat_network::connect() invoked (perhaps by a capnp RPC-system) "
1743 "properly targeting the other side: success.");
1744 return as_connection();
1747template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1761 if (m_srv_else_cli && (!m_accepted))
1763 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1764 "Session_vat_network::accept() invoked (perhaps by a capnp RPC-system) "
1765 "1st time for node with ID = [srv_else_cli=1]: success.");
1767 return as_connection();
1773 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1774 "Session_vat_network::accept() invoked (perhaps by a capnp RPC-system) "
1775 "in node with ID = [srv_else_cli=1] after earlier having done so already; "
1776 "returning eternal promise. This appears, empirically, to be normal "
1777 "behavior by RpcSystem-et-al, hence this message is not a WARNING.");
1781 FLOW_LOG_INFO(
"Session_vat_network [" << *
this <<
"]: "
1782 "Session_vat_network::accept() invoked (perhaps by a capnp RPC-system) "
1783 "in node with ID = [srv_else_cli=0]: returning eternal promise.");
1791 auto paf = kj::newPromiseAndFulfiller<kj::Own<Rpc_conn>>();
1792 m_accept_fulfiller = std::move(paf.fulfiller);
1793 return std::move(paf.promise);
1796template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1799 assert(((m_streaming_flow_window_sz % 1024) == 0)
1800 &&
"How did m_streaming_flow_window_sz get set to a non-multiple of Ki? Maintenance drift bug?");
1801 return m_streaming_flow_window_sz / 1024;
1804template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1807 KJ_REQUIRE(limit_ki > 0,
1808 "limit_ki=0 is forbidden by contract");
1814 FLOW_LOG_TRACE(
"Session_vat_network [" << *
this <<
"]: User setting streaming flow control window to "
1815 "[" << limit_ki <<
"Ki]; replacing current setting [" << streaming_flow_window_ki() <<
"Ki].");
1817 m_streaming_flow_window_sz = (limit_ki * 1024);
1820template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1823 return m_streaming_flow_window_sz;
1826template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1829 using ::capnp::RpcFlowController;
1836 return m_shm_lnd_brw ? RpcFlowController::newVariableWindowController(*
this)
1837 : m_conn->newStream();
1840template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1843 return m_conn->getPeerVatId();
1846template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1849 return m_conn->shutdown();
1852template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1857 ++m_disconnect_fulfiller.m_ref_count;
1859 return kj::Own<Rpc_conn>(
this, m_disconnect_fulfiller);
1862template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1865 return m_disconnect_promise.addBranch();
1868template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1871 return on_disconnect();
1879template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1884 if ((--m_ref_count) == 0)
1886 m_fulfiller->fulfill();
1893template<
typename Shm_lender_borrower_t,
typename Shm_arena_t>
1896 return os <<
'@' << &val;
static constexpr size_t S_MAX_SERIALIZATION_SEGMENT_SZ
A message of this size will be able to completely contain the (single) segment emitted by Builder::em...
A capnp::MessageBuilder used by shm::Builder and for general capnp users: similar to a MallocMessageB...
A capnp::MessageReader used by shm::Reader and for general capnp users: able to access capnp-serializ...
Inner impl class in Session_vat_network, implementing capnp::IncomingRpcMessage, which makes up rough...
kj::Own< Rpc_msg_in > m_msg
The vanilla TwoPartyVatNetwork-generated Rpc_msg_in, storing the capnp-encoded SHM-handle which m_cap...
kj::ArrayPtr< kj::AutoCloseFd > getAttachedFds() override
Implements Rpc_msg_in API.
::capnp::AnyPointer::Reader getBody() override
Implements Rpc_msg_in API.
virtual ~Rpc_msg_in_impl()
Boring virtual destructor.
Rpc_msg_in_impl(kj::Own< Rpc_msg_in > &&msg, Session_vat_network *daddy)
Saves the TwoPartyVatNetwork Rpc_msg_in impl, as created by Session_vat_network::m_network,...
const Shm_lender_borrower_ptr m_shm_lnd_brw
Copy of Session_vat_network::m_shm_lnd_brw: keeps the lender-borrower – the executor of ....
size_t sizeInWords() override
Implements Rpc_msg_in API.
Capnp_message_reader< Shm_arena > m_capnp_msg_in_shm
The capnp::MessageReader that stores the capnp-serialization needed by the user of a *this (which we ...
Inner impl class in Session_vat_network, implementing capnp::OutgoingRpcMessage, which makes up rough...
const Shm_lender_borrower_ptr m_shm_lnd_brw
Copy of Session_vat_network::m_shm_lnd_brw: keeps the lender-borrower alive until *this is destroyed,...
Rpc_msg_out_impl(kj::Own< Rpc_msg_out > &&msg, size_t seg0_word_sz, Session_vat_network *daddy)
Saves the TwoPartyVatNetwork Rpc_msg_out impl, as created by Session_vat_network::m_network,...
kj::Own< Rpc_msg_out > m_msg
The vanilla TwoPartyVatNetwork-generated Rpc_msg_out, where we shall store capnp-encoded SHM-handle f...
Capnp_message_builder< Shm_arena > m_capnp_msg_in_shm
The capnp::MessageBuilder that stores the capnp-serialization needed by the user of a *this (which we...
virtual ~Rpc_msg_out_impl()
Boring virtual destructor.
size_t sizeInWords() override
Implements Rpc_msg_out API.
void send() override
Implements Rpc_msg_out API.
const Shm_arena_ptr m_shm_arena
Copy of Session_vat_network::m_shm_arena; see m_shm_lnd_brw.
::capnp::AnyPointer::Builder getBody() override
Implements Rpc_msg_out API.
void setFds(kj::Array< int > fds) override
Implements Rpc_msg_out API.
Session_vat_network *const m_daddy
The containing Session_vat_network.
The core class of Flow-IPC's zero-copyification-of-capnp-RPC module, Session_vat_network implements c...
kj::Promise< void > on_disconnect()
Yields a promise that is fulfilled when all Rpc_conns returned by connect() and accept() are allowed ...
Shm_arena_t Shm_arena
Short-hand for Shm_arena_t template parameter.
Shm_lender_borrower_t Shm_lender_borrower
Short-hand for Shm_lender_borrower_t template parameter.
boost::shared_ptr< Shm_arena > Shm_arena_ptr
Shared handle to a Shm_arena. See Shm_lender_borrower_ptr.
size_t streaming_flow_window_ki() const
The -> stream flow control window limit, in kebibytes, used by capnp-RPC w/r/t the sum of in-SHM stre...
kj::Promise< kj::Maybe< kj::Own< Rpc_msg_in > > > receiveIncomingMessage() override
Implements capnp::VatNetwork API.
Kj_stream_of_blob_hndls_ptr m_kj_stream_of_blobs_hndls
If in ctor hndl_transport_limit_or_0 == 0, this is null; else this is the low-level byte-stream used ...
kj::ForkedPromise< void > m_disconnect_promise
See on_disconnect(): the promise returned there, whose fulfillment indicates that for each successful...
Session_vat_network(flow::log::Logger *logger_ptr, kj::AsyncIoContext *kj_io, Shm_lender_borrower_ptr &&shm_enabled_session, Native_handle &&bidir_transport, unsigned int hndl_transport_limit_or_0=S_N_MAX_INCOMING_FDS)
Constructs the VatNetwork, making it ready for use in an Rpc_system: mainstream (session) form.
kj::Promise< void > onDisconnect()
Identical to on_disconnect().
kj::Promise< void > shutdown() override
Implements capnp::VatNetwork API.
boost::movelib::unique_ptr<::capnp::BufferedMessageStream > m_capnp_msg_stream
The next layer on top of m_kj_stream_of_blobs*, this is the capnp-encoded-message (plus possibly nati...
size_t getWindow() override
Implements capnp::RpcFlowController::WindowGetter API.
boost::shared_ptr< Shm_lender_borrower > Shm_lender_borrower_ptr
Shared handle to a Shm_lender_borrower: how a ctor takes it, and how *this and each capnp-message it ...
kj::Own< Rpc_conn > as_connection()
The core of connect() and accept(), used whenever those actually succeed: returns *this as an Rpc_con...
kj::Promise< kj::Own< Rpc_conn > > accept() override
Implements capnp::VatNetwork API.
kj::Own< kj::PromiseFulfiller< kj::Own< Rpc_conn > > > m_accept_fulfiller
Fulfiller for the promise returned by accept() on the client side, or the second call on the server s...
const bool m_srv_else_cli
Node ID: we are either designated server or client.
virtual ~Session_vat_network()
Boring virtual destructor. It logs.
::capnp::TwoPartyVatNetworkBase Base
Alias for our base class which incidentally is the interface VatNetwork<...>.
kj::Own< Rpc_conn > m_conn
This is m_network essentially cast as an Rpc_conn impl: see as_connection() body.
std::optional<::capnp::TwoPartyVatNetwork > m_network
The Big Kahuna of our impl, this is the TwoPartyVatNetwork we reuse to transmit messages back and for...
const Shm_arena_ptr m_shm_arena
The user-supplied object with .construct<T>() method that enables the allocation/construction of SHM-...
Vat_id::Reader getPeerVatId() override
Implements capnp::VatNetwork API.
const Shm_lender_borrower_ptr m_shm_lnd_brw
The user-supplied object with .borrow_object() and .lend_object() methods that enable the sharing of ...
kj::AsyncIoContext *const m_kj_io
KJ event loop context.
kj::Own< Rpc_msg_out > newOutgoingMessage(unsigned int seg0_word_sz) override
Implements capnp::VatNetwork API.
kj::Own<::capnp::RpcFlowController > newStream() override
Implements capnp::VatNetwork API.
Kj_stream_of_blobs_ptr m_kj_stream_of_blobs
If in ctor hndl_transport_limit_or_0 != 0, this is null; else this is the low-level byte-stream used ...
kj::Maybe< kj::Own< Rpc_conn > > connect(Vat_id::Reader ref) override
Implements capnp::VatNetwork API.
kj::Own< kj::AsyncCapabilityStream > Kj_stream_of_blob_hndls_ptr
Convenience alias for how capnp-RPC passes-around handle-transport-capable byte streams.
bool m_accepted
Guards from allowing 2nd accept() (there is only 1 connection on server side in a 2-party network).
Fulfiller_disposer m_disconnect_fulfiller
Disposer for all Own<Rpc_conn>s returned by connect() and accept().
kj::Own< kj::AsyncIoStream > Kj_stream_of_blobs_ptr
Convenience alias for how capnp-RPC passes-around non-handle-transport-capable byte streams.
size_t m_streaming_flow_window_sz
The value returned by streaming_flow_window_ki() except in bytes.
size_t m_msg_out_max_sz_words
Starting at 0 (unknown), this is both (1) the first-segment-size (in capnp::words) for the next outgo...
Small group of miscellaneous utilities to ease work with capnp (Cap'n Proto), joining its capnp names...
Builder< ipc::shm::classic::Pool_arena > Builder
Convenience alias: transport::struc::shm::Builder that works with boost.ipc.shm pools from ipc::shm::...
Reader< ipc::shm::classic::Pool_arena > Reader
Convenience alias: transport::struc::shm::Reader that works with boost.ipc.shm pools from ipc::shm::c...
Provides Flow-IPC's integration with Cap'n Proto's Remote Procedure Call (RPC) layer,...
::capnp::rpc::twoparty::VatId Vat_id
Flow-IPC-styled alias for the node ID in a Session_vat_network or TwoPartyVatNetwork: namely an enume...
std::ostream & operator<<(std::ostream &os, const Client_context< Client_session_t > &val)
Prints string representation of the given Client_context to the given ostream.
::capnp::RpcSystem< Vat_id > Rpc_system
Concrete capnp::RpcSystem to be used with Session_vat_network or TwoPartyVatNetwork.
Ostreamable_capnp_brief< Capnp_reader > ostreamable_capnp_brief(const Capnp_reader &capnp_reader)
Convenience function that returns an object passable to ostream<< to print a one-line/potentially-tru...
Ostreamable_capnp_full< Capnp_reader > ostreamable_capnp_full(const Capnp_reader &capnp_reader)
Convenience function that returns an object passable to ostream<< to print a multi-line/pretty-printe...
::capnp::MessageReader Capnp_msg_reader_interface
Alias for capnp's MessageReader interface. Rationale: as part of our API, we use our identifier style...
Native_handle disowned_native_handle(Own_native_handle &&src) noexcept
Returns Native_handle constructed by relieving an existing auto-closing Own_native_handle of its owne...
boost::scope::unique_resource< Native_handle, Native_handle::Closer, Native_handle > Own_native_handle
A unique_resource wrapper for Native_handle useful to avoid descriptor leaks and double-closing; can ...
Log_component
The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
flow::Error_code Error_code
Short-hand for flow::Error_code which is very common.
Disposer for Own<Rpc_conn> returned by connect() and accept() which (1) does not delete anything and ...
kj::Own< kj::PromiseFulfiller< void > > m_fulfiller
It is the fulfiller of Session_vat_network::m_disconnect_promise.
void disposeImpl(void *) const override
Implements interface by noting that the tracked Rpc_conn has one fewer outstanding handle; and if tha...
unsigned int m_ref_count
Number of times Session_vat_network::as_connection() executed minus the number of the returned Own<Rp...
Non-template base for Session_vat_network (constants, types, and what-not).
static constexpr size_t S_STREAMING_FLOW_WINDOW_KI
Reasonable default for Session_vat_network::streaming_flow_window_ki(). See the doc header for the la...
static constexpr unsigned int S_N_MAX_INCOMING_FDS
Reasonable default for hndl_transport_limit_or_0 arg to Session_vat_network ctors,...
A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
handle_t m_native_handle
The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.