diff --git a/doc/ipc_doc/generated/html_full/about.html b/doc/ipc_doc/generated/html_full/about.html index e1016cbc8..23a06f9c4 100644 --- a/doc/ipc_doc/generated/html_full/about.html +++ b/doc/ipc_doc/generated/html_full/about.html @@ -21,7 +21,7 @@ -
Flow-IPC 1.0.1 +
Flow-IPC 1.0.2
Flow-IPC project: Full implementation reference.
@@ -122,7 +122,7 @@

Future directions of work

  • Networked IPC: At the moment all IPC supported by Flow-IPC is between processes within a given machine (node). A session can only be established that way for now. Extending this to establish IPC sessions via network would be easy. Unix-domain-socket-based low-level transports would easily be extended to work via TCP sockets (at least). This is a very natural next step for Flow-IPC development: a low-hanging fruit.
  • Networked "shared memory" (RDMA): While the preceding bullet point would have clear utility, naturally the zero-copy aspect of the existing Flow-IPC cannot directly translate across a networked session: It is internally achieved using SHM, but there is no shared memory between two separate machines. There is, however, Remote Direct Memory Access (RDMA): direct memory access from the memory of one computer into that of another without involving either one's OS. While assuredly non-trivial, leveraging RDMA in Flow-IPC might allow for a major improvement over the feature in the preceding bullet point, analogously to how SHM-based zero-copy hugely improves upon basic IPC.
  • Beyond C++: This is a C++ project at this time, but languages including Rust and Go have gained well-deserved popularity as well. In a similar way that (for example) Cap'n Proto's original core is in C++, but there are implementations for other languages, it would make sense for the same to happen for Flow-IPC. There are no technical stumbling blocks for this; it is only a question of time and effort.
  • -
  • More architectures: As of this writing, Flow-IPC targets Linux + x86-64. MacOS/Darwin/FreeBSD support is attainable with a few weeks of work, we estimate. (Could tackle Windows as well.) Supporting other hardware architectures, such as ARM64, is also doable and valuable. We'd like to do these things: by far most of the code is platform-independent, the exceptions being certain internal low-level details typically involving shared memory and pointer tagging in the SHM-jemalloc sub-component.
  • +
  • More architectures: As of this writing, Flow-IPC targets Linux + x86-64. macOS/Darwin/similar support is attainable with a few weeks of work, we estimate. (Could tackle Windows as well.) Supporting other hardware architectures, such as ARM64, is also doable and valuable. We'd like to do these things: by far most of the code is platform-independent, the exceptions being certain internal low-level details typically involving shared memory and pointer tagging in the SHM-jemalloc sub-component.
  • We welcome feedback, ideas, and (of course) pull requests of all kinds!


    @@ -132,7 +132,7 @@

    Future directions of work

    diff --git a/doc/ipc_doc/generated/html_full/annotated.html b/doc/ipc_doc/generated/html_full/annotated.html index 4c1b891ca..470c6daaf 100644 --- a/doc/ipc_doc/generated/html_full/annotated.html +++ b/doc/ipc_doc/generated/html_full/annotated.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -241,7 +241,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/api_overview.html b/doc/ipc_doc/generated/html_full/api_overview.html index c241ba960..16e7ff171 100644 --- a/doc/ipc_doc/generated/html_full/api_overview.html +++ b/doc/ipc_doc/generated/html_full/api_overview.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -140,7 +140,7 @@

    Sessions

    // NOTE: Upon opening session, capabilities of `session` on either side are **exactly the same**.
    // Client/server status matters only when establishing the IPC conversation;
    // the conversation itself once established is arbitrariy and up to you fully.
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    Open channel(s) in a session:

    @@ -341,20 +341,20 @@

    Transport (unstructured)

    ipc::transport::Mqs_socket_stream_channel
    A Channel with a blobs pipe consisting of 2 MQs of type Persistent_mq_handle (template arg); and a ha...
    Definition: channel.hpp:1278
    ipc::transport::Native_socket_stream_acceptor
    A server object that binds to a Shared_name and listens for incoming Native_socket_stream connect att...
    Definition: native_socket_stream_acceptor.hpp:105
    ipc::transport::Native_socket_stream
    Implements both Native_handle_sender and Native_handle_receiver concepts by using a stream-oriented U...
    Definition: native_socket_stream.hpp:271
    -
    ipc::transport::Posix_mq_handle
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    Definition: posix_mq_handle.hpp:62
    +
    ipc::transport::Posix_mq_handle
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    Definition: posix_mq_handle.hpp:63
    ipc::transport::Socket_stream_channel_of_blobs
    A Channel with a blobs pipe only (no handles pipe) that uses a Unix domain socket connection as the u...
    Definition: channel.hpp:1097
    ipc::transport::Socket_stream_channel
    A Channel with a handles pipe only (no blobs pipe) that uses a Unix domain socket connection as the u...
    Definition: channel.hpp:1029
    ipc::util::Process_credentials
    A process's credentials (PID, UID, GID as of this writing).
    Definition: process_credentials.hpp:39
    ipc::util::Process_credentials::process_invoked_as
    std::string process_invoked_as(Error_code *err_code=0) const
    Obtains, from the OS, information as to the binary name via which process process_id() was started,...
    Definition: process_credentials.cpp:62
    ipc::transport::asio_local_stream_socket::local_ns
    Short-hand for boost.asio Unix domain socket namespace.
    ipc::transport::asio_local_stream_socket::Peer_socket
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    Definition: asio_local_stream_socket_fwd.hpp:114
    -
    ipc::transport
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    Definition: asio_local_stream_socket.cpp:31
    +
    ipc::transport
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    Definition: asio_local_stream_socket.cpp:32
    ipc::util
    Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
    Definition: default_init_allocator.hpp:24
    ipc::util::OPEN_OR_CREATE
    const Open_or_create OPEN_OR_CREATE
    Tag value indicating an open-if-exists-else-create operation.
    Definition: util.cpp:30
    ipc::util::OPEN_ONLY
    const Open_only OPEN_ONLY
    Tag value indicating an atomic open-if-exists-else-fail operation.
    Definition: util.cpp:31
    -
    ipc::util::Blob_mutable
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    ipc::util::Blob_const
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    ipc::util::Native_handle
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    Definition: native_handle.hpp:62
    +
    ipc::util::Blob_mutable
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    ipc::util::Blob_const
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    ipc::util::Native_handle
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    Definition: native_handle.hpp:63

    All those subleties about different types of pipes in a Channel bundle completely disappear when one deals with structured-data struc::Channels. They are a higher-layer abstraction and will leverage whatever transport::Channel it adapts. In addition to handling capnp-encoded structured data and SHM-backed zero-copy, it also provides basics like request/response, request-method multiplexing, and a bit more. So let's get into that.

    Transport (structured)

    @@ -681,7 +681,7 @@

    Safety

    diff --git a/doc/ipc_doc/generated/html_full/app_8cpp.html b/doc/ipc_doc/generated/html_full/app_8cpp.html index c4fea7990..4b99baf09 100644 --- a/doc/ipc_doc/generated/html_full/app_8cpp.html +++ b/doc/ipc_doc/generated/html_full/app_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -112,7 +112,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/app_8cpp_source.html b/doc/ipc_doc/generated/html_full/app_8cpp_source.html index 27a573037..c540586d3 100644 --- a/doc/ipc_doc/generated/html_full/app_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/app_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -218,7 +218,7 @@
    void ensure_resource_owner_is_app(flow::log::Logger *logger_ptr, const fs::path &path, const App &app, Error_code *err_code)
    Utility, used internally but exposed in public API in case it is of general use, that checks that the...
    Definition: app.cpp:31
    std::ostream & operator<<(std::ostream &os, const App &val)
    Prints string representation of the given App to the given ostream.
    Definition: app.cpp:124
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    A description of an application in this ipc::session inter-process communication universe.
    Definition: app.hpp:78
    @@ -229,13 +229,13 @@
    An App that is used as a client in at least one client-server IPC split.
    Definition: app.hpp:185
    An App that is used as a server in at least one client-server IPC split.
    Definition: app.hpp:206
    Client_app_set m_allowed_client_apps
    A given Client_app (as identified by its distinct App::m_name) may request to establish an IPC sessio...
    Definition: app.hpp:222
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    -
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    diff --git a/doc/ipc_doc/generated/html_full/app_8hpp.html b/doc/ipc_doc/generated/html_full/app_8hpp.html index 8b09b5918..80d0c10a5 100644 --- a/doc/ipc_doc/generated/html_full/app_8hpp.html +++ b/doc/ipc_doc/generated/html_full/app_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,7 +102,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/app_8hpp_source.html b/doc/ipc_doc/generated/html_full/app_8hpp_source.html index de198978f..7ba70e944 100644 --- a/doc/ipc_doc/generated/html_full/app_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/app_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -364,9 +364,9 @@
    292
    293} // namespace ipc::session
    Flow-IPC module providing the broad lifecycle and shared-resource organization – via the session conc...
    Definition: app.cpp:27
    -
    Permissions_level
    Simple specifier of desired access permissions, usually but not necessarily translated into a Permiss...
    Definition: util_fwd.hpp:88
    -
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:143
    -
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:140
    +
    Permissions_level
    Simple specifier of desired access permissions, usually but not necessarily translated into a Permiss...
    Definition: util_fwd.hpp:94
    +
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:149
    +
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:146
    A description of an application in this ipc::session inter-process communication universe.
    Definition: app.hpp:78
    util::group_id_t m_group_id
    The application must run as this group ID (GID). Files and other shared resources shall have this own...
    Definition: app.hpp:171
    std::string m_name
    Brief application name, readable to humans and unique across all other applications' names; used both...
    Definition: app.hpp:144
    @@ -383,7 +383,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/arena__activator_8hpp.html b/doc/ipc_doc/generated/html_full/arena__activator_8hpp.html index 6e9a1ee51..9d4588430 100644 --- a/doc/ipc_doc/generated/html_full/arena__activator_8hpp.html +++ b/doc/ipc_doc/generated/html_full/arena__activator_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -98,7 +98,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/arena__activator_8hpp_source.html b/doc/ipc_doc/generated/html_full/arena__activator_8hpp_source.html index 94bdd21f7..95fed81e0 100644 --- a/doc/ipc_doc/generated/html_full/arena__activator_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/arena__activator_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -193,7 +193,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp.html b/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp.html index b9fc59e16..9bef0a309 100644 --- a/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -169,7 +169,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp_source.html index 0026980df..e80895f29 100644 --- a/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/arena__lend_2src_2ipc_2session_2detail_2shm_2arena__lend_2jemalloc_2session__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -740,21 +740,21 @@
    std::ostream & operator<<(std::ostream &os, const Client_session_impl< S_MQ_TYPE_OR_NONE, S_TRANSMIT_NATIVE_HANDLES, Mdt_payload > &val)
    Prints string representation of the given Client_session_impl to the given ostream.
    const Shared_name SHM_SUBTYPE_PREFIX
    Internally used in pool names generated in this namespace to differentiate from those of other SHM-su...
    Shared_name build_conventional_shared_name(const Shared_name &resource_type, const Shared_name &srv_app_name, const Shared_name &srv_namespace, const Shared_name &cli_app_name, const Shared_name &cli_namespace_or_sentinel)
    Builds an absolute name according to the path convention explained in Shared_name class doc header; t...
    -
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    +
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    Permissions shared_resource_permissions(Permissions_level permissions_lvl)
    Maps general Permissions_level specifier to low-level Permissions value, when the underlying resource...
    Definition: util.cpp:37
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    Implements Struct_builder::Config sub-concept.
    Implements Struct_reader::Config sub-concept.
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp.html index 9a352dc52..b1e6ada20 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -109,7 +109,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp_source.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp_source.html index 89234ba01..916ce3328 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -94,448 +94,449 @@
    22#include <boost/array.hpp>
    23
    24#ifndef FLOW_OS_LINUX // Sanity-re-check. We'll be sending sockets through sockets, etc., which requires Linux.
    -
    25# error "Should not have gotten to this line; should have required Linux; this .cpp file assumes it."
    -
    26#endif
    -
    27#include <sys/types.h>
    -
    28#include <sys/socket.h>
    -
    29
    -
    30namespace ipc::transport::asio_local_stream_socket
    -
    31{
    -
    32
    -
    33// Free function implementations.
    -
    34
    -
    35size_t nb_write_some_with_native_handle(flow::log::Logger* logger_ptr,
    -
    36 Peer_socket* peer_socket_ptr,
    -
    37 Native_handle payload_hndl, const util::Blob_const& payload_blob,
    -
    38 Error_code* err_code)
    -
    39{
    -
    40 namespace bind_ns = flow::util::bind_ns;
    -
    41 using boost::system::system_category;
    -
    42 using boost::array;
    -
    43 namespace sys_err_codes = boost::system::errc;
    -
    44 using ::sendmsg;
    -
    45 using ::msghdr;
    -
    46 using ::iovec;
    -
    47 using ::cmsghdr;
    -
    48 // using ::SOL_SOCKET; // It's a macro apparently.
    -
    49 using ::SCM_RIGHTS;
    -
    50 using ::MSG_DONTWAIT;
    -
    51 using ::MSG_NOSIGNAL;
    -
    52 // using ::errno; // It's a macro apparently.
    -
    53
    -
    54 FLOW_ERROR_EXEC_FUNC_AND_THROW_ON_ERROR(size_t, nb_write_some_with_native_handle,
    -
    55 logger_ptr, peer_socket_ptr, payload_hndl, bind_ns::cref(payload_blob), _1);
    -
    56 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
    -
    57
    -
    58 /* To reader/maintainer: The below isn't that difficult, but if you need exact understanding and definitely if you
    -
    59 * plan to make changes -- even just clarifications or changes in the doc header -- then read the entire doc header
    -
    60 * of nb_read_some_with_native_handle() first. */
    -
    61
    -
    62 assert(peer_socket_ptr);
    -
    63 auto& peer_socket = *peer_socket_ptr;
    -
    64
    -
    65 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    -
    66 FLOW_LOG_TRACE("Connected local peer socket wants to write from location @ [" << payload_blob.data() << "] "
    -
    67 "plus native handle [" << payload_hndl << "]. Will try to send.");
    -
    68
    -
    69 /* Let us send as much as possible of payload_blob; and the native socket payload_hndl.
    -
    70 * As explicitly documented in boost.asio docs: it does not provide an API for the latter (fairly hairy
    -
    71 * and Linux-specific) feature, but it is doable by using sendmsg() natively via peer_socket.native_handle()
    -
    72 * which gets the native handle (a/k/a FD).
    -
    73 *
    -
    74 * Side note: After I (ygoldfel) had written this and async_write_with_native_handle() (which calls us),
    -
    75 * I found validation for the approach in boost.asio docs in their example for Peer_socket::native_non_blocking(),
    -
    76 * which shows how to implement async_sendfile(), spiritually similar to our thing which is essentially
    -
    77 * a case of an analogous hypothetical async_sendmsg(). Subtlety: we, too, could have used native_non_blocking(),
    -
    78 * as their example does; and the only reason we did not is that `sendmsg()` happens to support a per-call flag
    -
    79 * that forces a non-blocking transmission, so one needn't deal with socket state. Subtlety: realize (as per
    -
    80 * boost.asio docs) that Peer_socket::non_blocking() is orthogonal to this entirely; it is orthogonal to
    -
    81 * native_non_blocking() and the per-call flag thing. */
    -
    82
    -
    83 iovec native_buf1 = { const_cast<void*>(payload_blob.data()), payload_blob.size() };
    -
    84 // (const_cast<> is OK, as sendmsg() is read-only. Probably the API is const-janky due to iovec's reuse in recvmsg().)
    -
    85
    -
    86 msghdr sendmsg_hdr =
    -
    87 {
    -
    88 0, // msg_name - Address; not used; we are connected.
    -
    89 0, // msg_namelen - Ditto.
    -
    90 /* msg_iov - Scatter/gather array. We just put the one blob here. It's natural to instead put a
    -
    91 * a buffer sequence, meaning N>=1 buffers, here. There's a to-do elsewhere as of this writing to
    -
    92 * make that API as well; as of now it's not needed. Take a look inside boost.asio for how they convert
    -
    93 * between the 2; it's not rocket science, but we can either reuse their code or learn from it;
    -
    94 * for example there's the matter of MAX_IOV (max size of this array). */
    -
    95 &native_buf1,
    -
    96 1, // msg_iovlen - # elements in msg_iov.
    -
    97
    -
    98 /* The other 3 fields can be uninitialized: msg_flags is unused; msg_control[len] are set below.
    -
    99 * The language won't let me leave them as garbage though so: */
    -
    100 0, 0, 0
    -
    101 };
    -
    102
    -
    103 /* What's left is to set up msg_control[len] which is how we send the native handle (payload_hndl).
    -
    104 * This is based on example snippet taken from Linux `man cmsg`. FWIW it's rather difficult to figure out
    -
    105 * how to write it from the rest of the documentation, which is likely complete and correct but opaque; the
    -
    106 * example is invaluable. Note we are particularly using the SOL_SOCKET/SCM_RIGHTS technique. */
    -
    107
    -
    108 constexpr size_t N_PAYLOAD_FDS = 1;
    -
    109 union
    -
    110 {
    -
    111 /* (Comment taken verbatim from aforementioned `man`.)
    -
    112 * Ancillary data buffer, wrapped in a union in order to ensure it is suitably aligned.
    -
    113 *
    -
    114 * ...If I (ygoldfel) understand correctly, and I think I do, the idea is that:
    -
    115 * - msg_control points to a contiguous data area (ancillary data); which is split up into variable-length
    -
    116 * sub-areas, each of which starts with a header, in the form of a `cmsghdr`, which contains a couple of
    -
    117 * enum-like ints, a cmsg_len specifying the length of the rest of that sub-area (within the sequence),
    -
    118 * and then that area which contains the stuff to be transmitted (whose exact size/meaning depends on the
    -
    119 * enums; in our case it'll be native handles).
    -
    120 * - A key caveat is that in order to be properly interpreted, the header -- probably cast by the kernel/something
    -
    121 * to `cmsghdr` -- must begin on an aligned address. So, in particular, if whatever comes before it
    -
    122 * (could be the preceding ancillary data sub-area, depending) ends just before an odd address, then
    -
    123 * the data sub-area must be a byte or a few to the right.
    -
    124 * - So this trick explicitly puts a cmsghdr there; so that its co-inhabitant m_buf (the actual area where we'll
    -
    125 * shove handles) will also begin on the same address/byte.
    -
    126 * - CMSG_ALIGN() is a Linux extension that might be usable to avoid having to use the trick, but seeing as
    -
    127 * how `man cmsg` in my Linux says it's not portable and itself foregoes it in favor of the trick in the
    -
    128 * example, I'll just also use the trick. */
    -
    129 array<uint8_t, CMSG_SPACE(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS)> m_buf;
    -
    130 cmsghdr m_align;
    -
    131 } msg_control_as_union;
    -
    132
    -
    133 sendmsg_hdr.msg_control = msg_control_as_union.m_buf.c_array();
    -
    134 sendmsg_hdr.msg_controllen = sizeof(msg_control_as_union.m_buf);
    -
    135 cmsghdr* const sendmsg_hdr_cmsg_ptr = CMSG_FIRSTHDR(&sendmsg_hdr); // Or cast from &m_buf; or use &m_align....
    -
    136 sendmsg_hdr_cmsg_ptr->cmsg_level = SOL_SOCKET;
    -
    137 sendmsg_hdr_cmsg_ptr->cmsg_type = SCM_RIGHTS;
    -
    138 sendmsg_hdr_cmsg_ptr->cmsg_len = CMSG_LEN(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS);
    -
    139
    -
    140 // Copy the FDs. We have just the one; simply assign (omit `memcpy`) but static_assert() to help future-proof.
    -
    141 static_assert(N_PAYLOAD_FDS == 1, "Should be only passing one native handle into sendmsg() as of this writing.");
    -
    142 *(reinterpret_cast<Native_handle::handle_t*>(CMSG_DATA(sendmsg_hdr_cmsg_ptr))) = payload_hndl.m_native_handle;
    -
    143
    -
    144 const auto n_sent_or_error
    -
    145 = sendmsg(peer_socket.native_handle(), &sendmsg_hdr,
    -
    146 /* If socket is un-writable then don't block;
    -
    147 * EAGAIN/EWOULDBLOCK instead. Doing it this way is easier than messing with fcntl(), particularly
    -
    148 * since we're working with a boost.asio-managed socket; that's actually fine -- there's a portable
    -
    149 * API native_non_blocking() in boost.asio for setting this -- but feels like the less interaction between
    -
    150 * portable boost.asio code we use and this native stuff, the better -- so just keep it local here. */
    -
    151 MSG_DONTWAIT | MSG_NOSIGNAL);
    -
    152 // ^-- Dealing with SIGPIPE is a pointless pain; if conn closed that way just give as an EPIPE error.
    -
    153
    -
    154 if (n_sent_or_error == -1)
    -
    155 {
    -
    156 /* Not even 1 byte of the blob was sent; and hence nor was payload_hndl. (Docs don't explicitly say that 2nd
    -
    157 * part after the semicolon, but it's essentially impossible that it be otherwise, as then it'd be unknowable.
    -
    158 * Update: Confirmed in kernel source and supported by this delightfully reassuring (in several ways) link:
    -
    159 * [ https://gist.github.com/kentonv/bc7592af98c68ba2738f4436920868dc ] (Googled "SCM_RIGHTS gist").) */
    -
    160
    -
    161 const Error_code sys_err_code(errno, system_category());
    -
    162 if ((sys_err_code == sys_err_codes::operation_would_block) || // EWOULDBLOCK
    -
    163 (sys_err_code == sys_err_codes::resource_unavailable_try_again)) // EAGAIN (same meaning)
    -
    164 {
    -
    165 FLOW_LOG_TRACE("Write attempt indicated would-block; not an error condition. Nothing sent.");
    -
    166 /* Subtlety: We could just set it to sys_err_code; but we specifically promised in contract we'd set it to the
    -
    167 * boost::asio::error::would_block representation of would-block condition. Why did we promise that? 2 reasons:
    -
    168 * 1, that is what boost.asio's own spiritually similar Peer_socket::write_some() would do in non_blocking() mode.
    -
    169 * 2, then we can promise a specific code instead of making them check for the above 2 errno values.
    -
    170 *
    -
    171 * Subtlety: net_flow::Peer_socket::sync_receive uses somewhat different semantics; it indicates would-block by
    -
    172 * returning 0 *but* a falsy *err_code. Why are we inconsistent with that? Answer: Because net_flow is not
    -
    173 * trying to be a boost.asio extension; we are. In net_flow's context (as of this writing) no one is surprised
    -
    174 * when semantics are somewhat different from boost.asio; but in our context they might be quite surprised
    -
    175 * indeed. */
    -
    176 *err_code = boost::asio::error::would_block;
    -
    177 return 0;
    -
    178 }
    -
    179 // else
    -
    180
    -
    181 assert(sys_err_code);
    -
    182
    -
    183 // All other errors are fatal.
    -
    184 FLOW_ERROR_SYS_ERROR_LOG_WARNING(); // Log based on sys_err_code.
    -
    185 FLOW_LOG_WARNING("Connected local peer socket tried to write from "
    -
    186 "location @ [" << payload_blob.data() << "] plus native handle [" << payload_hndl << "]; "
    -
    187 "but an unrecoverable error occurred. Nothing sent.");
    -
    188 *err_code = sys_err_code;
    -
    189 return 0;
    -
    190 } // if (n_sent_or_error == -1)
    -
    191 // else if (n_sent_or_error != -1)
    -
    192
    -
    193 assert (n_sent_or_error > 0);
    -
    194
    -
    195 FLOW_LOG_TRACE("sendmsg() reports the native handle [" << payload_hndl << "] was successfully sent; as "
    -
    196 "were [" << n_sent_or_error << "] of the blob's [" << payload_blob.size() << "] bytes.");
    -
    197 err_code->clear();
    -
    198 return n_sent_or_error;
    -
    199} // nb_write_some_with_native_handle()
    -
    200
    -
    201size_t nb_read_some_with_native_handle(flow::log::Logger* logger_ptr,
    -
    202 Peer_socket* peer_socket_ptr,
    -
    203 Native_handle* target_payload_hndl_ptr,
    -
    204 const util::Blob_mutable& target_payload_blob,
    -
    205 Error_code* err_code,
    -
    206 int message_flags)
    -
    207{
    -
    208 namespace bind_ns = flow::util::bind_ns;
    -
    209 using boost::system::system_category;
    -
    210 using boost::array;
    -
    211 namespace sys_err_codes = boost::system::errc;
    -
    212 using ::sendmsg;
    -
    213 using ::msghdr;
    -
    214 using ::iovec;
    -
    215 using ::cmsghdr;
    -
    216 // using ::SOL_SOCKET; // It's a macro apparently.
    -
    217 using ::SCM_RIGHTS;
    -
    218 using ::MSG_DONTWAIT;
    -
    219 using ::MSG_CTRUNC;
    -
    220 // using ::errno; // It's a macro apparently.
    -
    221
    -
    222 FLOW_ERROR_EXEC_FUNC_AND_THROW_ON_ERROR(size_t, nb_read_some_with_native_handle,
    -
    223 logger_ptr, peer_socket_ptr, target_payload_hndl_ptr,
    -
    224 bind_ns::cref(target_payload_blob), _1, message_flags);
    -
    225 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
    -
    226
    -
    227 /* To reader/maintainer: The below isn't that difficult, but if you need exact understanding and definitely if you
    -
    228 * plan to make changes -- even just clarifications or changes in the doc header -- then read the entire doc header
    -
    229 * of nb_read_some_with_native_handle() first. */
    -
    230
    -
    231 assert(peer_socket_ptr);
    -
    232 assert(target_payload_hndl_ptr);
    -
    233
    -
    234 auto& peer_socket = *peer_socket_ptr;
    -
    235 auto& target_payload_hndl = *target_payload_hndl_ptr;
    -
    236
    -
    237 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    -
    238 FLOW_LOG_TRACE("Connected local peer socket wants to read up to [" << target_payload_blob.size() << "] bytes "
    -
    239 "to location @ [" << target_payload_blob.data() << "] "
    -
    240 "plus possibly a native handle. Will try to receive.");
    -
    241 target_payload_hndl = Native_handle();
    -
    242 assert(target_payload_hndl.null()); // We promised to set to this if no socket received (including on error).
    -
    243
    -
    244 /* Let us receive as much as possible into target_payload_blob up to its size; and a native socket (if any) into
    -
    245 * target_payload_hndl (if none, then it'll remain null()).
    -
    246 * As explicitly documented in boost.asio docs: it does not provide an API for the latter (fairly hairy
    -
    247 * and Linux-specific) feature, but it is doable by using recvmsg() natively via peer_socket.native_handle()
    -
    248 * which gets the native handle (a/k/a FD).
    -
    249 *
    -
    250 * Recommending first looking at nb_write_some_with_native_handle(), as we operate symmetrically/similarly. */
    -
    251
    -
    252 iovec native_buf1 = { target_payload_blob.data(), target_payload_blob.size() };
    -
    253 msghdr recvmsg_hdr =
    -
    254 {
    -
    255 0, // msg_name - Address; not used; we are connected.
    -
    256 0, // msg_namelen - Ditto.
    -
    257 /* msg_iov - Scatter/gather array. We just put the one target blob here. See similarly-themed notes at similar
    -
    258 * spot in nb_write_some_with_native_handle(); they apply here too, more or less. */
    -
    259 &native_buf1,
    -
    260 1, // msg_iovlen - # elements in msg_iov. This is an *input* arg only; output is total length read: the ret value.
    -
    261 /* The following fields may or may need not be initialized; but let's discuss them generally:
    -
    262 * msg_control, msg_controllen - These are out-args, indirectly set/reserved and interpreted with CMSG* below.
    -
    263 * msg_flags - This is an out-arg containing special feature flags. These may be checked below after call.
    -
    264 * The language won't let me leave them as garbage though so: */
    -
    265 0, 0, 0
    -
    266 };
    -
    267 // May not be needed, but at least some examples online do it; seems prudent and cheap.
    -
    268 recvmsg_hdr.msg_flags = 0;
    -
    269
    -
    270 /* Set up .msg_control*. This, and then interpreting the output after the call, is based on the out-equivalent in
    -
    271 * nb_write_some_with_native_handle() as well as cross-referencing with some Internet sources.
    -
    272 *
    -
    273 * Before the call, we must reserve space for the ancillary out-data, if any; set msg_control to point to that;
    -
    274 * and msg_controllen to the size of that thing. */
    -
    275
    -
    276 constexpr size_t N_PAYLOAD_FDS = 1;
    -
    277 union
    -
    278 {
    -
    279 // See nb_write_some_with_native_handle(). It explains the m_align thing.
    -
    280 array<uint8_t, CMSG_SPACE(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS)> m_buf;
    -
    281 cmsghdr m_align;
    -
    282 } msg_control_as_union;
    -
    283 // Probably paranoia. Just in case pre-fill it with zeroes (0x00... is not a valid FD) for sanity check later.
    -
    284 msg_control_as_union.m_buf.fill(0);
    -
    285
    -
    286 recvmsg_hdr.msg_control = msg_control_as_union.m_buf.c_array();
    -
    287 recvmsg_hdr.msg_controllen = sizeof(msg_control_as_union.m_buf);
    -
    288
    -
    289 const auto n_rcvd_or_error
    -
    290 = recvmsg(peer_socket.native_handle(), &recvmsg_hdr,
    -
    291 /* If socket is un-writable then don't block; EAGAIN/EWOULDBLOCK instead. ...Further comment omitted;
    -
    292 * see sendmsg() elsewhere in this .cpp. Same thing here. */
    -
    293 MSG_DONTWAIT | message_flags); // <-- Re. message_flags please read notes in our doc header.
    -
    294
    -
    295 // Carefully check all the outputs. Return value first.
    -
    296
    -
    297 if (n_rcvd_or_error == -1)
    -
    298 {
    -
    299 /* Not even 1 byte of a blob was read; and hence nor was any target_payload_hndl. (See comment in similar
    -
    300 * sport in nb_write_some_with_native_handle(); applies here equally.) */
    -
    301
    -
    302 const Error_code sys_err_code(errno, system_category());
    -
    303 if ((sys_err_code == sys_err_codes::operation_would_block) || // EWOULDBLOCK
    -
    304 (sys_err_code == sys_err_codes::resource_unavailable_try_again)) // EAGAIN (same meaning)
    -
    305 /* Reader: "But, ygoldfel, why didn't you just check errno itself against those 2 actual Evalues?"
    -
    306 * ygoldfel: "Because it makes me feel better about portable-ish style. Shut up, that's why. Get off my lawn." */
    -
    307 {
    -
    308 FLOW_LOG_TRACE("Read attempt indicated would-block; not an error condition. Nothing received.");
    -
    309 // Subtlety x 2: ...omitted. See similar spot in nb_write_some_with_native_handle(). Same here.
    -
    310 *err_code = boost::asio::error::would_block;
    -
    311 return 0; // target_payload_hndl already set.
    -
    312 }
    -
    313 // else
    -
    314
    -
    315 assert(sys_err_code);
    -
    316
    -
    317 // All other errors are fatal.
    -
    318 FLOW_ERROR_SYS_ERROR_LOG_WARNING(); // Log based on sys_err_code.
    -
    319 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    -
    320 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    321 "but an unrecoverable error occurred. Nothing received.");
    -
    322 *err_code = sys_err_code;
    -
    323 return 0; // target_payload_hndl already set.
    -
    324 } // if (n_rcvd_or_error == -1)
    -
    325 // else if (n_rcvd_or_error != -1)
    -
    326
    -
    327 if (n_rcvd_or_error == 0)
    -
    328 {
    -
    329 /* WARNING doesn't feel right: it's a graceful connection end.
    -
    330 * INFO could be good, but it might be too verbose depending on the application.
    -
    331 * Use TRACE to be safe; caller can always log differently if desired. */
    -
    332 FLOW_LOG_TRACE("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    -
    333 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    334 "but it returned EOF meaning orderly connection shutdown by peer. Nothing received.");
    -
    335 *err_code = boost::asio::error::eof;
    -
    336 return 0; // target_payload_hndl already set.
    -
    337 }
    -
    338 // else
    -
    339 assert(n_rcvd_or_error > 0);
    -
    340
    -
    341 /* Next, target_payload_blob... which is already written to (its first n_rcvd_or_error bytes).
    -
    342 *
    -
    343 * Next, recvmsg_hdr.msg_flags. Basically only the following is relevant: */
    -
    344 if (recvmsg_hdr.msg_flags != 0)
    -
    345 {
    -
    346 FLOW_LOG_INFO("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    -
    347 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    348 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also returned raw "
    -
    349 "out-flags value [0x" << std::hex << recvmsg_hdr.msg_flags << std::dec << "]. "
    -
    350 "Will check for relevant flags but otherwise "
    -
    351 "ignoring if nothing bad. Logging at elevated level because it's interesting; please investigate.");
    -
    352
    -
    353 if ((recvmsg_hdr.msg_flags & MSG_CTRUNC) != 0)
    -
    354 {
    -
    355 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    -
    356 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    357 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also returned raw "
    -
    358 "out-flags value [0x" << recvmsg_hdr.msg_flags << "] which includes MSG_CTRUNC. "
    -
    359 "That flag indicates more stuff was sent as ancillary data; but we expect at most 1 native "
    -
    360 "handle. Other side sent something strange. Acting as if nothing received + error.");
    -
    361 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    -
    362 return 0; // target_payload_hndl already set.
    -
    363 }
    -
    364 // else
    -
    365 }
    -
    366
    -
    367 /* Lastly examine ancillary data (and note MSG_CTRUNC already eliminated above).
    -
    368 * Use, basically, the method from `man cmsg` in Linux. */
    -
    369 cmsghdr* const recvmsg_hdr_cmsg_ptr = CMSG_FIRSTHDR(&recvmsg_hdr);
    -
    370 if (recvmsg_hdr_cmsg_ptr)
    -
    371 {
    -
    372 // There is some ancillary data. It can only (validly according to our expected protocol) be one thing.
    -
    373 if ((recvmsg_hdr_cmsg_ptr->cmsg_level == SOL_SOCKET) &&
    -
    374 (recvmsg_hdr_cmsg_ptr->cmsg_type == SCM_RIGHTS))
    -
    375 {
    -
    376 static_assert(N_PAYLOAD_FDS == 1, "Should be only dealing with one native handle with recvmsg() "
    -
    377 "as of this writing.");
    -
    378 target_payload_hndl.m_native_handle
    -
    379 = *(reinterpret_cast<const Native_handle::handle_t*>(CMSG_DATA(recvmsg_hdr_cmsg_ptr)));
    -
    380 }
    -
    381 else
    -
    382 {
    -
    383 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    -
    384 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    385 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also "
    -
    386 "unexpected ancillary data of csmg_level|cmsg_type "
    -
    387 "[" << recvmsg_hdr_cmsg_ptr->cmsg_level << '|' << recvmsg_hdr_cmsg_ptr->cmsg_type << "]. "
    -
    388 "Acting as if nothing received + error.");
    -
    389 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    -
    390 return 0; // target_payload_hndl already set.
    -
    391 }
    -
    392 // else
    -
    393 if (CMSG_NXTHDR(&recvmsg_hdr, recvmsg_hdr_cmsg_ptr))
    -
    394 {
    -
    395 /* This is rather strange: we didn't provide enough space for more ancillary data; yet there is somehow more,
    -
    396 * even though we didn't detect MSG_CTRUNC earlier. Well, whatever. It's bad just like MSG_CTRUNC. */
    -
    397 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    -
    398 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    -
    399 "and it returned it read [" << n_rcvd_or_error << "] bytes and native handle "
    -
    400 "[" << target_payload_hndl << "] but also more ancillary data; but we expect at most 1 native "
    -
    401 "handle. Other side sent something strange. Acting as if nothing received + error.");
    -
    402 target_payload_hndl = Native_handle(); // Undo the above (to match promised semantics on error).
    -
    403 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    -
    404 return 0;
    -
    405 }
    -
    406 // else { No more ancillary data, as expected. }
    -
    407 }
    -
    408 // else { No ancillary data, meaning no native handle; that's quite normal. }
    -
    409
    -
    410 FLOW_LOG_TRACE("recvmsg() reports receipt of possible native handle [" << target_payload_hndl << "]; as well as "
    -
    411 "[" << n_rcvd_or_error << "] of the blob's [" << target_payload_blob.size() << "]-byte capacity.");
    -
    412 err_code->clear();
    -
    413 return n_rcvd_or_error;
    -
    414} // nb_read_some_with_native_handle()
    -
    415
    -
    416void release_native_peer_socket(Native_handle&& peer_socket_native_or_null)
    -
    417{
    -
    418 using flow::util::Task_engine;
    -
    419
    -
    420 // As promised:
    -
    421 if (peer_socket_native_or_null.null())
    -
    422 {
    -
    423 return;
    -
    424 }
    -
    425 // else
    -
    426
    -
    427 /* Purely for style reasons let's wrap it in a boost.asio `socket` and let its dtor
    -
    428 * take care of it. ::close() would have worked too, but I suppose this is less "native" and more
    -
    429 * consistent. */
    -
    430 Task_engine task_engine;
    -
    431 [[maybe_unused]] Peer_socket sock(task_engine, Protocol(), peer_socket_native_or_null.m_native_handle);
    -
    432
    -
    433 peer_socket_native_or_null = Native_handle(); // As promised nullify it.
    -
    434
    -
    435 // Now destroy `sock`, then destroy task_engine.
    -
    436} // release_native_peer_socket()
    -
    437
    -
    438// Opt_peer_process_credentials implementations.
    -
    439
    -
    440Opt_peer_process_credentials::Opt_peer_process_credentials() = default;
    -
    441Opt_peer_process_credentials::Opt_peer_process_credentials(const Opt_peer_process_credentials&) = default;
    -
    442Opt_peer_process_credentials& Opt_peer_process_credentials::operator=(const Opt_peer_process_credentials&) = default;
    -
    443
    -
    444} // namespace ipc::transport::asio_local_stream_socket
    +
    25static_assert(false, "Should not have gotten to this line; should have required Linux; this .cpp file assumes it. "
    +
    26 "Might work in other POSIX OS (e.g., macOS) but must be checked/tested.");
    +
    27#endif
    +
    28#include <sys/types.h>
    +
    29#include <sys/socket.h>
    +
    30
    +
    31namespace ipc::transport::asio_local_stream_socket
    +
    32{
    +
    33
    +
    34// Free function implementations.
    +
    35
    +
    36size_t nb_write_some_with_native_handle(flow::log::Logger* logger_ptr,
    +
    37 Peer_socket* peer_socket_ptr,
    +
    38 Native_handle payload_hndl, const util::Blob_const& payload_blob,
    +
    39 Error_code* err_code)
    +
    40{
    +
    41 namespace bind_ns = flow::util::bind_ns;
    +
    42 using boost::system::system_category;
    +
    43 using boost::array;
    +
    44 namespace sys_err_codes = boost::system::errc;
    +
    45 using ::sendmsg;
    +
    46 using ::msghdr;
    +
    47 using ::iovec;
    +
    48 using ::cmsghdr;
    +
    49 // using ::SOL_SOCKET; // It's a macro apparently.
    +
    50 using ::SCM_RIGHTS;
    +
    51 using ::MSG_DONTWAIT;
    +
    52 using ::MSG_NOSIGNAL;
    +
    53 // using ::errno; // It's a macro apparently.
    +
    54
    +
    55 FLOW_ERROR_EXEC_FUNC_AND_THROW_ON_ERROR(size_t, nb_write_some_with_native_handle,
    +
    56 logger_ptr, peer_socket_ptr, payload_hndl, bind_ns::cref(payload_blob), _1);
    +
    57 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
    +
    58
    +
    59 /* To reader/maintainer: The below isn't that difficult, but if you need exact understanding and definitely if you
    +
    60 * plan to make changes -- even just clarifications or changes in the doc header -- then read the entire doc header
    +
    61 * of nb_read_some_with_native_handle() first. */
    +
    62
    +
    63 assert(peer_socket_ptr);
    +
    64 auto& peer_socket = *peer_socket_ptr;
    +
    65
    +
    66 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    +
    67 FLOW_LOG_TRACE("Connected local peer socket wants to write from location @ [" << payload_blob.data() << "] "
    +
    68 "plus native handle [" << payload_hndl << "]. Will try to send.");
    +
    69
    +
    70 /* Let us send as much as possible of payload_blob; and the native socket payload_hndl.
    +
    71 * As explicitly documented in boost.asio docs: it does not provide an API for the latter (fairly hairy
    +
    72 * and Linux-specific) feature, but it is doable by using sendmsg() natively via peer_socket.native_handle()
    +
    73 * which gets the native handle (a/k/a FD).
    +
    74 *
    +
    75 * Side note: After I (ygoldfel) had written this and async_write_with_native_handle() (which calls us),
    +
    76 * I found validation for the approach in boost.asio docs in their example for Peer_socket::native_non_blocking(),
    +
    77 * which shows how to implement async_sendfile(), spiritually similar to our thing which is essentially
    +
    78 * a case of an analogous hypothetical async_sendmsg(). Subtlety: we, too, could have used native_non_blocking(),
    +
    79 * as their example does; and the only reason we did not is that `sendmsg()` happens to support a per-call flag
    +
    80 * that forces a non-blocking transmission, so one needn't deal with socket state. Subtlety: realize (as per
    +
    81 * boost.asio docs) that Peer_socket::non_blocking() is orthogonal to this entirely; it is orthogonal to
    +
    82 * native_non_blocking() and the per-call flag thing. */
    +
    83
    +
    84 iovec native_buf1 = { const_cast<void*>(payload_blob.data()), payload_blob.size() };
    +
    85 // (const_cast<> is OK, as sendmsg() is read-only. Probably the API is const-janky due to iovec's reuse in recvmsg().)
    +
    86
    +
    87 msghdr sendmsg_hdr =
    +
    88 {
    +
    89 0, // msg_name - Address; not used; we are connected.
    +
    90 0, // msg_namelen - Ditto.
    +
    91 /* msg_iov - Scatter/gather array. We just put the one blob here. It's natural to instead put a
    +
    92 * a buffer sequence, meaning N>=1 buffers, here. There's a to-do elsewhere as of this writing to
    +
    93 * make that API as well; as of now it's not needed. Take a look inside boost.asio for how they convert
    +
    94 * between the 2; it's not rocket science, but we can either reuse their code or learn from it;
    +
    95 * for example there's the matter of MAX_IOV (max size of this array). */
    +
    96 &native_buf1,
    +
    97 1, // msg_iovlen - # elements in msg_iov.
    +
    98
    +
    99 /* The other 3 fields can be uninitialized: msg_flags is unused; msg_control[len] are set below.
    +
    100 * The language won't let me leave them as garbage though so: */
    +
    101 0, 0, 0
    +
    102 };
    +
    103
    +
    104 /* What's left is to set up msg_control[len] which is how we send the native handle (payload_hndl).
    +
    105 * This is based on example snippet taken from Linux `man cmsg`. FWIW it's rather difficult to figure out
    +
    106 * how to write it from the rest of the documentation, which is likely complete and correct but opaque; the
    +
    107 * example is invaluable. Note we are particularly using the SOL_SOCKET/SCM_RIGHTS technique. */
    +
    108
    +
    109 constexpr size_t N_PAYLOAD_FDS = 1;
    +
    110 union
    +
    111 {
    +
    112 /* (Comment taken verbatim from aforementioned `man`.)
    +
    113 * Ancillary data buffer, wrapped in a union in order to ensure it is suitably aligned.
    +
    114 *
    +
    115 * ...If I (ygoldfel) understand correctly, and I think I do, the idea is that:
    +
    116 * - msg_control points to a contiguous data area (ancillary data); which is split up into variable-length
    +
    117 * sub-areas, each of which starts with a header, in the form of a `cmsghdr`, which contains a couple of
    +
    118 * enum-like ints, a cmsg_len specifying the length of the rest of that sub-area (within the sequence),
    +
    119 * and then that area which contains the stuff to be transmitted (whose exact size/meaning depends on the
    +
    120 * enums; in our case it'll be native handles).
    +
    121 * - A key caveat is that in order to be properly interpreted, the header -- probably cast by the kernel/something
    +
    122 * to `cmsghdr` -- must begin on an aligned address. So, in particular, if whatever comes before it
    +
    123 * (could be the preceding ancillary data sub-area, depending) ends just before an odd address, then
    +
    124 * the data sub-area must be a byte or a few to the right.
    +
    125 * - So this trick explicitly puts a cmsghdr there; so that its co-inhabitant m_buf (the actual area where we'll
    +
    126 * shove handles) will also begin on the same address/byte.
    +
    127 * - CMSG_ALIGN() is a Linux extension that might be usable to avoid having to use the trick, but seeing as
    +
    128 * how `man cmsg` in my Linux says it's not portable and itself foregoes it in favor of the trick in the
    +
    129 * example, I'll just also use the trick. */
    +
    130 array<uint8_t, CMSG_SPACE(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS)> m_buf;
    +
    131 cmsghdr m_align;
    +
    132 } msg_control_as_union;
    +
    133
    +
    134 sendmsg_hdr.msg_control = msg_control_as_union.m_buf.c_array();
    +
    135 sendmsg_hdr.msg_controllen = sizeof(msg_control_as_union.m_buf);
    +
    136 cmsghdr* const sendmsg_hdr_cmsg_ptr = CMSG_FIRSTHDR(&sendmsg_hdr); // Or cast from &m_buf; or use &m_align....
    +
    137 sendmsg_hdr_cmsg_ptr->cmsg_level = SOL_SOCKET;
    +
    138 sendmsg_hdr_cmsg_ptr->cmsg_type = SCM_RIGHTS;
    +
    139 sendmsg_hdr_cmsg_ptr->cmsg_len = CMSG_LEN(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS);
    +
    140
    +
    141 // Copy the FDs. We have just the one; simply assign (omit `memcpy`) but static_assert() to help future-proof.
    +
    142 static_assert(N_PAYLOAD_FDS == 1, "Should be only passing one native handle into sendmsg() as of this writing.");
    +
    143 *(reinterpret_cast<Native_handle::handle_t*>(CMSG_DATA(sendmsg_hdr_cmsg_ptr))) = payload_hndl.m_native_handle;
    +
    144
    +
    145 const auto n_sent_or_error
    +
    146 = sendmsg(peer_socket.native_handle(), &sendmsg_hdr,
    +
    147 /* If socket is un-writable then don't block;
    +
    148 * EAGAIN/EWOULDBLOCK instead. Doing it this way is easier than messing with fcntl(), particularly
    +
    149 * since we're working with a boost.asio-managed socket; that's actually fine -- there's a portable
    +
    150 * API native_non_blocking() in boost.asio for setting this -- but feels like the less interaction between
    +
    151 * portable boost.asio code we use and this native stuff, the better -- so just keep it local here. */
    +
    152 MSG_DONTWAIT | MSG_NOSIGNAL);
    +
    153 // ^-- Dealing with SIGPIPE is a pointless pain; if conn closed that way just give as an EPIPE error.
    +
    154
    +
    155 if (n_sent_or_error == -1)
    +
    156 {
    +
    157 /* Not even 1 byte of the blob was sent; and hence nor was payload_hndl. (Docs don't explicitly say that 2nd
    +
    158 * part after the semicolon, but it's essentially impossible that it be otherwise, as then it'd be unknowable.
    +
    159 * Update: Confirmed in kernel source and supported by this delightfully reassuring (in several ways) link:
    +
    160 * [ https://gist.github.com/kentonv/bc7592af98c68ba2738f4436920868dc ] (Googled "SCM_RIGHTS gist").) */
    +
    161
    +
    162 const Error_code sys_err_code(errno, system_category());
    +
    163 if ((sys_err_code == sys_err_codes::operation_would_block) || // EWOULDBLOCK
    +
    164 (sys_err_code == sys_err_codes::resource_unavailable_try_again)) // EAGAIN (same meaning)
    +
    165 {
    +
    166 FLOW_LOG_TRACE("Write attempt indicated would-block; not an error condition. Nothing sent.");
    +
    167 /* Subtlety: We could just set it to sys_err_code; but we specifically promised in contract we'd set it to the
    +
    168 * boost::asio::error::would_block representation of would-block condition. Why did we promise that? 2 reasons:
    +
    169 * 1, that is what boost.asio's own spiritually similar Peer_socket::write_some() would do in non_blocking() mode.
    +
    170 * 2, then we can promise a specific code instead of making them check for the above 2 errno values.
    +
    171 *
    +
    172 * Subtlety: net_flow::Peer_socket::sync_receive uses somewhat different semantics; it indicates would-block by
    +
    173 * returning 0 *but* a falsy *err_code. Why are we inconsistent with that? Answer: Because net_flow is not
    +
    174 * trying to be a boost.asio extension; we are. In net_flow's context (as of this writing) no one is surprised
    +
    175 * when semantics are somewhat different from boost.asio; but in our context they might be quite surprised
    +
    176 * indeed. */
    +
    177 *err_code = boost::asio::error::would_block;
    +
    178 return 0;
    +
    179 }
    +
    180 // else
    +
    181
    +
    182 assert(sys_err_code);
    +
    183
    +
    184 // All other errors are fatal.
    +
    185 FLOW_ERROR_SYS_ERROR_LOG_WARNING(); // Log based on sys_err_code.
    +
    186 FLOW_LOG_WARNING("Connected local peer socket tried to write from "
    +
    187 "location @ [" << payload_blob.data() << "] plus native handle [" << payload_hndl << "]; "
    +
    188 "but an unrecoverable error occurred. Nothing sent.");
    +
    189 *err_code = sys_err_code;
    +
    190 return 0;
    +
    191 } // if (n_sent_or_error == -1)
    +
    192 // else if (n_sent_or_error != -1)
    +
    193
    +
    194 assert (n_sent_or_error > 0);
    +
    195
    +
    196 FLOW_LOG_TRACE("sendmsg() reports the native handle [" << payload_hndl << "] was successfully sent; as "
    +
    197 "were [" << n_sent_or_error << "] of the blob's [" << payload_blob.size() << "] bytes.");
    +
    198 err_code->clear();
    +
    199 return n_sent_or_error;
    +
    200} // nb_write_some_with_native_handle()
    +
    201
    +
    202size_t nb_read_some_with_native_handle(flow::log::Logger* logger_ptr,
    +
    203 Peer_socket* peer_socket_ptr,
    +
    204 Native_handle* target_payload_hndl_ptr,
    +
    205 const util::Blob_mutable& target_payload_blob,
    +
    206 Error_code* err_code,
    +
    207 int message_flags)
    +
    208{
    +
    209 namespace bind_ns = flow::util::bind_ns;
    +
    210 using boost::system::system_category;
    +
    211 using boost::array;
    +
    212 namespace sys_err_codes = boost::system::errc;
    +
    213 using ::sendmsg;
    +
    214 using ::msghdr;
    +
    215 using ::iovec;
    +
    216 using ::cmsghdr;
    +
    217 // using ::SOL_SOCKET; // It's a macro apparently.
    +
    218 using ::SCM_RIGHTS;
    +
    219 using ::MSG_DONTWAIT;
    +
    220 using ::MSG_CTRUNC;
    +
    221 // using ::errno; // It's a macro apparently.
    +
    222
    +
    223 FLOW_ERROR_EXEC_FUNC_AND_THROW_ON_ERROR(size_t, nb_read_some_with_native_handle,
    +
    224 logger_ptr, peer_socket_ptr, target_payload_hndl_ptr,
    +
    225 bind_ns::cref(target_payload_blob), _1, message_flags);
    +
    226 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
    +
    227
    +
    228 /* To reader/maintainer: The below isn't that difficult, but if you need exact understanding and definitely if you
    +
    229 * plan to make changes -- even just clarifications or changes in the doc header -- then read the entire doc header
    +
    230 * of nb_read_some_with_native_handle() first. */
    +
    231
    +
    232 assert(peer_socket_ptr);
    +
    233 assert(target_payload_hndl_ptr);
    +
    234
    +
    235 auto& peer_socket = *peer_socket_ptr;
    +
    236 auto& target_payload_hndl = *target_payload_hndl_ptr;
    +
    237
    +
    238 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    +
    239 FLOW_LOG_TRACE("Connected local peer socket wants to read up to [" << target_payload_blob.size() << "] bytes "
    +
    240 "to location @ [" << target_payload_blob.data() << "] "
    +
    241 "plus possibly a native handle. Will try to receive.");
    +
    242 target_payload_hndl = Native_handle();
    +
    243 assert(target_payload_hndl.null()); // We promised to set to this if no socket received (including on error).
    +
    244
    +
    245 /* Let us receive as much as possible into target_payload_blob up to its size; and a native socket (if any) into
    +
    246 * target_payload_hndl (if none, then it'll remain null()).
    +
    247 * As explicitly documented in boost.asio docs: it does not provide an API for the latter (fairly hairy
    +
    248 * and Linux-specific) feature, but it is doable by using recvmsg() natively via peer_socket.native_handle()
    +
    249 * which gets the native handle (a/k/a FD).
    +
    250 *
    +
    251 * Recommending first looking at nb_write_some_with_native_handle(), as we operate symmetrically/similarly. */
    +
    252
    +
    253 iovec native_buf1 = { target_payload_blob.data(), target_payload_blob.size() };
    +
    254 msghdr recvmsg_hdr =
    +
    255 {
    +
    256 0, // msg_name - Address; not used; we are connected.
    +
    257 0, // msg_namelen - Ditto.
    +
    258 /* msg_iov - Scatter/gather array. We just put the one target blob here. See similarly-themed notes at similar
    +
    259 * spot in nb_write_some_with_native_handle(); they apply here too, more or less. */
    +
    260 &native_buf1,
    +
    261 1, // msg_iovlen - # elements in msg_iov. This is an *input* arg only; output is total length read: the ret value.
    +
    262 /* The following fields may or may need not be initialized; but let's discuss them generally:
    +
    263 * msg_control, msg_controllen - These are out-args, indirectly set/reserved and interpreted with CMSG* below.
    +
    264 * msg_flags - This is an out-arg containing special feature flags. These may be checked below after call.
    +
    265 * The language won't let me leave them as garbage though so: */
    +
    266 0, 0, 0
    +
    267 };
    +
    268 // May not be needed, but at least some examples online do it; seems prudent and cheap.
    +
    269 recvmsg_hdr.msg_flags = 0;
    +
    270
    +
    271 /* Set up .msg_control*. This, and then interpreting the output after the call, is based on the out-equivalent in
    +
    272 * nb_write_some_with_native_handle() as well as cross-referencing with some Internet sources.
    +
    273 *
    +
    274 * Before the call, we must reserve space for the ancillary out-data, if any; set msg_control to point to that;
    +
    275 * and msg_controllen to the size of that thing. */
    +
    276
    +
    277 constexpr size_t N_PAYLOAD_FDS = 1;
    +
    278 union
    +
    279 {
    +
    280 // See nb_write_some_with_native_handle(). It explains the m_align thing.
    +
    281 array<uint8_t, CMSG_SPACE(sizeof(Native_handle::handle_t) * N_PAYLOAD_FDS)> m_buf;
    +
    282 cmsghdr m_align;
    +
    283 } msg_control_as_union;
    +
    284 // Probably paranoia. Just in case pre-fill it with zeroes (0x00... is not a valid FD) for sanity check later.
    +
    285 msg_control_as_union.m_buf.fill(0);
    +
    286
    +
    287 recvmsg_hdr.msg_control = msg_control_as_union.m_buf.c_array();
    +
    288 recvmsg_hdr.msg_controllen = sizeof(msg_control_as_union.m_buf);
    +
    289
    +
    290 const auto n_rcvd_or_error
    +
    291 = recvmsg(peer_socket.native_handle(), &recvmsg_hdr,
    +
    292 /* If socket is un-writable then don't block; EAGAIN/EWOULDBLOCK instead. ...Further comment omitted;
    +
    293 * see sendmsg() elsewhere in this .cpp. Same thing here. */
    +
    294 MSG_DONTWAIT | message_flags); // <-- Re. message_flags please read notes in our doc header.
    +
    295
    +
    296 // Carefully check all the outputs. Return value first.
    +
    297
    +
    298 if (n_rcvd_or_error == -1)
    +
    299 {
    +
    300 /* Not even 1 byte of a blob was read; and hence nor was any target_payload_hndl. (See comment in similar
    +
    301 * sport in nb_write_some_with_native_handle(); applies here equally.) */
    +
    302
    +
    303 const Error_code sys_err_code(errno, system_category());
    +
    304 if ((sys_err_code == sys_err_codes::operation_would_block) || // EWOULDBLOCK
    +
    305 (sys_err_code == sys_err_codes::resource_unavailable_try_again)) // EAGAIN (same meaning)
    +
    306 /* Reader: "But, ygoldfel, why didn't you just check errno itself against those 2 actual Evalues?"
    +
    307 * ygoldfel: "Because it makes me feel better about portable-ish style. Shut up, that's why. Get off my lawn." */
    +
    308 {
    +
    309 FLOW_LOG_TRACE("Read attempt indicated would-block; not an error condition. Nothing received.");
    +
    310 // Subtlety x 2: ...omitted. See similar spot in nb_write_some_with_native_handle(). Same here.
    +
    311 *err_code = boost::asio::error::would_block;
    +
    312 return 0; // target_payload_hndl already set.
    +
    313 }
    +
    314 // else
    +
    315
    +
    316 assert(sys_err_code);
    +
    317
    +
    318 // All other errors are fatal.
    +
    319 FLOW_ERROR_SYS_ERROR_LOG_WARNING(); // Log based on sys_err_code.
    +
    320 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    +
    321 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    322 "but an unrecoverable error occurred. Nothing received.");
    +
    323 *err_code = sys_err_code;
    +
    324 return 0; // target_payload_hndl already set.
    +
    325 } // if (n_rcvd_or_error == -1)
    +
    326 // else if (n_rcvd_or_error != -1)
    +
    327
    +
    328 if (n_rcvd_or_error == 0)
    +
    329 {
    +
    330 /* WARNING doesn't feel right: it's a graceful connection end.
    +
    331 * INFO could be good, but it might be too verbose depending on the application.
    +
    332 * Use TRACE to be safe; caller can always log differently if desired. */
    +
    333 FLOW_LOG_TRACE("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    +
    334 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    335 "but it returned EOF meaning orderly connection shutdown by peer. Nothing received.");
    +
    336 *err_code = boost::asio::error::eof;
    +
    337 return 0; // target_payload_hndl already set.
    +
    338 }
    +
    339 // else
    +
    340 assert(n_rcvd_or_error > 0);
    +
    341
    +
    342 /* Next, target_payload_blob... which is already written to (its first n_rcvd_or_error bytes).
    +
    343 *
    +
    344 * Next, recvmsg_hdr.msg_flags. Basically only the following is relevant: */
    +
    345 if (recvmsg_hdr.msg_flags != 0)
    +
    346 {
    +
    347 FLOW_LOG_INFO("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes at "
    +
    348 "location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    349 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also returned raw "
    +
    350 "out-flags value [0x" << std::hex << recvmsg_hdr.msg_flags << std::dec << "]. "
    +
    351 "Will check for relevant flags but otherwise "
    +
    352 "ignoring if nothing bad. Logging at elevated level because it's interesting; please investigate.");
    +
    353
    +
    354 if ((recvmsg_hdr.msg_flags & MSG_CTRUNC) != 0)
    +
    355 {
    +
    356 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    +
    357 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    358 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also returned raw "
    +
    359 "out-flags value [0x" << recvmsg_hdr.msg_flags << "] which includes MSG_CTRUNC. "
    +
    360 "That flag indicates more stuff was sent as ancillary data; but we expect at most 1 native "
    +
    361 "handle. Other side sent something strange. Acting as if nothing received + error.");
    +
    362 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    +
    363 return 0; // target_payload_hndl already set.
    +
    364 }
    +
    365 // else
    +
    366 }
    +
    367
    +
    368 /* Lastly examine ancillary data (and note MSG_CTRUNC already eliminated above).
    +
    369 * Use, basically, the method from `man cmsg` in Linux. */
    +
    370 cmsghdr* const recvmsg_hdr_cmsg_ptr = CMSG_FIRSTHDR(&recvmsg_hdr);
    +
    371 if (recvmsg_hdr_cmsg_ptr)
    +
    372 {
    +
    373 // There is some ancillary data. It can only (validly according to our expected protocol) be one thing.
    +
    374 if ((recvmsg_hdr_cmsg_ptr->cmsg_level == SOL_SOCKET) &&
    +
    375 (recvmsg_hdr_cmsg_ptr->cmsg_type == SCM_RIGHTS))
    +
    376 {
    +
    377 static_assert(N_PAYLOAD_FDS == 1, "Should be only dealing with one native handle with recvmsg() "
    +
    378 "as of this writing.");
    +
    379 target_payload_hndl.m_native_handle
    +
    380 = *(reinterpret_cast<const Native_handle::handle_t*>(CMSG_DATA(recvmsg_hdr_cmsg_ptr)));
    +
    381 }
    +
    382 else
    +
    383 {
    +
    384 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    +
    385 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    386 "and it returned it read [" << n_rcvd_or_error << "] bytes successfully but also "
    +
    387 "unexpected ancillary data of csmg_level|cmsg_type "
    +
    388 "[" << recvmsg_hdr_cmsg_ptr->cmsg_level << '|' << recvmsg_hdr_cmsg_ptr->cmsg_type << "]. "
    +
    389 "Acting as if nothing received + error.");
    +
    390 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    +
    391 return 0; // target_payload_hndl already set.
    +
    392 }
    +
    393 // else
    +
    394 if (CMSG_NXTHDR(&recvmsg_hdr, recvmsg_hdr_cmsg_ptr))
    +
    395 {
    +
    396 /* This is rather strange: we didn't provide enough space for more ancillary data; yet there is somehow more,
    +
    397 * even though we didn't detect MSG_CTRUNC earlier. Well, whatever. It's bad just like MSG_CTRUNC. */
    +
    398 FLOW_LOG_WARNING("Connected local peer socket tried to read up to [" << target_payload_blob.size() << "] bytes "
    +
    399 "at location @ [" << target_payload_blob.data() << "] plus possibly a native handle; "
    +
    400 "and it returned it read [" << n_rcvd_or_error << "] bytes and native handle "
    +
    401 "[" << target_payload_hndl << "] but also more ancillary data; but we expect at most 1 native "
    +
    402 "handle. Other side sent something strange. Acting as if nothing received + error.");
    +
    403 target_payload_hndl = Native_handle(); // Undo the above (to match promised semantics on error).
    +
    404 *err_code = error::Code::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL;
    +
    405 return 0;
    +
    406 }
    +
    407 // else { No more ancillary data, as expected. }
    +
    408 }
    +
    409 // else { No ancillary data, meaning no native handle; that's quite normal. }
    +
    410
    +
    411 FLOW_LOG_TRACE("recvmsg() reports receipt of possible native handle [" << target_payload_hndl << "]; as well as "
    +
    412 "[" << n_rcvd_or_error << "] of the blob's [" << target_payload_blob.size() << "]-byte capacity.");
    +
    413 err_code->clear();
    +
    414 return n_rcvd_or_error;
    +
    415} // nb_read_some_with_native_handle()
    +
    416
    +
    417void release_native_peer_socket(Native_handle&& peer_socket_native_or_null)
    +
    418{
    +
    419 using flow::util::Task_engine;
    +
    420
    +
    421 // As promised:
    +
    422 if (peer_socket_native_or_null.null())
    +
    423 {
    +
    424 return;
    +
    425 }
    +
    426 // else
    +
    427
    +
    428 /* Purely for style reasons let's wrap it in a boost.asio `socket` and let its dtor
    +
    429 * take care of it. ::close() would have worked too, but I suppose this is less "native" and more
    +
    430 * consistent. */
    +
    431 Task_engine task_engine;
    +
    432 [[maybe_unused]] Peer_socket sock(task_engine, Protocol(), peer_socket_native_or_null.m_native_handle);
    +
    433
    +
    434 peer_socket_native_or_null = Native_handle(); // As promised nullify it.
    +
    435
    +
    436 // Now destroy `sock`, then destroy task_engine.
    +
    437} // release_native_peer_socket()
    +
    438
    +
    439// Opt_peer_process_credentials implementations.
    +
    440
    +
    441Opt_peer_process_credentials::Opt_peer_process_credentials() = default;
    +
    442Opt_peer_process_credentials::Opt_peer_process_credentials(const Opt_peer_process_credentials&) = default;
    +
    443Opt_peer_process_credentials& Opt_peer_process_credentials::operator=(const Opt_peer_process_credentials&) = default;
    +
    444
    +
    445} // namespace ipc::transport::asio_local_stream_socket
    Opt_peer_process_credentials()
    Default ctor: each value is initialized to zero or equivalent.
    Opt_peer_process_credentials & operator=(const Opt_peer_process_credentials &src)
    Boring copy assignment.
    -
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    +
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    local_ns::stream_protocol Protocol
    Short-hand for boost.asio Unix domain stream-socket protocol.
    -
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    +
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    -
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    -
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    +
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    +
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    @ S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL
    Unable to receive incoming traffic: message contains more than: 1 blob plus 0-1 native handles.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    int handle_t
    The native handle type. Much logic relies on this type being light-weight (fast to copy).
    -
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    int handle_t
    The native handle type. Much logic relies on this type being light-weight (fast to copy).
    +
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp.html index 08549b529..fee60b1f4 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -117,7 +117,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp_source.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp_source.html index c352a0997..ccc394964 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,345 +102,346 @@
    30// Types.
    31
    32#ifndef FLOW_OS_LINUX
    -
    33# error "Flow-IPC must define Opt_peer_process_credentials w/ Linux SO_PEERCRED semantics. Build in Linux only."
    -
    34#endif
    -
    35
    -
    36/**
    -
    37 * Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket `.get_option()` in order to
    -
    38 * get the connected opposing peer process's credentials (PID/UID/GID/etc.). Note accessors and data are
    -
    39 * in non-polymorphic base util::Process_credentials.
    -
    40 *
    -
    41 * If one calls `X.get_option(Opt_peer_process_credentials& o)` on #Peer_socket `X`, and `X` is connected to opposing
    -
    42 * peer socket in process P, then `o.*()` credential accessors (such as `o.process_id()`) shall return values that were
    -
    43 * accurate about process P, at the time P executed `Peer_socket::connect()` or `local_ns::connect_pair()` yielding
    -
    44 * the connection to "local" peer `X`.
    -
    45 *
    -
    46 * @see boost.asio docs: `GettableSocketOption` in boost.asio docs: implemented concept.
    -
    47 *
    -
    48 * @internal
    -
    49 * This is the Linux `getsockopt()` option with level `AF_LOCAL` (a/k/a `AF_UNIX`), name `SO_PEERCRED`.
    -
    50 */
    -
    51class Opt_peer_process_credentials :
    -
    52 public util::Process_credentials
    -
    53{
    -
    54public:
    -
    55 // Constructors/destructor.
    -
    56
    -
    57 /// Default ctor: each value is initialized to zero or equivalent.
    -
    58 Opt_peer_process_credentials();
    -
    59
    -
    60 /**
    -
    61 * Boring copy ctor.
    -
    62 * @param src
    -
    63 * Source object.
    -
    64 */
    -
    65 Opt_peer_process_credentials(const Opt_peer_process_credentials& src);
    -
    66
    -
    67 // Methods.
    -
    68
    -
    69 /**
    -
    70 * Boring copy assignment.
    -
    71 * @param src
    -
    72 * Source object.
    -
    73 * @return `*this`.
    -
    74 */
    -
    75 Opt_peer_process_credentials& operator=(const Opt_peer_process_credentials& src);
    -
    76
    -
    77 /**
    -
    78 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    -
    79 *
    -
    80 * @see boost.asio docs: `GettableSocketOption::level()` in boost.asio docs: implemented concept.
    -
    81 *
    -
    82 * @tparam Protocol
    -
    83 * See concept API.
    -
    84 * @param proto
    -
    85 * See concept API.
    -
    86 * @return See concept API.
    -
    87 *
    -
    88 * @internal
    -
    89 * It's `AF_LOCAL` a/k/a `AF_UNIX`.
    -
    90 */
    -
    91 template<typename Protocol>
    -
    92 int level(const Protocol& proto) const;
    -
    93
    -
    94 /**
    -
    95 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    -
    96 *
    -
    97 * @see boost.asio docs: `GettableSocketOption::name()` in boost.asio docs: implemented concept.
    -
    98 *
    -
    99 * @tparam Protocol
    -
    100 * See concept API.
    -
    101 * @param proto
    -
    102 * See concept API.
    -
    103 * @return See concept API.
    -
    104 *
    -
    105 * @internal
    -
    106 * It's `SO_PEERCRED`.
    -
    107 */
    -
    108 template<typename Protocol>
    -
    109 int name(const Protocol& proto) const;
    -
    110
    -
    111 /**
    -
    112 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    -
    113 *
    -
    114 * @see boost.asio docs: `GettableSocketOption::data()` in boost.asio docs: implemented concept.
    -
    115 *
    -
    116 * @tparam Protocol
    -
    117 * See concept API.
    -
    118 * @param proto
    -
    119 * See concept API.
    -
    120 * @return See concept API.
    -
    121 *
    -
    122 * @internal
    -
    123 * It's `SO_PEERCRED`.
    -
    124 */
    -
    125 template<typename Protocol>
    -
    126 void* data(const Protocol& proto);
    -
    127
    -
    128 /**
    -
    129 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    -
    130 *
    -
    131 * @see boost.asio docs: `GettableSocketOption::size()` in boost.asio docs: implemented concept.
    -
    132 *
    -
    133 * @tparam Protocol
    -
    134 * See concept API.
    -
    135 * @param proto
    -
    136 * See concept API.
    -
    137 * @return See concept API.
    -
    138 *
    -
    139 * @internal
    -
    140 * It's `sizeof(ucred)`.
    -
    141 */
    -
    142 template<typename Protocol>
    -
    143 size_t size(const Protocol& proto) const;
    -
    144
    -
    145 /**
    -
    146 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    -
    147 *
    -
    148 * @see boost.asio docs: `GettableSocketOption::resize()` in boost.asio docs: implemented concept.
    -
    149 *
    -
    150 * @tparam Protocol
    -
    151 * See concept API.
    -
    152 * @param proto
    -
    153 * See concept API.
    -
    154 * @param new_size_but_really_must_equal_current
    -
    155 * See concept API.
    -
    156 *
    -
    157 * @internal
    -
    158 * Resizing is not allowed for this option, so really it's either a no-op, or -- if
    -
    159 * `new_size_but_really_must_equal_current != size()` -- throws exception.
    -
    160 */
    -
    161 template<typename Protocol>
    -
    162 void resize(const Protocol& proto, size_t new_size_but_really_must_equal_current) const;
    -
    163}; // class Opt_peer_process_credentials
    -
    164
    -
    165// Free functions: in *_fwd.hpp.
    -
    166
    -
    167// Template implementations.
    -
    168
    -
    169template<typename Task_err>
    -
    170void async_write_with_native_handle(flow::log::Logger* logger_ptr,
    -
    171 Peer_socket* peer_socket_ptr,
    -
    172 Native_handle payload_hndl,
    -
    173 const util::Blob_const& payload_blob,
    -
    174 Task_err&& on_sent_or_error)
    -
    175{
    -
    176 using util::blob_data;
    -
    177 using flow::util::buffers_dump_string;
    -
    178
    -
    179 assert(peer_socket_ptr);
    -
    180 assert((!payload_hndl.null()) && (payload_blob.size() != 0));
    -
    181
    -
    182 auto& peer_socket = *peer_socket_ptr;
    -
    183
    -
    184 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    -
    185
    -
    186 FLOW_LOG_TRACE("Starting: Via connected local peer socket, will send handle [" << payload_hndl << "] with "
    -
    187 "blob of size [" << payload_blob.size() << "] "
    -
    188 "located @ [" << payload_blob.data() << "].");
    -
    189
    -
    190 // Verbose and slow (100% skipped unless log filter passes).
    -
    191 FLOW_LOG_DATA("Starting: Blob contents are "
    -
    192 "[" << buffers_dump_string(payload_blob, " ") << "].");
    -
    193
    -
    194 /* OK, now our task is to asynchronously send (1) payload_hndl (native handle) and (2) payload_blob (a buffer)
    -
    195 * over peer_socket (a connected local socket). As explicitly documented in boost.asio docs: it does not provide an
    -
    196 * API for the former (fairly hairy and Linux-specific) handle-transmitting feature, but it is doable by using
    -
    197 * sendmsg() natively via peer_socket.native_handle() which gets the native handle (a/k/a FD). That can only
    -
    198 * be called when the socket is actually writable; meaning sendmsg() will return 1+ bytes sent; and if not writable
    -
    199 * then it'd return EWOULDBLOCK/EAGAIN. Hence we must in this case use reactor-style pattern which is a fancy way
    -
    200 * way of saying we must split the typical proactor-style wait-and-write-when-writable operation into 2:
    -
    201 * first wait; then once ready try to write. boost.asio will nicely do the first part for us; but once it claims
    -
    202 * peer_socket is in fact writable, then we step in with the aforementioned native sendmsg() stuff. So do the
    -
    203 * wait now (peer_socket.async_wait()).
    -
    204 *
    -
    205 * Subtlety: In most cases we'd try to put the body of the handler fully right in here; stylistically that's more
    -
    206 * compact and arguably readable. Instead we delegate 99.9% of the code to a helper executed from inside this
    -
    207 * closure that'd normally have all the code. Why? Answer: The handler may need to retry this same wait; so it
    -
    208 * must specify itself as a handler again. That wouldn't work, even if syntactically achievable by saving
    -
    209 * the handler itself via [capture], because async_wait() immediately returns, hence the present function does
    -
    210 * too, hence anything on the stack disappears, hence whatever was [captured] would point to nothing. If one tries
    -
    211 * to do it, there's probably purely syntactically going to be a chicken-egg problem. This could be worked
    -
    212 * around via the oft-used shared_ptr<> technique... but why go crazy? It is more straightforward to
    -
    213 * have a permanent actual (helper) function and just have it refer to itself when it must. Splitting this
    -
    214 * function body into the above and a helper is perfectly fine anyway, so let's not get too clever.
    -
    215 *
    -
    216 * Subtlety: I have confirmed that the proper wait type is _write. _error may sound like it detects error conditions
    -
    217 * on the socket; but actually that refers to (no thanks to boost.asio docs BTW) obscure
    -
    218 * stuff like MSG_OOB... nothing relevant. An actual error like ECONNRESET would stop the _write wait and pass
    -
    219 * the triggering error code (as desired). */
    -
    220
    -
    221 peer_socket.async_wait
    -
    222 (Peer_socket::wait_write,
    -
    223 [logger_ptr, payload_hndl, payload_blob, peer_socket_ptr,
    -
    224 on_sent_or_error = std::move(on_sent_or_error)]
    -
    225 (const Error_code& sys_err_code) mutable
    -
    226 {
    -
    227 on_wait_writable_or_error(logger_ptr, sys_err_code, payload_hndl, payload_blob, peer_socket_ptr,
    -
    228 std::move(on_sent_or_error));
    -
    229 });
    -
    230} // async_write_with_native_handle()
    -
    231
    -
    232template<typename Task_err_blob, typename Target_payload_blob_func, typename Should_interrupt_func>
    -
    233void async_read_with_target_func
    -
    234 (flow::log::Logger* logger_ptr, Peer_socket* peer_socket,
    -
    235 Target_payload_blob_func&& target_payload_blob_func, Should_interrupt_func&& should_interrupt_func,
    -
    236 Task_err_blob&& on_rcvd_or_error)
    -
    237{
    -
    238 using util::Blob_mutable;
    -
    239
    -
    240 assert(peer_socket);
    -
    241
    -
    242 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    -
    243 FLOW_LOG_TRACE("Starting: Connected local peer socket wants to read 1+ bytes to some currently-unknown location "
    -
    244 "TBD when at least some data are available to read. Will try to receive.");
    -
    245
    -
    246 /* Without having to support should_interrupt_func feature, we could have done async_wait()->determine target
    -
    247 * buffer->async_read(). We must support it, so we have so split the latter into repeated
    -
    248 * async_wait()->read_some(), so we can check should_interrupt_func() ahead of each read_some().
    -
    249 * Kick it off here. */
    -
    250
    -
    251 peer_socket->async_wait
    -
    252 (Peer_socket::wait_read, [logger_ptr, peer_socket,
    -
    253 target_payload_blob_func = std::move(target_payload_blob_func),
    -
    254 on_rcvd_or_error = std::move(on_rcvd_or_error),
    -
    255 should_interrupt_func = std::move(should_interrupt_func)]
    -
    256 (const Error_code& async_err_code) mutable
    -
    257 {
    -
    258 on_wait_readable_or_error<true> // true => See just below for meaning.
    -
    259 (logger_ptr, async_err_code, peer_socket, std::move(should_interrupt_func), std::move(on_rcvd_or_error),
    -
    260 std::move(target_payload_blob_func), // true => Use this to determine target blob. false would mean ignore it.
    -
    261 Blob_mutable(), // true => Ignore this. But it will async-invoke itself with <false> next time.
    -
    262 0); // Ditto.
    -
    263 });
    -
    264} // async_read_with_target_func()
    -
    265
    -
    266template<typename Task_err, typename Should_interrupt_func>
    -
    267void async_read_interruptible
    -
    268 (flow::log::Logger* logger_ptr, Peer_socket* peer_socket, util::Blob_mutable target_payload_blob,
    -
    269 Should_interrupt_func&& should_interrupt_func, Task_err&& on_rcvd_or_error)
    -
    270{
    -
    271 assert(peer_socket);
    -
    272
    -
    273 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    -
    274 FLOW_LOG_TRACE("Starting: Connected local peer socket wants to read 1+ bytes to already-known location "
    -
    275 "TBD when at least some data are available to read. Will try to receive.");
    -
    276
    -
    277 auto on_rcvd_or_error_expected_form_func
    -
    278 = [on_rcvd_or_error = std::move(on_rcvd_or_error)]
    -
    279 (const Error_code& err_code, auto)
    -
    280 {
    -
    281 // Just ignore the blob location (2nd arg). It's known from the start anyway.
    -
    282 on_rcvd_or_error(err_code);
    -
    283 };
    -
    284
    -
    285 peer_socket->async_wait
    -
    286 (Peer_socket::wait_read, [logger_ptr, peer_socket,
    -
    287 target_payload_blob,
    -
    288 on_rcvd_or_error_expected_form_func = std::move(on_rcvd_or_error_expected_form_func),
    -
    289 should_interrupt_func = std::move(should_interrupt_func)]
    -
    290 (const Error_code& async_err_code) mutable
    -
    291 {
    -
    292 on_wait_readable_or_error<false> // false => See just below for meaning.
    -
    293 (logger_ptr, async_err_code, peer_socket, std::move(should_interrupt_func),
    -
    294 std::move(on_rcvd_or_error_expected_form_func),
    -
    295 0, // false => Ignore this.
    -
    296 target_payload_blob, // false => Just read into this buffer.
    -
    297 0); // No bytes read yet.
    -
    298 });
    -
    299} // async_read_interruptible()
    -
    300
    -
    301// Opt_peer_process_credentials template implementations.
    -
    302
    -
    303template<typename Protocol>
    -
    304int Opt_peer_process_credentials::level(const Protocol&) const
    -
    305{
    -
    306 return AF_LOCAL;
    -
    307}
    -
    308
    -
    309template<typename Protocol>
    -
    310int Opt_peer_process_credentials::name(const Protocol&) const
    -
    311{
    -
    312 return SO_PEERCRED;
    -
    313}
    -
    314
    -
    315template<typename Protocol>
    -
    316void* Opt_peer_process_credentials::data(const Protocol&)
    -
    317{
    -
    318 return static_cast<void*>(static_cast<util::Process_credentials*>(this));
    -
    319}
    -
    320
    -
    321template<typename Protocol>
    -
    322size_t Opt_peer_process_credentials::size(const Protocol&) const
    -
    323{
    -
    324 return sizeof(util::Process_credentials);
    -
    325}
    -
    326
    -
    327template<typename Protocol>
    -
    328void Opt_peer_process_credentials::resize(const Protocol& proto, size_t new_size_but_really_must_equal_current) const
    -
    329{
    -
    330 using flow::util::ostream_op_string;
    -
    331 using std::length_error;
    -
    332
    -
    333 if (new_size_but_really_must_equal_current != size(proto))
    -
    334 {
    -
    335 throw length_error(ostream_op_string
    -
    336 ("Opt_peer_process_credentials does not actually support resizing; requested size [",
    -
    337 new_size_but_really_must_equal_current, "] differs from forever-size [",
    -
    338 size(proto), "]. boost.asio internal bug or misuse?"));
    -
    339 }
    -
    340}
    -
    341
    -
    342} // namespace ipc::transport::asio_local_stream_socket
    -
    Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
    -
    size_t size(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    +
    33static_assert(false, "Flow-IPC must define Opt_peer_process_credentials w/ Linux SO_PEERCRED semantics. "
    +
    34 "Build in Linux only.");
    +
    35#endif
    +
    36
    +
    37/**
    +
    38 * Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket `.get_option()` in order to
    +
    39 * get the connected opposing peer process's credentials (PID/UID/GID/etc.). Note accessors and data are
    +
    40 * in non-polymorphic base util::Process_credentials.
    +
    41 *
    +
    42 * If one calls `X.get_option(Opt_peer_process_credentials& o)` on #Peer_socket `X`, and `X` is connected to opposing
    +
    43 * peer socket in process P, then `o.*()` credential accessors (such as `o.process_id()`) shall return values that were
    +
    44 * accurate about process P, at the time P executed `Peer_socket::connect()` or `local_ns::connect_pair()` yielding
    +
    45 * the connection to "local" peer `X`.
    +
    46 *
    +
    47 * @see boost.asio docs: `GettableSocketOption` in boost.asio docs: implemented concept.
    +
    48 *
    +
    49 * @internal
    +
    50 * This is the Linux `getsockopt()` option with level `AF_LOCAL` (a/k/a `AF_UNIX`), name `SO_PEERCRED`.
    +
    51 */
    +
    52class Opt_peer_process_credentials :
    +
    53 public util::Process_credentials
    +
    54{
    +
    55public:
    +
    56 // Constructors/destructor.
    +
    57
    +
    58 /// Default ctor: each value is initialized to zero or equivalent.
    +
    59 Opt_peer_process_credentials();
    +
    60
    +
    61 /**
    +
    62 * Boring copy ctor.
    +
    63 * @param src
    +
    64 * Source object.
    +
    65 */
    +
    66 Opt_peer_process_credentials(const Opt_peer_process_credentials& src);
    +
    67
    +
    68 // Methods.
    +
    69
    +
    70 /**
    +
    71 * Boring copy assignment.
    +
    72 * @param src
    +
    73 * Source object.
    +
    74 * @return `*this`.
    +
    75 */
    +
    76 Opt_peer_process_credentials& operator=(const Opt_peer_process_credentials& src);
    +
    77
    +
    78 /**
    +
    79 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    +
    80 *
    +
    81 * @see boost.asio docs: `GettableSocketOption::level()` in boost.asio docs: implemented concept.
    +
    82 *
    +
    83 * @tparam Protocol
    +
    84 * See concept API.
    +
    85 * @param proto
    +
    86 * See concept API.
    +
    87 * @return See concept API.
    +
    88 *
    +
    89 * @internal
    +
    90 * It's `AF_LOCAL` a/k/a `AF_UNIX`.
    +
    91 */
    +
    92 template<typename Protocol>
    +
    93 int level(const Protocol& proto) const;
    +
    94
    +
    95 /**
    +
    96 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    +
    97 *
    +
    98 * @see boost.asio docs: `GettableSocketOption::name()` in boost.asio docs: implemented concept.
    +
    99 *
    +
    100 * @tparam Protocol
    +
    101 * See concept API.
    +
    102 * @param proto
    +
    103 * See concept API.
    +
    104 * @return See concept API.
    +
    105 *
    +
    106 * @internal
    +
    107 * It's `SO_PEERCRED`.
    +
    108 */
    +
    109 template<typename Protocol>
    +
    110 int name(const Protocol& proto) const;
    +
    111
    +
    112 /**
    +
    113 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    +
    114 *
    +
    115 * @see boost.asio docs: `GettableSocketOption::data()` in boost.asio docs: implemented concept.
    +
    116 *
    +
    117 * @tparam Protocol
    +
    118 * See concept API.
    +
    119 * @param proto
    +
    120 * See concept API.
    +
    121 * @return See concept API.
    +
    122 *
    +
    123 * @internal
    +
    124 * It's `SO_PEERCRED`.
    +
    125 */
    +
    126 template<typename Protocol>
    +
    127 void* data(const Protocol& proto);
    +
    128
    +
    129 /**
    +
    130 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    +
    131 *
    +
    132 * @see boost.asio docs: `GettableSocketOption::size()` in boost.asio docs: implemented concept.
    +
    133 *
    +
    134 * @tparam Protocol
    +
    135 * See concept API.
    +
    136 * @param proto
    +
    137 * See concept API.
    +
    138 * @return See concept API.
    +
    139 *
    +
    140 * @internal
    +
    141 * It's `sizeof(ucred)`.
    +
    142 */
    +
    143 template<typename Protocol>
    +
    144 size_t size(const Protocol& proto) const;
    +
    145
    +
    146 /**
    +
    147 * For internal boost.asio use, to enable `Peer_socket::get_option(Opt_peer_process_credentials&)` to work.
    +
    148 *
    +
    149 * @see boost.asio docs: `GettableSocketOption::resize()` in boost.asio docs: implemented concept.
    +
    150 *
    +
    151 * @tparam Protocol
    +
    152 * See concept API.
    +
    153 * @param proto
    +
    154 * See concept API.
    +
    155 * @param new_size_but_really_must_equal_current
    +
    156 * See concept API.
    +
    157 *
    +
    158 * @internal
    +
    159 * Resizing is not allowed for this option, so really it's either a no-op, or -- if
    +
    160 * `new_size_but_really_must_equal_current != size()` -- throws exception.
    +
    161 */
    +
    162 template<typename Protocol>
    +
    163 void resize(const Protocol& proto, size_t new_size_but_really_must_equal_current) const;
    +
    164}; // class Opt_peer_process_credentials
    +
    165
    +
    166// Free functions: in *_fwd.hpp.
    +
    167
    +
    168// Template implementations.
    +
    169
    +
    170template<typename Task_err>
    +
    171void async_write_with_native_handle(flow::log::Logger* logger_ptr,
    +
    172 Peer_socket* peer_socket_ptr,
    +
    173 Native_handle payload_hndl,
    +
    174 const util::Blob_const& payload_blob,
    +
    175 Task_err&& on_sent_or_error)
    +
    176{
    +
    177 using util::blob_data;
    +
    178 using flow::util::buffers_dump_string;
    +
    179
    +
    180 assert(peer_socket_ptr);
    +
    181 assert((!payload_hndl.null()) && (payload_blob.size() != 0));
    +
    182
    +
    183 auto& peer_socket = *peer_socket_ptr;
    +
    184
    +
    185 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    +
    186
    +
    187 FLOW_LOG_TRACE("Starting: Via connected local peer socket, will send handle [" << payload_hndl << "] with "
    +
    188 "blob of size [" << payload_blob.size() << "] "
    +
    189 "located @ [" << payload_blob.data() << "].");
    +
    190
    +
    191 // Verbose and slow (100% skipped unless log filter passes).
    +
    192 FLOW_LOG_DATA("Starting: Blob contents are "
    +
    193 "[" << buffers_dump_string(payload_blob, " ") << "].");
    +
    194
    +
    195 /* OK, now our task is to asynchronously send (1) payload_hndl (native handle) and (2) payload_blob (a buffer)
    +
    196 * over peer_socket (a connected local socket). As explicitly documented in boost.asio docs: it does not provide an
    +
    197 * API for the former (fairly hairy and Linux-specific) handle-transmitting feature, but it is doable by using
    +
    198 * sendmsg() natively via peer_socket.native_handle() which gets the native handle (a/k/a FD). That can only
    +
    199 * be called when the socket is actually writable; meaning sendmsg() will return 1+ bytes sent; and if not writable
    +
    200 * then it'd return EWOULDBLOCK/EAGAIN. Hence we must in this case use reactor-style pattern which is a fancy way
    +
    201 * way of saying we must split the typical proactor-style wait-and-write-when-writable operation into 2:
    +
    202 * first wait; then once ready try to write. boost.asio will nicely do the first part for us; but once it claims
    +
    203 * peer_socket is in fact writable, then we step in with the aforementioned native sendmsg() stuff. So do the
    +
    204 * wait now (peer_socket.async_wait()).
    +
    205 *
    +
    206 * Subtlety: In most cases we'd try to put the body of the handler fully right in here; stylistically that's more
    +
    207 * compact and arguably readable. Instead we delegate 99.9% of the code to a helper executed from inside this
    +
    208 * closure that'd normally have all the code. Why? Answer: The handler may need to retry this same wait; so it
    +
    209 * must specify itself as a handler again. That wouldn't work, even if syntactically achievable by saving
    +
    210 * the handler itself via [capture], because async_wait() immediately returns, hence the present function does
    +
    211 * too, hence anything on the stack disappears, hence whatever was [captured] would point to nothing. If one tries
    +
    212 * to do it, there's probably purely syntactically going to be a chicken-egg problem. This could be worked
    +
    213 * around via the oft-used shared_ptr<> technique... but why go crazy? It is more straightforward to
    +
    214 * have a permanent actual (helper) function and just have it refer to itself when it must. Splitting this
    +
    215 * function body into the above and a helper is perfectly fine anyway, so let's not get too clever.
    +
    216 *
    +
    217 * Subtlety: I have confirmed that the proper wait type is _write. _error may sound like it detects error conditions
    +
    218 * on the socket; but actually that refers to (no thanks to boost.asio docs BTW) obscure
    +
    219 * stuff like MSG_OOB... nothing relevant. An actual error like ECONNRESET would stop the _write wait and pass
    +
    220 * the triggering error code (as desired). */
    +
    221
    +
    222 peer_socket.async_wait
    +
    223 (Peer_socket::wait_write,
    +
    224 [logger_ptr, payload_hndl, payload_blob, peer_socket_ptr,
    +
    225 on_sent_or_error = std::move(on_sent_or_error)]
    +
    226 (const Error_code& sys_err_code) mutable
    +
    227 {
    +
    228 on_wait_writable_or_error(logger_ptr, sys_err_code, payload_hndl, payload_blob, peer_socket_ptr,
    +
    229 std::move(on_sent_or_error));
    +
    230 });
    +
    231} // async_write_with_native_handle()
    +
    232
    +
    233template<typename Task_err_blob, typename Target_payload_blob_func, typename Should_interrupt_func>
    +
    234void async_read_with_target_func
    +
    235 (flow::log::Logger* logger_ptr, Peer_socket* peer_socket,
    +
    236 Target_payload_blob_func&& target_payload_blob_func, Should_interrupt_func&& should_interrupt_func,
    +
    237 Task_err_blob&& on_rcvd_or_error)
    +
    238{
    +
    239 using util::Blob_mutable;
    +
    240
    +
    241 assert(peer_socket);
    +
    242
    +
    243 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    +
    244 FLOW_LOG_TRACE("Starting: Connected local peer socket wants to read 1+ bytes to some currently-unknown location "
    +
    245 "TBD when at least some data are available to read. Will try to receive.");
    +
    246
    +
    247 /* Without having to support should_interrupt_func feature, we could have done async_wait()->determine target
    +
    248 * buffer->async_read(). We must support it, so we have so split the latter into repeated
    +
    249 * async_wait()->read_some(), so we can check should_interrupt_func() ahead of each read_some().
    +
    250 * Kick it off here. */
    +
    251
    +
    252 peer_socket->async_wait
    +
    253 (Peer_socket::wait_read, [logger_ptr, peer_socket,
    +
    254 target_payload_blob_func = std::move(target_payload_blob_func),
    +
    255 on_rcvd_or_error = std::move(on_rcvd_or_error),
    +
    256 should_interrupt_func = std::move(should_interrupt_func)]
    +
    257 (const Error_code& async_err_code) mutable
    +
    258 {
    +
    259 on_wait_readable_or_error<true> // true => See just below for meaning.
    +
    260 (logger_ptr, async_err_code, peer_socket, std::move(should_interrupt_func), std::move(on_rcvd_or_error),
    +
    261 std::move(target_payload_blob_func), // true => Use this to determine target blob. false would mean ignore it.
    +
    262 Blob_mutable(), // true => Ignore this. But it will async-invoke itself with <false> next time.
    +
    263 0); // Ditto.
    +
    264 });
    +
    265} // async_read_with_target_func()
    +
    266
    +
    267template<typename Task_err, typename Should_interrupt_func>
    +
    268void async_read_interruptible
    +
    269 (flow::log::Logger* logger_ptr, Peer_socket* peer_socket, util::Blob_mutable target_payload_blob,
    +
    270 Should_interrupt_func&& should_interrupt_func, Task_err&& on_rcvd_or_error)
    +
    271{
    +
    272 assert(peer_socket);
    +
    273
    +
    274 FLOW_LOG_SET_CONTEXT(logger_ptr, Log_component::S_TRANSPORT);
    +
    275 FLOW_LOG_TRACE("Starting: Connected local peer socket wants to read 1+ bytes to already-known location "
    +
    276 "TBD when at least some data are available to read. Will try to receive.");
    +
    277
    +
    278 auto on_rcvd_or_error_expected_form_func
    +
    279 = [on_rcvd_or_error = std::move(on_rcvd_or_error)]
    +
    280 (const Error_code& err_code, auto)
    +
    281 {
    +
    282 // Just ignore the blob location (2nd arg). It's known from the start anyway.
    +
    283 on_rcvd_or_error(err_code);
    +
    284 };
    +
    285
    +
    286 peer_socket->async_wait
    +
    287 (Peer_socket::wait_read, [logger_ptr, peer_socket,
    +
    288 target_payload_blob,
    +
    289 on_rcvd_or_error_expected_form_func = std::move(on_rcvd_or_error_expected_form_func),
    +
    290 should_interrupt_func = std::move(should_interrupt_func)]
    +
    291 (const Error_code& async_err_code) mutable
    +
    292 {
    +
    293 on_wait_readable_or_error<false> // false => See just below for meaning.
    +
    294 (logger_ptr, async_err_code, peer_socket, std::move(should_interrupt_func),
    +
    295 std::move(on_rcvd_or_error_expected_form_func),
    +
    296 0, // false => Ignore this.
    +
    297 target_payload_blob, // false => Just read into this buffer.
    +
    298 0); // No bytes read yet.
    +
    299 });
    +
    300} // async_read_interruptible()
    +
    301
    +
    302// Opt_peer_process_credentials template implementations.
    +
    303
    +
    304template<typename Protocol>
    +
    305int Opt_peer_process_credentials::level(const Protocol&) const
    +
    306{
    +
    307 return AF_LOCAL;
    +
    308}
    +
    309
    +
    310template<typename Protocol>
    +
    311int Opt_peer_process_credentials::name(const Protocol&) const
    +
    312{
    +
    313 return SO_PEERCRED;
    +
    314}
    +
    315
    +
    316template<typename Protocol>
    +
    317void* Opt_peer_process_credentials::data(const Protocol&)
    +
    318{
    +
    319 return static_cast<void*>(static_cast<util::Process_credentials*>(this));
    +
    320}
    +
    321
    +
    322template<typename Protocol>
    +
    323size_t Opt_peer_process_credentials::size(const Protocol&) const
    +
    324{
    +
    325 return sizeof(util::Process_credentials);
    +
    326}
    +
    327
    +
    328template<typename Protocol>
    +
    329void Opt_peer_process_credentials::resize(const Protocol& proto, size_t new_size_but_really_must_equal_current) const
    +
    330{
    +
    331 using flow::util::ostream_op_string;
    +
    332 using std::length_error;
    +
    333
    +
    334 if (new_size_but_really_must_equal_current != size(proto))
    +
    335 {
    +
    336 throw length_error(ostream_op_string
    +
    337 ("Opt_peer_process_credentials does not actually support resizing; requested size [",
    +
    338 new_size_but_really_must_equal_current, "] differs from forever-size [",
    +
    339 size(proto), "]. boost.asio internal bug or misuse?"));
    +
    340 }
    +
    341}
    +
    342
    +
    343} // namespace ipc::transport::asio_local_stream_socket
    +
    Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
    +
    size_t size(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    Opt_peer_process_credentials()
    Default ctor: each value is initialized to zero or equivalent.
    Opt_peer_process_credentials & operator=(const Opt_peer_process_credentials &src)
    Boring copy assignment.
    -
    int level(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    +
    int level(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    Opt_peer_process_credentials(const Opt_peer_process_credentials &src)
    Boring copy ctor.
    -
    void * data(const Protocol &proto)
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    -
    int name(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    -
    void resize(const Protocol &proto, size_t new_size_but_really_must_equal_current) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    +
    void * data(const Protocol &proto)
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    +
    int name(const Protocol &proto) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    +
    void resize(const Protocol &proto, size_t new_size_but_really_must_equal_current) const
    For internal boost.asio use, to enable Peer_socket::get_option(Opt_peer_process_credentials&) to work...
    A process's credentials (PID, UID, GID as of this writing).
    -
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    +
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    local_ns::stream_protocol Protocol
    Short-hand for boost.asio Unix domain stream-socket protocol.
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    void on_wait_writable_or_error(flow::log::Logger *logger_ptr, const Error_code &sys_err_code, Native_handle payload_hndl, const util::Blob_const &payload_blob_ref, Peer_socket *peer_socket_ptr, Task_err &&on_sent_or_error)
    Helper of async_write_with_native_handle() used as the callback executed when waiting for writability...
    -
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    -
    void async_read_with_target_func(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, Target_payload_blob_func &&target_payload_blob_func, Should_interrupt_func &&should_interrupt_func, Task_err_blob &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    -
    void async_read_interruptible(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, util::Blob_mutable target_payload_blob, Should_interrupt_func &&should_interrupt_func, Task_err &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    -
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:156
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    +
    void async_read_with_target_func(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, Target_payload_blob_func &&target_payload_blob_func, Should_interrupt_func &&should_interrupt_func, Task_err_blob &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    +
    void async_read_interruptible(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, util::Blob_mutable target_payload_blob, Should_interrupt_func &&should_interrupt_func, Task_err &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    +
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:158
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp.html index 08e5a9b77..ca27c6594 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -139,7 +139,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp_source.html index e5e87510f..e7fe4fbe1 100644 --- a/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/asio__local__stream__socket__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -779,29 +779,29 @@
    707void release_native_peer_socket(Native_handle&& peer_socket_native_or_null);
    708
    709} // namespace ipc::transport::asio_local_stream_socket
    -
    Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
    -
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    +
    Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
    +
    Additional (versus boost.asio) APIs for advanced work with local stream (Unix domain) sockets includi...
    Protocol::endpoint Endpoint
    Short-hand for boost.asio Unix domain peer stream-socket endpoint.
    local_ns::stream_protocol Protocol
    Short-hand for boost.asio Unix domain stream-socket protocol.
    -
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    +
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    Protocol::acceptor Acceptor
    Short-hand for boost.asio Unix domain stream-socket acceptor (listening guy) socket.
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    -
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    -
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    -
    void async_read_with_target_func(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, Target_payload_blob_func &&target_payload_blob_func, Should_interrupt_func &&should_interrupt_func, Task_err_blob &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    -
    void async_read_interruptible(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, util::Blob_mutable target_payload_blob, Should_interrupt_func &&should_interrupt_func, Task_err &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    -
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    +
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    +
    void async_read_with_target_func(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, Target_payload_blob_func &&target_payload_blob_func, Should_interrupt_func &&should_interrupt_func, Task_err_blob &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    +
    void async_read_interruptible(flow::log::Logger *logger_ptr, Peer_socket *peer_socket, util::Blob_mutable target_payload_blob, Should_interrupt_func &&should_interrupt_func, Task_err &&on_rcvd_or_error)
    boost.asio extension similar to boost::asio::async_read(Peer_socket&, Blob_mutable,...
    +
    void release_native_peer_socket(Native_handle &&peer_socket_native_or_null)
    Little utility that returns the raw Native_handle suitable for Peer_socket to the OS.
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp.html b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp.html index 20234b3f8..2d873df79 100644 --- a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp.html +++ b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -92,7 +92,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp_source.html b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp_source.html index e0f7d06a5..ea385f3c6 100644 --- a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -165,15 +165,15 @@
    Asio_waitable_native_handle & operator=(Asio_waitable_native_handle &&src)
    Move-assign.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    -
    Contains common code, as well as important explanatory documentation in the following text,...
    Definition: util_fwd.hpp:208
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    -
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    Contains common code, as well as important explanatory documentation in the following text,...
    Definition: util_fwd.hpp:209
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    diff --git a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp.html b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp.html index 679f84459..1bd667a36 100644 --- a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -99,7 +99,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp_source.html b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp_source.html index 1e23d336e..dceebd616 100644 --- a/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/asio__waitable__native__hndl_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -314,14 +314,14 @@
    Asio_waitable_native_handle(Asio_waitable_native_handle &&src)
    Move-construct.
    Native_handle native_handle()
    Returns the same Native_handle as passed to original handle-loading ctor or assign(),...
    Asio_waitable_native_handle & operator=(Asio_waitable_native_handle &&src)
    Move-assign.
    -
    Contains common code, as well as important explanatory documentation in the following text,...
    Definition: util_fwd.hpp:208
    +
    Contains common code, as well as important explanatory documentation in the following text,...
    Definition: util_fwd.hpp:209
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    diff --git a/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp.html b/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp.html index 1d0c3800a..e8f9689eb 100644 --- a/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp.html +++ b/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -106,7 +106,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp_source.html b/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp_source.html index f3d181c78..021d385db 100644 --- a/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/async__adapter__rcv_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -861,21 +861,21 @@
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
    boost::shared_ptr< Task > Task_ptr
    Short-hand for ref-counted pointer to a Function<> that takes no arguments and returns nothing; in pa...
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    Data store representing a deficit user async-receive request: either one being currently handled by m...
    Native_handle * m_target_hndl_ptr
    See async_receive_native_handle() target_hndl. Null for async_receive_blob().
    util::Blob_mutable m_target_meta_blob
    See async_receive_native_handle() target_meta_blob. Or see async_receive_blob() target_blob.
    boost::movelib::unique_ptr< User_request > Ptr
    Short-hand for unique_ptr to this.
    flow::async::Task_asio_err_sz m_on_done_func
    See async_receive_native_handle() or async_receive_blob() on_done_func.
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp.html b/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp.html index a5084a360..b94485810 100644 --- a/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,7 +102,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp_source.html b/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp_source.html index d112cf152..28d2d0db1 100644 --- a/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/async__adapter__snd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -564,16 +564,16 @@
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
    boost::shared_ptr< Task > Task_ptr
    Short-hand for ref-counted pointer to a Function<> that takes no arguments and returns nothing; in pa...
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/async_loop.html b/doc/ipc_doc/generated/html_full/async_loop.html index fc7be3d2e..f50ba2f5d 100644 --- a/doc/ipc_doc/generated/html_full/async_loop.html +++ b/doc/ipc_doc/generated/html_full/async_loop.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,13 +102,13 @@

    Your application's event loop versus an Flow-IPC async op

    That note aside: The most basic operation of interest to us has the following form:

    template<typename Task> // Task = function type matching signature `void F()`.
    void post(Task&& task);
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122

    This operation, invokable both from within an already-executing task on thread U, or from any other thread, enqueues std::move(task) onto the task-queue, so that run() either wakes up thread U (if currently sleeping) and executes task() (no args), or else it'll get invoked once ongoing tasks have been executed and popped. post() itself does not synchronously invoke task(); but if invoked from within a task (i.e., from thread U, i.e., from run() itself), then run() will possibly invoke the moment the current (posting) task returns.

    Note
    post() is thread-safe, in that it takes care of any synchronization of the internally-kept task-queue, itself.

    Now, consider the aforementioned Blob_receiver receive op. Its API is as follows:

    template<typename Handler> // Handler = function type matching signature `void F(const Error_code&, size_t n_sz)`.
    void async_receive_blob(ipc::util::Blob_mutable target_buf, Handler&& handler);
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140

    To use it, a task in the context of an event loop in thread U might be written as follows:

    class My_loop
    {
    @@ -161,7 +161,7 @@

    Your application's event loop versus an Flow-IPC async op

    }
    };
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    The key points:

    diff --git a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp.html b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp.html index 6798fab63..aa158305c 100644 --- a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -104,7 +104,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp_source.html b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp_source.html index fb3dcf5fe..a675227ce 100644 --- a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -1013,96 +1013,97 @@
    941 * shows that mq::remove() calls shared_memory_object::remove() which calls some internal
    942 * ipcdetail::delete_file() which calls... drumroll... freakin' ::unlink(const char*). Hence we haxor: */
    943#ifndef FLOW_OS_LINUX // @todo Should maybe check Boost version or something too?
    -
    944# error "Code in Bipc_mq_handle::remove_persistent() relies on Boost invoking Linux unlink() with errno."
    -
    945#endif
    -
    946 const auto& sys_err_code = *err_code = Error_code(errno, system_category());
    -
    947 FLOW_ERROR_SYS_ERROR_LOG_WARNING();
    -
    948} // Bipc_mq_handle::remove_persistent()
    -
    949
    -
    950template<typename Func>
    -
    951void Bipc_mq_handle::op_with_possible_bipc_mq_exception(Error_code* err_code, util::String_view context,
    -
    952 const Func& func)
    -
    953{
    -
    954 using flow::error::Runtime_error;
    -
    955 using bipc::interprocess_exception;
    -
    956 using boost::system::system_category;
    -
    957
    -
    958 if (flow::error::exec_void_and_throw_on_error
    -
    959 ([&](Error_code* actual_err_code) { op_with_possible_bipc_mq_exception(actual_err_code, context, func); },
    -
    960 err_code, context))
    -
    961 {
    -
    962 return;
    -
    963 }
    -
    964 // else
    -
    965
    -
    966 try
    -
    967 {
    -
    968 func();
    -
    969 }
    -
    970 catch (const interprocess_exception& exc)
    -
    971 {
    -
    972 /* They appear to always throw this guy with some interesting semantics. We want to yield our consistent
    -
    973 * Flow-style semantics, namely produce a truthy *err_code (which, if actual original err_code was null will
    -
    974 * be instead thrown after being wrapped in a flow::Runtime_error, which is really a boost::system::system_error
    -
    975 * with a cleaner what() message). More details inline below.
    -
    976 *
    -
    977 * So interprocess_exception is not a system_error even but rather an exception with a particular custom API.
    -
    978 * To ensure the information is logged *somewhere* for sure and not lost do log all of this.
    -
    979 * After that normalize to the *err_code semantics, even if some information is lost -- though we'll try
    -
    980 * to lose nothing even so. */
    -
    981 const auto native_code_raw = exc.get_native_error();
    -
    982 const auto bipc_err_code_enum = exc.get_error_code();
    -
    983 const bool is_size_error = bipc_err_code_enum == bipc::size_error;
    -
    984 FLOW_LOG_WARNING("bipc threw interprocess_exception; will emit some hopefully suitable Flow-IPC Error_code; "
    -
    985 "but here are all the details of the original exception: native code int "
    -
    986 "[" << native_code_raw << "]; bipc error_code_t enum->int "
    -
    987 "[" << int(bipc_err_code_enum) << "]; latter==size_error? = [" << is_size_error << "]; "
    -
    988 "message = [" << exc.what() << "]; context = [" << context << "].");
    -
    989
    -
    990 /* Special case: size_error is thrown by message_queue on a receive with underflow or send with overflow.
    -
    991 * Our API contract (Persistent_mq_handle concept doc header) is to emit this particular code then. */
    -
    992 if (is_size_error)
    -
    993 {
    -
    994 // Sufficient. (Check of Boost 1.78 source code confirms there's no native code in this case anyway.)
    -
    995 *err_code = error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW;
    -
    996 return;
    -
    997 }
    -
    998 // else
    -
    999 if (native_code_raw != 0)
    -
    1000 {
    -
    1001 /* At least in POSIX, interprocess_exception only does the following in this case:
    -
    1002 * - strerror(native_code_raw) => the message. But that's standard boost.system errno handling already;
    -
    1003 * so if just emit a system_category() Error_code, all will be equally well message-wise in what().
    -
    1004 * - They have a table that maps certain native_code_raw values to one of a few (not super-many but not
    -
    1005 * a handful) bipc_err_code_enum enum values. Technically the following will lose that information;
    -
    1006 * but (1) it is logged above; and (2) so what? */
    -
    1007 const auto& sys_err_code = *err_code = Error_code(native_code_raw, system_category());
    -
    1008 FLOW_ERROR_SYS_ERROR_LOG_WARNING();
    -
    1009 return;
    -
    1010 }
    -
    1011 // else
    -
    1012
    -
    1013 /* All we have is bipc_err_code_enum. We've already handled the known likely issue, size_error. Beyond that
    -
    1014 * there does not seem to be much we can do; really it's a matter of either emitting one catch-all code or
    -
    1015 * having our own equivalents of their enum. For now, at least, the former is OK. @todo Revisit. */
    -
    1016 *err_code = error::Code::S_MQ_BIPC_MISC_LIBRARY_ERROR; // The earlier WARNING is good enough.
    -
    1017 return;
    -
    1018 } // catch ()
    -
    1019 // Got here: all good.
    -
    1020 err_code->clear();
    -
    1021} // Bipc_mq_handle::op_with_possible_bipc_mq_exception()
    -
    1022
    -
    1023const Shared_name& Bipc_mq_handle::absolute_name() const
    -
    1024{
    -
    1025 return m_absolute_name;
    -
    1026}
    -
    1027
    -
    1028std::ostream& operator<<(std::ostream& os, const Bipc_mq_handle& val)
    -
    1029{
    -
    1030 return os << '@' << &val << ": sh_name[" << val.absolute_name() << ']';
    -
    1031}
    -
    1032
    -
    1033} // namespace ipc::transport
    +
    944 static_assert(false,
    +
    945 "Code in Bipc_mq_handle::remove_persistent() relies on Boost invoking Linux unlink() with errno.");
    +
    946#endif
    +
    947 const auto& sys_err_code = *err_code = Error_code(errno, system_category());
    +
    948 FLOW_ERROR_SYS_ERROR_LOG_WARNING();
    +
    949} // Bipc_mq_handle::remove_persistent()
    +
    950
    +
    951template<typename Func>
    +
    952void Bipc_mq_handle::op_with_possible_bipc_mq_exception(Error_code* err_code, util::String_view context,
    +
    953 const Func& func)
    +
    954{
    +
    955 using flow::error::Runtime_error;
    +
    956 using bipc::interprocess_exception;
    +
    957 using boost::system::system_category;
    +
    958
    +
    959 if (flow::error::exec_void_and_throw_on_error
    +
    960 ([&](Error_code* actual_err_code) { op_with_possible_bipc_mq_exception(actual_err_code, context, func); },
    +
    961 err_code, context))
    +
    962 {
    +
    963 return;
    +
    964 }
    +
    965 // else
    +
    966
    +
    967 try
    +
    968 {
    +
    969 func();
    +
    970 }
    +
    971 catch (const interprocess_exception& exc)
    +
    972 {
    +
    973 /* They appear to always throw this guy with some interesting semantics. We want to yield our consistent
    +
    974 * Flow-style semantics, namely produce a truthy *err_code (which, if actual original err_code was null will
    +
    975 * be instead thrown after being wrapped in a flow::Runtime_error, which is really a boost::system::system_error
    +
    976 * with a cleaner what() message). More details inline below.
    +
    977 *
    +
    978 * So interprocess_exception is not a system_error even but rather an exception with a particular custom API.
    +
    979 * To ensure the information is logged *somewhere* for sure and not lost do log all of this.
    +
    980 * After that normalize to the *err_code semantics, even if some information is lost -- though we'll try
    +
    981 * to lose nothing even so. */
    +
    982 const auto native_code_raw = exc.get_native_error();
    +
    983 const auto bipc_err_code_enum = exc.get_error_code();
    +
    984 const bool is_size_error = bipc_err_code_enum == bipc::size_error;
    +
    985 FLOW_LOG_WARNING("bipc threw interprocess_exception; will emit some hopefully suitable Flow-IPC Error_code; "
    +
    986 "but here are all the details of the original exception: native code int "
    +
    987 "[" << native_code_raw << "]; bipc error_code_t enum->int "
    +
    988 "[" << int(bipc_err_code_enum) << "]; latter==size_error? = [" << is_size_error << "]; "
    +
    989 "message = [" << exc.what() << "]; context = [" << context << "].");
    +
    990
    +
    991 /* Special case: size_error is thrown by message_queue on a receive with underflow or send with overflow.
    +
    992 * Our API contract (Persistent_mq_handle concept doc header) is to emit this particular code then. */
    +
    993 if (is_size_error)
    +
    994 {
    +
    995 // Sufficient. (Check of Boost 1.78 source code confirms there's no native code in this case anyway.)
    +
    996 *err_code = error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW;
    +
    997 return;
    +
    998 }
    +
    999 // else
    +
    1000 if (native_code_raw != 0)
    +
    1001 {
    +
    1002 /* At least in POSIX, interprocess_exception only does the following in this case:
    +
    1003 * - strerror(native_code_raw) => the message. But that's standard boost.system errno handling already;
    +
    1004 * so if just emit a system_category() Error_code, all will be equally well message-wise in what().
    +
    1005 * - They have a table that maps certain native_code_raw values to one of a few (not super-many but not
    +
    1006 * a handful) bipc_err_code_enum enum values. Technically the following will lose that information;
    +
    1007 * but (1) it is logged above; and (2) so what? */
    +
    1008 const auto& sys_err_code = *err_code = Error_code(native_code_raw, system_category());
    +
    1009 FLOW_ERROR_SYS_ERROR_LOG_WARNING();
    +
    1010 return;
    +
    1011 }
    +
    1012 // else
    +
    1013
    +
    1014 /* All we have is bipc_err_code_enum. We've already handled the known likely issue, size_error. Beyond that
    +
    1015 * there does not seem to be much we can do; really it's a matter of either emitting one catch-all code or
    +
    1016 * having our own equivalents of their enum. For now, at least, the former is OK. @todo Revisit. */
    +
    1017 *err_code = error::Code::S_MQ_BIPC_MISC_LIBRARY_ERROR; // The earlier WARNING is good enough.
    +
    1018 return;
    +
    1019 } // catch ()
    +
    1020 // Got here: all good.
    +
    1021 err_code->clear();
    +
    1022} // Bipc_mq_handle::op_with_possible_bipc_mq_exception()
    +
    1023
    +
    1024const Shared_name& Bipc_mq_handle::absolute_name() const
    +
    1025{
    +
    1026 return m_absolute_name;
    +
    1027}
    +
    1028
    +
    1029std::ostream& operator<<(std::ostream& os, const Bipc_mq_handle& val)
    +
    1030{
    +
    1031 return os << '@' << &val << ": sh_name[" << val.absolute_name() << ']';
    +
    1032}
    +
    1033
    +
    1034} // namespace ipc::transport
    Implements the Persistent_mq_handle concept by thinly wrapping bipc::message_queue,...
    Bipc_mq_handle()
    Implements Persistent_mq_handle API: Construct null handle.
    @@ -1116,7 +1117,7 @@
    bool try_send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns t...
    bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message...
    bool timed_receive(util::Blob_mutable *blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buf...
    -
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    +
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    bool allow_sends()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-sends an...
    bool try_receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffe...
    @@ -1128,7 +1129,7 @@
    bool m_interrupting_snd
    Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); when true wait...
    bool timed_send(const util::Blob_const &blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue i...
    static void remove_persistent(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Removes the named persistent MQ.
    -
    void op_with_possible_bipc_mq_exception(Error_code *err_code, util::String_view context, const Func &func)
    Error helper: Run func() which will perform a bipc::message_queue API that might throw; if it does em...
    +
    void op_with_possible_bipc_mq_exception(Error_code *err_code, util::String_view context, const Func &func)
    Error helper: Run func() which will perform a bipc::message_queue API that might throw; if it does em...
    void receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; i...
    size_t max_n_msgs() const
    Implements Persistent_mq_handle API: Returns the max message count of the underlying queue.
    ~Bipc_mq_handle()
    Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully con...
    @@ -1146,30 +1147,30 @@
    @ S_INTERRUPTED
    A blocking operation was intentionally interrupted or preemptively canceled.
    @ S_MQ_BIPC_MISC_LIBRARY_ERROR
    Low-level message queue: boost.interprocess emitted miscellaneous library exception sans a system cod...
    @ S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW
    Low-level message queue send-op buffer overflow (> max size) or receive-op buffer underflow (< max si...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    util::Shared_name Shared_name
    Convenience alias for the commonly used type util::Shared_name.
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    void swap(Bipc_mq_handle &val1, Bipc_mq_handle &val2)
    Implements Persistent_mq_handle related concept: Swaps two objects.
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:156
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:158
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    const Open_or_create OPEN_OR_CREATE
    Tag value indicating an open-if-exists-else-create operation.
    Definition: util.cpp:30
    const Open_only OPEN_ONLY
    Tag value indicating an atomic open-if-exists-else-fail operation.
    Definition: util.cpp:31
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    -
    flow::Fine_time_pt Fine_time_pt
    Short-hand for Flow's Fine_time_pt.
    Definition: util_fwd.hpp:113
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    +
    flow::Fine_time_pt Fine_time_pt
    Short-hand for Flow's Fine_time_pt.
    Definition: util_fwd.hpp:119
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    const Create_only CREATE_ONLY
    Tag value indicating an atomic create-unless-exists-else-fail operation.
    Definition: util.cpp:32
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp.html index 691517399..3bf435c4f 100644 --- a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -99,7 +99,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp_source.html b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp_source.html index 3ba45bcac..da5983a02 100644 --- a/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/bipc__mq__handle_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -714,7 +714,7 @@
    bool try_send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns t...
    bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message...
    bool timed_receive(util::Blob_mutable *blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buf...
    -
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    +
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    static constexpr bool S_HAS_NATIVE_HANDLE
    Implements concept API.
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    bool allow_sends()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-sends an...
    @@ -726,7 +726,7 @@
    bool timed_send(const util::Blob_const &blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue i...
    Bipc_mq_handle(Bipc_mq_handle &&src)
    Implements Persistent_mq_handle API: Constructs handle from the source handle while making the latter...
    static void remove_persistent(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Removes the named persistent MQ.
    -
    void op_with_possible_bipc_mq_exception(Error_code *err_code, util::String_view context, const Func &func)
    Error helper: Run func() which will perform a bipc::message_queue API that might throw; if it does em...
    +
    void op_with_possible_bipc_mq_exception(Error_code *err_code, util::String_view context, const Func &func)
    Error helper: Run func() which will perform a bipc::message_queue API that might throw; if it does em...
    void receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; i...
    size_t max_n_msgs() const
    Implements Persistent_mq_handle API: Returns the max message count of the underlying queue.
    ~Bipc_mq_handle()
    Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully con...
    @@ -739,17 +739,17 @@
    friend void swap(Bipc_mq_handle &val1, Bipc_mq_handle &val2)
    Implements Persistent_mq_handle related concept: Swaps two objects.
    bool is_sendable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
    Equivalent to shm::classic::Pool_arena::for_each_persistent().
    Definition: util.hpp:130
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
    Equivalent to shm::classic::Pool_arena::for_each_persistent().
    Definition: util.hpp:131
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    @@ -757,7 +757,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp.html b/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp.html index fbbc5a951..c840e0c96 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -95,7 +95,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp_source.html b/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp_source.html index c792e380e..8127fa089 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -183,12 +183,12 @@
    static void for_each_persistent(const Handle_name_func &handle_name_func)
    Forwards to Persistent_mq_handle::for_each_persistent().
    static void remove_persistent(flow::log::Logger *logger_ptr, const Shared_name &name, Error_code *err_code=0)
    Removes the Blob_stream_mq_sender and/or Blob_stream_mq_receiver persistent resources associated with...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp.html index 0b0c8f808..a12ea5a6b 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,7 +102,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp_source.html index be50cde84..f532089cd 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -439,7 +439,7 @@
    Persistent_mq_handle Mq
    Short-hand for template arg for underlying MQ handle type.
    boost::movelib::unique_ptr< Mq, Function< void(Mq *)> > Auto_closing_mq
    Persistent_mq_handle holder that takes a deleter lambda on construction, intended here to perform add...
    static Shared_name mq_sentinel_name(const Shared_name &mq_name, bool snd_else_rcv)
    Name of sentinel SHM pool created by ensure_unique_peer() and potentially cleaned up by remove_persis...
    -
    A documentation-only concept defining the behavior of an object representing a light-weight handle to...
    +
    A documentation-only concept defining the behavior of an object representing a light-weight handle to...
    const Shared_name & absolute_name() const
    Returns name equal to absolute_name passed to ctor.
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    static const Shared_name S_RESOURCE_TYPE_ID_SHM
    Relative-folder fragment (no separators) identifying the resource type for: SHM pools.
    @@ -448,20 +448,20 @@
    @ S_BLOB_STREAM_MQ_SENDER_EXISTS
    Message-queue blob stream outgoing-direction peer could not be created, because one already exists at...
    @ S_BLOB_STREAM_MQ_RECEIVER_EXISTS
    Message-queue blob stream incoming-direction peer could not be created, because one already exists at...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    void remove_persistent_shm_pool(flow::log::Logger *logger_ptr, const Shared_name &pool_name, Error_code *err_code)
    Equivalent to shm::classic::Pool_arena::remove_persistent().
    Definition: util.cpp:119
    Shared_name build_conventional_non_session_based_shared_name(const Shared_name &resource_type)
    Builds an absolute name according to the path convention explained in Shared_name class doc header; t...
    const Create_only CREATE_ONLY
    Tag value indicating an atomic create-unless-exists-else-fail operation.
    Definition: util.cpp:32
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    @ S_END_SENTINEL
    CAUTION – see ipc::Log_component doc header for directions to find actual members of this enum class.
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:301
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:302
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp.html index b5b30106e..5abec1ae9 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -105,7 +105,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp_source.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp_source.html index 5493bd41e..395cb1a69 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__rcv_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -490,17 +490,17 @@
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    static const Shared_name S_EMPTY
    A (default-cted) Shared_name. May be useful for functions returning const Shared_name&.
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    const std::string EMPTY_STRING
    A (default-cted) string. May be useful for functions returning const std::string&.
    Definition: util.cpp:33
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp.html index e432e14df..dfefca8fe 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -105,7 +105,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp_source.html b/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp_source.html index 1ed0c846b..f2a418e17 100644 --- a/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/blob__stream__mq__snd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -638,17 +638,17 @@
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    static const Shared_name S_EMPTY
    A (default-cted) Shared_name. May be useful for functions returning const Shared_name&.
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    const std::string EMPTY_STRING
    A (default-cted) string. May be useful for functions returning const std::string&.
    Definition: util.cpp:33
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/blob__transport_8hpp.html b/doc/ipc_doc/generated/html_full/blob__transport_8hpp.html index 0209e679d..840be880a 100644 --- a/doc/ipc_doc/generated/html_full/blob__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_full/blob__transport_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -97,7 +97,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/blob__transport_8hpp_source.html b/doc/ipc_doc/generated/html_full/blob__transport_8hpp_source.html index 65c638563..80377763c 100644 --- a/doc/ipc_doc/generated/html_full/blob__transport_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/blob__transport_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -91,302 +91,303 @@
    19
    20// Not compiled: for documentation only. Contains concept docs as of this writing.
    21#ifndef IPC_DOXYGEN_ONLY
    -
    22# error "As of this writing this is a documentation-only "header" (the "source" is for humans and Doxygen only)."
    -
    23#else // ifdef IPC_DOXYGEN_ONLY
    -
    24
    -
    25namespace ipc::transport
    -
    26{
    -
    27
    -
    28// Types.
    -
    29
    -
    30/**
    -
    31 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *sending* of
    -
    32 * discrete messages, each containing a binary blob. This is paired with
    -
    33 * the Blob_receiver concept which defines reception of such messages.
    -
    34 *
    -
    35 * The concept is exactly identical to Native_handle_sender except that in the latter each message consists
    -
    36 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
    -
    37 * each message contains 1 binary blob, whose length must be at least 1 byte. You may interpret notes in common-sense
    -
    38 * fashion; for example send_blob_max_size() here corresponds to `send_meta_blob_max_size()` there.
    -
    39 *
    -
    40 * Therefore we keep the documentation very light, only pointing out the differences against Native_handle_sender --
    -
    41 * which are summarized in the preceding paragraph. All other notes from Native_handle_sender apply here.
    -
    42 *
    -
    43 * @see Native_handle_sender, an identical concept with 1 feature (native handle transmission) added.
    -
    44 */
    -
    45class Blob_sender
    -
    46{
    -
    47public:
    -
    48 // Constants.
    -
    49
    -
    50 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_receiver`'s.
    -
    51 static const Shared_name S_RESOURCE_TYPE_ID;
    -
    52
    -
    53 // Constructors/destructor.
    -
    54
    -
    55 /**
    -
    56 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    -
    57 *
    -
    58 * All notes from Native_handle_sender() default ctor doc header apply.
    -
    59 */
    -
    60 Blob_sender();
    -
    61
    -
    62 /**
    -
    63 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    -
    64 *
    -
    65 * @param sync_io_core_in_peer_state_moved
    -
    66 * See Native_handle_sender concept.
    -
    67 */
    -
    68 Blob_sender(sync_io::Blob_sender&& sync_io_core_in_peer_state_moved);
    -
    69
    -
    70 /**
    -
    71 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    -
    72 *
    -
    73 * @param src
    -
    74 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    75 */
    -
    76 Blob_sender(Blob_sender&& src);
    -
    77
    -
    78 /// Disallow copying.
    -
    79 Blob_sender(const Blob_sender&) = delete;
    -
    80
    -
    81 /**
    -
    82 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it
    -
    83 * is still active) and cancels any pending completion handlers by invoking them ASAP with
    -
    84 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    -
    85 *
    -
    86 * All notes from ~Native_handle_sender() doc header apply.
    -
    87 */
    -
    88 ~Blob_sender();
    -
    89
    -
    90 // Methods.
    -
    91
    -
    92 /**
    -
    93 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    -
    94 * No-op if `&src == this`.
    -
    95 *
    -
    96 * @see ~Blob_sender().
    -
    97 *
    -
    98 * @param src
    -
    99 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    100 * @return `*this`.
    -
    101 */
    -
    102 Blob_sender& operator=(Blob_sender&& src);
    -
    103 // Methods.
    -
    104
    -
    105 /// Disallow copying.
    -
    106 Blob_sender& operator=(const Blob_sender&) = delete;
    -
    107
    -
    108 /**
    -
    109 * In PEER state: Returns max `blob.size()` such that send_blob() shall not fail due to too-long
    -
    110 * payload with error::Code::S_INVALID_ARGUMENT. Always the same value once in PEER state. The opposing
    -
    111 * Native_handle_receiver::receive_blob_max_size()` shall return the same value (in the opposing object potentially
    -
    112 * in a different process).
    -
    113 *
    -
    114 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    -
    115 * a positive value.
    -
    116 *
    -
    117 * @return See above.
    -
    118 */
    -
    119 size_t send_blob_max_size() const;
    -
    120
    -
    121 /**
    -
    122 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably and in-order, to the opposing
    -
    123 * peer; the message consists of the provided binary blob (of length at least 1 byte). Providing a null blob
    -
    124 * results in undefined behavior (assertion may trip).
    -
    125 *
    -
    126 * All notes from Native_handle_sender::send_native_handle() doc header apply.
    -
    127 *
    -
    128 * @param blob
    -
    129 * A binary blob to send; behavior undefined unless `blob.size() >= 1`.
    -
    130 * @param err_code
    -
    131 * See above.
    -
    132 * @return See above.
    -
    133 */
    -
    134 bool send_blob(const util::Blob_const& blob, Error_code* err_code = 0);
    -
    135
    -
    136 /**
    -
    137 * Equivalent to send_blob() but sends a graceful-close message instead of the usual payload; the opposing
    -
    138 * peer's Blob_receiver shall receive it reliably and in-order via Blob_receiver::async_receive_blob() in the form of
    -
    139 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE.
    -
    140 *
    -
    141 * All notes from Native_handle_sender::async_end_sending() doc header apply.
    -
    142 *
    -
    143 * @tparam Task_err
    -
    144 * See above.
    -
    145 * @param on_done_func
    -
    146 * See above.
    -
    147 * @return See above.
    -
    148 */
    -
    149 template<typename Task_err>
    -
    150 bool async_end_sending(Task_err&& on_done_func);
    -
    151
    -
    152 /**
    -
    153 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
    -
    154 *
    -
    155 * All notes from Native_handle_sender::end_sending() doc header apply.
    -
    156 *
    -
    157 * @return See above.
    -
    158 */
    -
    159 bool end_sending();
    -
    160
    -
    161 /**
    -
    162 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
    -
    163 * are ignored except that they reset any idle timer as enabled via Blob_receiver::idle_timer_run()
    -
    164 * (or similar).
    -
    165 *
    -
    166 * All notes from Native_handle_receiver::auto_ping() doc header apply.
    -
    167 *
    -
    168 * @param period
    -
    169 * See above.
    -
    170 * @return See above.
    -
    171 */
    -
    172 bool auto_ping();
    -
    173}; // class Blob_sender
    -
    174
    -
    175/**
    -
    176 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *receiving* of
    -
    177 * discrete messages, each containing a binary blob. This is paired with
    -
    178 * the Blob_sender concept which defines sending of such messages.
    -
    179 *
    -
    180 * The concept is exactly identical to Native_handle_receiver except that in the latter each message consists
    -
    181 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
    -
    182 * each message contains 1 binary blob, whose length must be at least 1 byte. You may interpret notes in common-sense
    -
    183 * fashion; for example receive_blob_max_size() here corresponds to `receive_meta_blob_max_size()` there.
    -
    184 *
    -
    185 * Therefore we keep the documentation very light, only pointing out the differences against Native_handle_receiver --
    -
    186 * which are summarized in the preceding paragraph. All other notes from Native_handle_receiver apply here.
    -
    187 *
    -
    188 * @see Native_handle_receiver, an identical concept with 1 feature (native handle transmission) added.
    -
    189 */
    -
    190class Blob_receiver
    -
    191{
    -
    192public:
    -
    193 // Constants.
    -
    194
    -
    195 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_sender`'s.
    -
    196 static const Shared_name S_RESOURCE_TYPE_ID;
    -
    197
    -
    198 /**
    -
    199 * If `false` then `blob.size() > receive_blob_max_size()` in PEER-state async_receive_blob()
    -
    200 * shall yield non-pipe-hosing error::Code::INVALID_ARGUMENT, and it shall never yield
    -
    201 * pipe-hosing error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE; else the latter may occur, while the former
    -
    202 * shall never occur for that reason.
    -
    203 *
    -
    204 * @see "Blob underflow semantics" in Native_handle_sender concept doc header; they apply equally here.
    -
    205 */
    -
    206 static constexpr bool S_BLOB_UNDERFLOW_ALLOWED = value;
    -
    207
    -
    208 // Constructors/destructor.
    -
    209
    -
    210 /**
    -
    211 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    -
    212 *
    -
    213 * All notes from Native_handle_receiver() default ctor doc header apply.
    -
    214 */
    -
    215 Blob_receiver();
    -
    216
    -
    217 /**
    -
    218 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    -
    219 *
    -
    220 * @param sync_io_core_in_peer_state_moved
    -
    221 * See Native_handle_sender concept.
    -
    222 */
    -
    223 Blob_receiver(sync_io::Blob_receiver&& sync_io_core_in_peer_state_moved);
    -
    224
    -
    225 /**
    -
    226 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    -
    227 *
    -
    228 * @param src
    -
    229 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    230 */
    -
    231 Blob_receiver(Blob_receiver&& src);
    -
    232
    -
    233 /// Disallow copying.
    -
    234 Blob_receiver(const Blob_receiver&) = delete;
    -
    235
    -
    236 /**
    -
    237 * Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state, and if it
    -
    238 * is still active) and cancels any pending completion handlers by invoking them ASAP with
    -
    239 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    -
    240 *
    -
    241 * All notes from ~Native_handle_receiver() doc header apply.
    -
    242 */
    -
    243 ~Blob_receiver();
    -
    244
    -
    245 // Methods.
    -
    246
    -
    247 /**
    -
    248 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    -
    249 * No-op if `&src == this`.
    -
    250 *
    -
    251 * @see ~Blob_receiver().
    -
    252 *
    -
    253 * @param src
    -
    254 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    255 * @return `*this`.
    -
    256 */
    -
    257 Blob_receiver& operator=(Blob_receiver&& src);
    -
    258
    -
    259 /// Disallow copying.
    -
    260 Blob_receiver& operator=(const Blob_receiver&) = delete;
    -
    261
    -
    262 /**
    -
    263 * In PEER state: Returns min `target_blob.size()` such that (1) async_receive_blob() shall not fail
    -
    264 * with error::Code::S_INVALID_ARGUMENT (only if #S_BLOB_UNDERFLOW_ALLOWED is `false`; otherwise not relevant),
    -
    265 * and (2) it shall *never* fail with error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE. Please see
    -
    266 * "Blob underflow semantics" (for Native_handle_receiver, but applied in common-sense fashion to us) for
    -
    267 * explanation of these semantics.
    -
    268 *
    -
    269 * Always the same value once in PEER state. The opposing
    -
    270 * Native_handle_sender::send_blob_max_size() shall return the same value (in the opposing object potentially
    -
    271 * in a different process).
    -
    272 *
    -
    273 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    -
    274 * a positive value.
    -
    275 *
    -
    276 * @return See above.
    -
    277 */
    -
    278 size_t receive_blob_max_size() const;
    -
    279
    -
    280 /**
    -
    281 * In PEER state: Asynchronously awaits one discrete message -- as sent by the opposing peer via
    -
    282 * Blob_sender::send_blob() or `"Blob_sender::*end_sending()"` -- and
    -
    283 * receives it into the given target locations, reliably and in-order.
    -
    284 *
    -
    285 * All notes from Native_handle_receiver::async_receive_native_handle() doc header apply. In particular
    -
    286 * watch out for the semantics regarding `target_blob.size()` and potential resulting errors.
    -
    287 *
    -
    288 * @tparam Task_err_sz
    -
    289 * See above.
    -
    290 * @param target_blob
    -
    291 * `target_blob.data()...` shall be written to by the time `on_done_func()` is executed with a falsy
    -
    292 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
    -
    293 * `target_blob.size()`. See above.
    -
    294 * @param on_done_func
    -
    295 * See above.
    -
    296 * @return See above.
    -
    297 */
    -
    298 template<typename Task_err_sz>
    -
    299 bool async_receive_blob(const util::Blob_mutable& target_blob,
    -
    300 Task_err_sz&& on_done_func);
    -
    301
    -
    302 /**
    -
    303 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
    -
    304 * the specified time has passed since the last received low-level traffic (or this call, whichever most
    -
    305 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
    -
    306 *
    -
    307 * All notes from Native_handle_receiver::idle_timer_run() doc header apply.
    -
    308 *
    -
    309 * @param timeout
    -
    310 * See above.
    -
    311 * @return See above.
    -
    312 */
    -
    313 bool idle_timer_run(util::Fine_duration timeout);
    -
    314}; // class Blob_receiver
    -
    315
    -
    316} // namespace ipc::transport
    -
    A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...
    +
    22static_assert(false, "As of this writing this is a documentation-only \"header\" "
    +
    23 "(the \"source\" is for humans and Doxygen only).");
    +
    24#else // ifdef IPC_DOXYGEN_ONLY
    +
    25
    +
    26namespace ipc::transport
    +
    27{
    +
    28
    +
    29// Types.
    +
    30
    +
    31/**
    +
    32 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *sending* of
    +
    33 * discrete messages, each containing a binary blob. This is paired with
    +
    34 * the Blob_receiver concept which defines reception of such messages.
    +
    35 *
    +
    36 * The concept is exactly identical to Native_handle_sender except that in the latter each message consists
    +
    37 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
    +
    38 * each message contains 1 binary blob, whose length must be at least 1 byte. You may interpret notes in common-sense
    +
    39 * fashion; for example send_blob_max_size() here corresponds to `send_meta_blob_max_size()` there.
    +
    40 *
    +
    41 * Therefore we keep the documentation very light, only pointing out the differences against Native_handle_sender --
    +
    42 * which are summarized in the preceding paragraph. All other notes from Native_handle_sender apply here.
    +
    43 *
    +
    44 * @see Native_handle_sender, an identical concept with 1 feature (native handle transmission) added.
    +
    45 */
    +
    46class Blob_sender
    +
    47{
    +
    48public:
    +
    49 // Constants.
    +
    50
    +
    51 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_receiver`'s.
    +
    52 static const Shared_name S_RESOURCE_TYPE_ID;
    +
    53
    +
    54 // Constructors/destructor.
    +
    55
    +
    56 /**
    +
    57 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    +
    58 *
    +
    59 * All notes from Native_handle_sender() default ctor doc header apply.
    +
    60 */
    +
    61 Blob_sender();
    +
    62
    +
    63 /**
    +
    64 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    +
    65 *
    +
    66 * @param sync_io_core_in_peer_state_moved
    +
    67 * See Native_handle_sender concept.
    +
    68 */
    +
    69 Blob_sender(sync_io::Blob_sender&& sync_io_core_in_peer_state_moved);
    +
    70
    +
    71 /**
    +
    72 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    +
    73 *
    +
    74 * @param src
    +
    75 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    76 */
    +
    77 Blob_sender(Blob_sender&& src);
    +
    78
    +
    79 /// Disallow copying.
    +
    80 Blob_sender(const Blob_sender&) = delete;
    +
    81
    +
    82 /**
    +
    83 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it
    +
    84 * is still active) and cancels any pending completion handlers by invoking them ASAP with
    +
    85 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    +
    86 *
    +
    87 * All notes from ~Native_handle_sender() doc header apply.
    +
    88 */
    +
    89 ~Blob_sender();
    +
    90
    +
    91 // Methods.
    +
    92
    +
    93 /**
    +
    94 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    +
    95 * No-op if `&src == this`.
    +
    96 *
    +
    97 * @see ~Blob_sender().
    +
    98 *
    +
    99 * @param src
    +
    100 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    101 * @return `*this`.
    +
    102 */
    +
    103 Blob_sender& operator=(Blob_sender&& src);
    +
    104 // Methods.
    +
    105
    +
    106 /// Disallow copying.
    +
    107 Blob_sender& operator=(const Blob_sender&) = delete;
    +
    108
    +
    109 /**
    +
    110 * In PEER state: Returns max `blob.size()` such that send_blob() shall not fail due to too-long
    +
    111 * payload with error::Code::S_INVALID_ARGUMENT. Always the same value once in PEER state. The opposing
    +
    112 * Native_handle_receiver::receive_blob_max_size()` shall return the same value (in the opposing object potentially
    +
    113 * in a different process).
    +
    114 *
    +
    115 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    +
    116 * a positive value.
    +
    117 *
    +
    118 * @return See above.
    +
    119 */
    +
    120 size_t send_blob_max_size() const;
    +
    121
    +
    122 /**
    +
    123 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably and in-order, to the opposing
    +
    124 * peer; the message consists of the provided binary blob (of length at least 1 byte). Providing a null blob
    +
    125 * results in undefined behavior (assertion may trip).
    +
    126 *
    +
    127 * All notes from Native_handle_sender::send_native_handle() doc header apply.
    +
    128 *
    +
    129 * @param blob
    +
    130 * A binary blob to send; behavior undefined unless `blob.size() >= 1`.
    +
    131 * @param err_code
    +
    132 * See above.
    +
    133 * @return See above.
    +
    134 */
    +
    135 bool send_blob(const util::Blob_const& blob, Error_code* err_code = 0);
    +
    136
    +
    137 /**
    +
    138 * Equivalent to send_blob() but sends a graceful-close message instead of the usual payload; the opposing
    +
    139 * peer's Blob_receiver shall receive it reliably and in-order via Blob_receiver::async_receive_blob() in the form of
    +
    140 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE.
    +
    141 *
    +
    142 * All notes from Native_handle_sender::async_end_sending() doc header apply.
    +
    143 *
    +
    144 * @tparam Task_err
    +
    145 * See above.
    +
    146 * @param on_done_func
    +
    147 * See above.
    +
    148 * @return See above.
    +
    149 */
    +
    150 template<typename Task_err>
    +
    151 bool async_end_sending(Task_err&& on_done_func);
    +
    152
    +
    153 /**
    +
    154 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
    +
    155 *
    +
    156 * All notes from Native_handle_sender::end_sending() doc header apply.
    +
    157 *
    +
    158 * @return See above.
    +
    159 */
    +
    160 bool end_sending();
    +
    161
    +
    162 /**
    +
    163 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
    +
    164 * are ignored except that they reset any idle timer as enabled via Blob_receiver::idle_timer_run()
    +
    165 * (or similar).
    +
    166 *
    +
    167 * All notes from Native_handle_receiver::auto_ping() doc header apply.
    +
    168 *
    +
    169 * @param period
    +
    170 * See above.
    +
    171 * @return See above.
    +
    172 */
    +
    173 bool auto_ping();
    +
    174}; // class Blob_sender
    +
    175
    +
    176/**
    +
    177 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *receiving* of
    +
    178 * discrete messages, each containing a binary blob. This is paired with
    +
    179 * the Blob_sender concept which defines sending of such messages.
    +
    180 *
    +
    181 * The concept is exactly identical to Native_handle_receiver except that in the latter each message consists
    +
    182 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
    +
    183 * each message contains 1 binary blob, whose length must be at least 1 byte. You may interpret notes in common-sense
    +
    184 * fashion; for example receive_blob_max_size() here corresponds to `receive_meta_blob_max_size()` there.
    +
    185 *
    +
    186 * Therefore we keep the documentation very light, only pointing out the differences against Native_handle_receiver --
    +
    187 * which are summarized in the preceding paragraph. All other notes from Native_handle_receiver apply here.
    +
    188 *
    +
    189 * @see Native_handle_receiver, an identical concept with 1 feature (native handle transmission) added.
    +
    190 */
    +
    191class Blob_receiver
    +
    192{
    +
    193public:
    +
    194 // Constants.
    +
    195
    +
    196 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_sender`'s.
    +
    197 static const Shared_name S_RESOURCE_TYPE_ID;
    +
    198
    +
    199 /**
    +
    200 * If `false` then `blob.size() > receive_blob_max_size()` in PEER-state async_receive_blob()
    +
    201 * shall yield non-pipe-hosing error::Code::INVALID_ARGUMENT, and it shall never yield
    +
    202 * pipe-hosing error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE; else the latter may occur, while the former
    +
    203 * shall never occur for that reason.
    +
    204 *
    +
    205 * @see "Blob underflow semantics" in Native_handle_sender concept doc header; they apply equally here.
    +
    206 */
    +
    207 static constexpr bool S_BLOB_UNDERFLOW_ALLOWED = value;
    +
    208
    +
    209 // Constructors/destructor.
    +
    210
    +
    211 /**
    +
    212 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    +
    213 *
    +
    214 * All notes from Native_handle_receiver() default ctor doc header apply.
    +
    215 */
    +
    216 Blob_receiver();
    +
    217
    +
    218 /**
    +
    219 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    +
    220 *
    +
    221 * @param sync_io_core_in_peer_state_moved
    +
    222 * See Native_handle_sender concept.
    +
    223 */
    +
    224 Blob_receiver(sync_io::Blob_receiver&& sync_io_core_in_peer_state_moved);
    +
    225
    +
    226 /**
    +
    227 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    +
    228 *
    +
    229 * @param src
    +
    230 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    231 */
    +
    232 Blob_receiver(Blob_receiver&& src);
    +
    233
    +
    234 /// Disallow copying.
    +
    235 Blob_receiver(const Blob_receiver&) = delete;
    +
    236
    +
    237 /**
    +
    238 * Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state, and if it
    +
    239 * is still active) and cancels any pending completion handlers by invoking them ASAP with
    +
    240 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    +
    241 *
    +
    242 * All notes from ~Native_handle_receiver() doc header apply.
    +
    243 */
    +
    244 ~Blob_receiver();
    +
    245
    +
    246 // Methods.
    +
    247
    +
    248 /**
    +
    249 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    +
    250 * No-op if `&src == this`.
    +
    251 *
    +
    252 * @see ~Blob_receiver().
    +
    253 *
    +
    254 * @param src
    +
    255 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    256 * @return `*this`.
    +
    257 */
    +
    258 Blob_receiver& operator=(Blob_receiver&& src);
    +
    259
    +
    260 /// Disallow copying.
    +
    261 Blob_receiver& operator=(const Blob_receiver&) = delete;
    +
    262
    +
    263 /**
    +
    264 * In PEER state: Returns min `target_blob.size()` such that (1) async_receive_blob() shall not fail
    +
    265 * with error::Code::S_INVALID_ARGUMENT (only if #S_BLOB_UNDERFLOW_ALLOWED is `false`; otherwise not relevant),
    +
    266 * and (2) it shall *never* fail with error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE. Please see
    +
    267 * "Blob underflow semantics" (for Native_handle_receiver, but applied in common-sense fashion to us) for
    +
    268 * explanation of these semantics.
    +
    269 *
    +
    270 * Always the same value once in PEER state. The opposing
    +
    271 * Native_handle_sender::send_blob_max_size() shall return the same value (in the opposing object potentially
    +
    272 * in a different process).
    +
    273 *
    +
    274 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    +
    275 * a positive value.
    +
    276 *
    +
    277 * @return See above.
    +
    278 */
    +
    279 size_t receive_blob_max_size() const;
    +
    280
    +
    281 /**
    +
    282 * In PEER state: Asynchronously awaits one discrete message -- as sent by the opposing peer via
    +
    283 * Blob_sender::send_blob() or `"Blob_sender::*end_sending()"` -- and
    +
    284 * receives it into the given target locations, reliably and in-order.
    +
    285 *
    +
    286 * All notes from Native_handle_receiver::async_receive_native_handle() doc header apply. In particular
    +
    287 * watch out for the semantics regarding `target_blob.size()` and potential resulting errors.
    +
    288 *
    +
    289 * @tparam Task_err_sz
    +
    290 * See above.
    +
    291 * @param target_blob
    +
    292 * `target_blob.data()...` shall be written to by the time `on_done_func()` is executed with a falsy
    +
    293 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
    +
    294 * `target_blob.size()`. See above.
    +
    295 * @param on_done_func
    +
    296 * See above.
    +
    297 * @return See above.
    +
    298 */
    +
    299 template<typename Task_err_sz>
    +
    300 bool async_receive_blob(const util::Blob_mutable& target_blob,
    +
    301 Task_err_sz&& on_done_func);
    +
    302
    +
    303 /**
    +
    304 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
    +
    305 * the specified time has passed since the last received low-level traffic (or this call, whichever most
    +
    306 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
    +
    307 *
    +
    308 * All notes from Native_handle_receiver::idle_timer_run() doc header apply.
    +
    309 *
    +
    310 * @param timeout
    +
    311 * See above.
    +
    312 * @return See above.
    +
    313 */
    +
    314 bool idle_timer_run(util::Fine_duration timeout);
    +
    315}; // class Blob_receiver
    +
    316
    +
    317} // namespace ipc::transport
    +
    A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...
    Blob_receiver()
    Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    Blob_receiver(const Blob_receiver &)=delete
    Disallow copying.
    size_t receive_blob_max_size() const
    In PEER state: Returns min target_blob.size() such that (1) async_receive_blob() shall not fail with ...
    @@ -394,12 +395,12 @@
    bool idle_timer_run(util::Fine_duration timeout)
    In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is,...
    Blob_receiver & operator=(Blob_receiver &&src)
    Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
    Blob_receiver(sync_io::Blob_receiver &&sync_io_core_in_peer_state_moved)
    sync_io-core-adopting ctor: Creates a peer object in PEER state by subsuming a sync_io core in that s...
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    bool async_receive_blob(const util::Blob_mutable &target_blob, Task_err_sz &&on_done_func)
    In PEER state: Asynchronously awaits one discrete message – as sent by the opposing peer via Blob_sen...
    Blob_receiver(Blob_receiver &&src)
    Move-constructs from src; src becomes as-if default-cted (therefore in NULL state).
    -
    static constexpr bool S_BLOB_UNDERFLOW_ALLOWED
    If false then blob.size() > receive_blob_max_size() in PEER-state async_receive_blob() shall yield no...
    +
    static constexpr bool S_BLOB_UNDERFLOW_ALLOWED
    If false then blob.size() > receive_blob_max_size() in PEER-state async_receive_blob() shall yield no...
    ~Blob_receiver()
    Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state,...
    -
    A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...
    +
    A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...
    Blob_sender()
    Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    bool end_sending()
    Equivalent to async_end_sending(F) wherein F() does nothing.
    Blob_sender(sync_io::Blob_sender &&sync_io_core_in_peer_state_moved)
    sync_io-core-adopting ctor: Creates a peer object in PEER state by subsuming a sync_io core in that s...
    @@ -410,21 +411,21 @@
    ~Blob_sender()
    Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
    Blob_sender & operator=(Blob_sender &&src)
    Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
    bool auto_ping()
    In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level message...
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    size_t send_blob_max_size() const
    In PEER state: Returns max blob.size() such that send_blob() shall not fail due to too-long payload w...
    Blob_sender(const Blob_sender &)=delete
    Disallow copying.
    -
    A documentation-only concept: what transport::Blob_receiver is to transport::Native_handle_receiver (...
    -
    A documentation-only concept: what transport::Blob_sender is to transport::Native_handle_sender (name...
    +
    A documentation-only concept: what transport::Blob_receiver is to transport::Native_handle_receiver (...
    +
    A documentation-only concept: what transport::Blob_sender is to transport::Native_handle_sender (name...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp.html b/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp.html index 61494c1d9..86bd55bd9 100644 --- a/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp.html +++ b/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -115,7 +115,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp_source.html b/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp_source.html index 01ea4c7d2..f0016c46e 100644 --- a/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/capnp__msg__builder_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -521,8 +521,8 @@
    Segregates zero-copy/SHM implementations of concepts residing in parent namespace ipc::transport::str...
    void capnp_set_lent_shm_handle(schema::ShmHandle::Builder *shm_handle_root, const flow::util::Blob_sans_log_context &lend_result)
    Utility that saves the result of a Shm_session1::lend_object<T>(const shared_ptr<T>&) result into the...
    Definition: util.cpp:28
    std::ostream & operator<<(std::ostream &os, const Capnp_message_builder< Shm_arena > &val)
    Prints string representation of the given Capnp_message_builder to the given ostream.
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    @@ -530,7 +530,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/chan_open.html b/doc/ipc_doc/generated/html_full/chan_open.html index 489503eaa..55a420ee2 100644 --- a/doc/ipc_doc/generated/html_full/chan_open.html +++ b/doc/ipc_doc/generated/html_full/chan_open.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -197,7 +197,7 @@

    Opening init-channels

    // Operate on `session` (etc.) in here, long-term, until it is hosed.
    go_do_ipc_yay(...);
    } // namespace my_meta_app
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    On the server end, accordingly:

    // ...
    using Session_server = Session_server_t<...knob1..., ...knob2...,
    @@ -399,7 +399,7 @@

    Opening init-channels

    diff --git a/doc/ipc_doc/generated/html_full/chan_struct.html b/doc/ipc_doc/generated/html_full/chan_struct.html index 517e2ae99..e6b421174 100644 --- a/doc/ipc_doc/generated/html_full/chan_struct.html +++ b/doc/ipc_doc/generated/html_full/chan_struct.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -215,7 +215,7 @@

    Creating and mutating out-messages

    msg.store_native_handle_or_null(Native_handle(::dup(STDOUT_FILENO)));
    // Receiving process -- upon receipt -- can write to that FD and cause output to appear in *our* stdout.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

    Sending notification messages

    So you've loaded up your struc::Channel::Msg_out a/k/a struc::Msg_out. Now you'll presumably want to send it. The Msg_out is a message, while a message actually sent via channel (and received by the opposing side) is a message instance. Therefore the act of invoking one of the send methods of a struc::Channel (.send(), .async_request(), .sync_request()) creates a message instance from a message – which the opposing side obtains as an ipc::transport::struc::Msg_in (but more on this later). All properties of a message instance are contained either in the message itself or in the arguments to the chosen struc::Channel send method; they cannot be changed subsequently.

    A message is a message; but a message instance is one of 2 things:

    Lastly, I note that potentially using SOCK_SEQPACKET (which purports to conserve message boundaries at all times) instead of SOCK_STREAM (which we use) might remove all ambiguity. On the other hand it's barely documented itself. The rationale for the decision to use SOCK_STREAM is discussed elsewhere; this note is to reassure that I (ygoldfel) don't quite find the above complexity reason enough to switch to SOCK_SEQPACKET.

    -

    Definition at line 201 of file asio_local_stream_socket.cpp.

    +

    Definition at line 202 of file asio_local_stream_socket.cpp.

    -

    References nb_read_some_with_native_handle(), and ipc::transport::error::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL.

    +

    References nb_read_some_with_native_handle(), and ipc::transport::error::S_LOW_LVL_UNEXPECTED_STREAM_PAYLOAD_BEYOND_HNDL.

    -

    Referenced by nb_read_some_with_native_handle(), and ipc::transport::sync_io::Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload().

    +

    Referenced by nb_read_some_with_native_handle(), and ipc::transport::sync_io::Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload().

    Here is the call graph for this function:
    @@ -815,11 +815,11 @@

    Rationale

    Returns
    0 if non-null err_code and truthy resulting *err_code, and hence no bytes or the handle was sent; 1+ if that number of bytes were sent plus the native handle (and hence falsy *err_code if non-null).
    -

    Definition at line 35 of file asio_local_stream_socket.cpp.

    +

    Definition at line 36 of file asio_local_stream_socket.cpp.

    -

    References ipc::util::Native_handle::m_native_handle, and nb_write_some_with_native_handle().

    +

    References ipc::util::Native_handle::m_native_handle, and nb_write_some_with_native_handle().

    -

    Referenced by nb_write_some_with_native_handle(), on_wait_writable_or_error(), and ipc::transport::sync_io::Native_socket_stream::Impl::snd_nb_write_low_lvl_payload().

    +

    Referenced by nb_write_some_with_native_handle(), on_wait_writable_or_error(), and ipc::transport::sync_io::Native_socket_stream::Impl::snd_nb_write_low_lvl_payload().

    Here is the call graph for this function:
    @@ -1004,9 +1004,9 @@

    Definition at line 31 of file asio_local_stream_socket.hpp.

    -

    References ipc::util::blob_data(), nb_write_some_with_native_handle(), and on_wait_writable_or_error().

    +

    References ipc::util::blob_data(), nb_write_some_with_native_handle(), and on_wait_writable_or_error().

    -

    Referenced by async_write_with_native_handle(), and on_wait_writable_or_error().

    +

    Referenced by async_write_with_native_handle(), and on_wait_writable_or_error().

    Here is the call graph for this function:
    @@ -1049,7 +1049,7 @@

    Definition at line 416 of file asio_local_stream_socket.cpp.

    +

    Definition at line 417 of file asio_local_stream_socket.cpp.

    Referenced by ipc::session::shm::arena_lend::jemalloc::Session_impl< Session_impl_t >::init_shm(), and ipc::transport::struc::Msg_out< Message_body, Struct_builder_t >::store_native_handle_or_null().

    @@ -1064,7 +1064,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html index 274913e57..c83fa8ee9 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -79,7 +79,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1error.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1error.html index 3490ecb5d..f0114efc9 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1error.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1error.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -386,7 +386,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc.html index 42ab050d3..13be032c3 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -554,7 +554,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1error.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1error.html index d9665b7ae..0501e531c 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1error.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1error.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -341,7 +341,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm.html index 7dea25b41..35f362328 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -366,7 +366,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html index 9d0ca6977..3ae58db11 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -87,7 +87,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html index 64a38e947..ecf112367 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -155,7 +155,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html index 7475a396e..d6ac4573c 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -155,7 +155,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1sync__io.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1sync__io.html index 3e0c314b6..13a80a56c 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1struc_1_1sync__io.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -138,7 +138,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1sync__io.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1sync__io.html index eb1cdc752..53321dad9 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1transport_1_1sync__io.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -570,7 +570,7 @@

    Returns
    os.
    -

    Definition at line 518 of file native_socket_stream_impl.cpp.

    +

    Definition at line 519 of file native_socket_stream_impl.cpp.

    @@ -617,7 +617,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1util.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1util.html index 4a11dfb4a..fbe435b16 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1util.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1util.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -359,7 +359,7 @@

    How to use

    We provide this alias as a stylistic short-hand, as it better suits various interfaces especially in ipc::transport. Nevertheless it's not meant to more than that; it's an attempt to abstract it away.

    That is to say, to work with these (create them, access them, etc.), do use the highly convenient boost.asio buffer APIs which are well documented in boost.asio's docs.

    -

    Definition at line 128 of file util_fwd.hpp.

    +

    Definition at line 134 of file util_fwd.hpp.

    @@ -378,7 +378,7 @@

    See also
    ipc::util::Blob_const; usability notes in that doc header apply similarly here.
    -

    Definition at line 134 of file util_fwd.hpp.

    +

    Definition at line 140 of file util_fwd.hpp.

    @@ -397,7 +397,7 @@

    See also
    CREATE_ONLY.
    -

    Definition at line 152 of file util_fwd.hpp.

    +

    Definition at line 158 of file util_fwd.hpp.

    @@ -415,7 +415,7 @@

    Definition at line 111 of file util_fwd.hpp.

    +

    Definition at line 117 of file util_fwd.hpp.

    @@ -433,7 +433,7 @@

    Definition at line 113 of file util_fwd.hpp.

    +

    Definition at line 119 of file util_fwd.hpp.

    @@ -451,7 +451,7 @@

    Definition at line 143 of file util_fwd.hpp.

    +

    Definition at line 149 of file util_fwd.hpp.

    @@ -470,7 +470,7 @@

    See also
    OPEN_ONLY.
    -

    Definition at line 149 of file util_fwd.hpp.

    +

    Definition at line 155 of file util_fwd.hpp.

    @@ -489,7 +489,7 @@

    See also
    OPEN_OR_CREATE.
    -

    Definition at line 146 of file util_fwd.hpp.

    +

    Definition at line 152 of file util_fwd.hpp.

    @@ -507,7 +507,7 @@

    Definition at line 155 of file util_fwd.hpp.

    +

    Definition at line 161 of file util_fwd.hpp.

    @@ -561,7 +561,7 @@

    Definition at line 137 of file util_fwd.hpp.

    +

    Definition at line 143 of file util_fwd.hpp.

    @@ -579,7 +579,7 @@

    Definition at line 109 of file util_fwd.hpp.

    +

    Definition at line 115 of file util_fwd.hpp.

    @@ -597,7 +597,7 @@

    Definition at line 116 of file util_fwd.hpp.

    +

    Definition at line 122 of file util_fwd.hpp.

    @@ -615,7 +615,7 @@

    Definition at line 140 of file util_fwd.hpp.

    +

    Definition at line 146 of file util_fwd.hpp.

    @@ -642,7 +642,7 @@

    Permissions value in an array<Permissions, size_t(Permissions_level::S_END_SENTINEL)>.

    -

    While, unlike Permissions, this enum intends not be overtly based on a POSIX RWXRWXRWC model, it does still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd are likely universal, but the 2nd may not apply to all OS – through probably all POSIX/Unix ones – and even for something like Linux there could be different groupings such as ones based on OS ACL. As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing, but that could change to include, say, MacOS/BSD).

    +

    While, unlike Permissions, this enum intends not be overtly based on a POSIX RWXRWXRWX model, it does still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd are likely universal, but the 2nd may not apply to all OS – through probably all POSIX/Unix ones – and even for something like Linux there could be different groupings such as ones based on OS ACL. As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing, but that could change to include, say, macOS/similar).

    Maintenance

    Do not change the order of these constants unless absolutely necessary. In general any change here means updating any array<>s (etc.) that map implicitly from a size_t representing Permissions_level. By convention they are named *_PERMISSIONS_LVL_MAP as of this writing.

    The array<> mapping scheme is for max performance; if one uses an unordered_map or similar, then there is no similar issue.

    @@ -660,7 +660,7 @@

    Maintenance

    -

    Definition at line 87 of file util_fwd.hpp.

    +

    Definition at line 93 of file util_fwd.hpp.

    @@ -690,9 +690,9 @@

    Returns
    See above.
    -

    Definition at line 156 of file util.cpp.

    +

    Definition at line 158 of file util.cpp.

    -

    Referenced by ipc::transport::asio_local_stream_socket::async_write_with_native_handle(), ipc::transport::asio_local_stream_socket::on_wait_writable_or_error(), ipc::transport::Bipc_mq_handle::send(), ipc::transport::Posix_mq_handle::send(), ipc::transport::Bipc_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Bipc_mq_handle::try_send(), and ipc::transport::Posix_mq_handle::try_send().

    +

    Referenced by ipc::transport::asio_local_stream_socket::async_write_with_native_handle(), ipc::transport::asio_local_stream_socket::on_wait_writable_or_error(), ipc::transport::Bipc_mq_handle::send(), ipc::transport::Posix_mq_handle::send(), ipc::transport::Bipc_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Bipc_mq_handle::try_send(), and ipc::transport::Posix_mq_handle::try_send().

    Here is the caller graph for this function:
    @@ -727,7 +727,7 @@

    Returns
    See above.
    -

    Definition at line 168 of file util.cpp.

    +

    Definition at line 163 of file util.cpp.

    @@ -829,7 +829,7 @@

    Errors (or lack thereof)

    References ipc::util::Shared_name::ct().

    -

    Referenced by ipc::transport::Posix_mq_handle::for_each_persistent(), and for_each_persistent_shm_pool().

    +

    Referenced by ipc::transport::Posix_mq_handle::for_each_persistent(), and for_each_persistent_shm_pool().

    Here is the call graph for this function:
    @@ -878,7 +878,7 @@

    Definition at line 130 of file util.hpp.

    +

    Definition at line 131 of file util.hpp.

    References for_each_persistent_impl().

    @@ -952,7 +952,7 @@

    Returns
    See above.
    -

    Definition at line 89 of file native_handle.cpp.

    +

    Definition at line 90 of file native_handle.cpp.

    @@ -1123,7 +1123,7 @@

    Definition at line 378 of file shared_name.cpp.

    -

    References operator==().

    +

    References operator==().

    Here is the call graph for this function:
    @@ -1171,7 +1171,7 @@

    Definition at line 392 of file shared_name.cpp.

    -

    References operator==().

    +

    References operator==().

    Here is the call graph for this function:
    @@ -1217,7 +1217,7 @@

    Returns
    See above.
    -

    Definition at line 84 of file native_handle.cpp.

    +

    Definition at line 85 of file native_handle.cpp.

    @@ -1259,7 +1259,7 @@

    Definition at line 402 of file shared_name.cpp.

    -

    References operator==().

    +

    References operator==().

    Here is the call graph for this function:
    @@ -1842,7 +1842,7 @@

    Returns
    os.
    -

    Definition at line 65 of file native_handle.cpp.

    +

    Definition at line 66 of file native_handle.cpp.

    @@ -2104,9 +2104,9 @@

    Returns
    See above.
    -

    Definition at line 79 of file native_handle.cpp.

    +

    Definition at line 80 of file native_handle.cpp.

    -

    Referenced by ipc::util::Process_credentials::operator!=(), operator!=(), ipc::util::Native_handle::operator!=(), and operator==().

    +

    Referenced by ipc::util::Process_credentials::operator!=(), operator!=(), ipc::util::Native_handle::operator!=(), and operator==().

    Here is the caller graph for this function:
    @@ -2155,7 +2155,7 @@

    Definition at line 397 of file shared_name.cpp.

    -

    References operator==().

    +

    References operator==().

    Referenced by operator==().

    @@ -2560,7 +2560,7 @@

    perms. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make any calls to change the umask to accomplish this.

    +

    It may seem unnecessary, particularly given that it sometimes (in our internal code, but I mention it publicly for exposition purposes) is placed right after the creation of the resource (file, SHM pool, POSIX MQ, shared mutex, etc.) – where the same perms is supplied to the creation-API, whichever is applicable. The reason is that those APIs tend to make the corresponding OS call (e.g., open()) which is bound by the "process umask" in POSIX/Linux; so for example if it's set to the typical 022 (octal), then it's impossible to make the resource group- or all-writable, regardless of perms. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make any calls to change the umask to accomplish this.

    Note 1: Sometimes there is not even the creation-API argument for perms; in which case the rationale is even more straightforward.

    Note 2: Sometimes there is that API... and (namely in boost.ipc at least) they actually took care to do this (what we do here) themselves (via fchmod() and such)... so we don't need to; in fact I (ygoldfel) treated it as valuable confirmation of the correctness of this maneuver.

    Parameters
    @@ -2644,7 +2644,7 @@

    Definition at line 98 of file util.cpp.

    -

    References ipc::util::Native_handle::m_native_handle, ipc::util::Native_handle::null(), and set_resource_permissions().

    +

    References ipc::util::Native_handle::m_native_handle, ipc::util::Native_handle::null(), and set_resource_permissions().

    Here is the call graph for this function:
    @@ -2733,7 +2733,7 @@

    Definition at line 420 of file shared_name.cpp.

    -

    Referenced by ipc::util::Native_handle::operator=().

    +

    Referenced by ipc::util::Native_handle::operator=().

    Here is the caller graph for this function:
    @@ -2865,7 +2865,7 @@

    Permissions(0b110100000),

    Permissions(0b110100100)
    }
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161

    Maps general Permissions_level specifier to low-level Permissions value, when the underlying resource is in the file-system (e.g., a file) and is produced (and therefore always writable) by the owning (creating, updating) user; but consumed (and therefore at most readable, never writable) by potentially other processes, and therefore possibly other users (e.g., group access or unrestricted access – but only for reading either way).

    For example a PID file is typically only writable by the daemon's user but may be readable or inaccessible by other users.

    @@ -2907,7 +2907,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/namespaceipc_1_1util_1_1sync__io.html b/doc/ipc_doc/generated/html_full/namespaceipc_1_1util_1_1sync__io.html index 8b7851534..29d8d93ac 100644 --- a/doc/ipc_doc/generated/html_full/namespaceipc_1_1util_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_full/namespaceipc_1_1util_1_1sync__io.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -148,7 +148,7 @@

    The async-I/O (default) pattern

    // We are in thread U.
    // ...handle it....
    }
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    Alternatively:

    • Reactor pattern: Usually built on top of an OS-supplied blocking polling method of some kind – in POSIX nowadays usually at least poll(), in Linux possibly using the more advanced epoll_*() – which centers on an "FD-set" (native handle set), where one describes Native_handles (FDs) and the events one awaits (readable, writable) for each; and in each event loop iteration one runs a poll-wait operation (like poll() or epoll_wait()). This blocks until 1 or more events-of-interest are active; then wakes up and reports which ones they were. User code then synchronously invokes handling for each event of interest; such handling might modify the events-of-interest set, etc., until all such work is done, and the next poll-wait op executes. Thus in the reactor pattern methods like on_async_op_done() are invoked in a flow-control setup inverted versus the proactor pattern; but ultimately they're both doing the same thing. To integrate such a loop with this async-I/O pattern in Flow-IPC, a little extra work is required:
      • Sometimes event-loop libraries provide this as a built-in feature: a task queue. So a facility similar to post() above is supplied. Hence the code above would be adapted to a reactor-pattern loop and end up fairly similar: In F() do some equivalent to the post() in the snippet above. Internally it'll set up some "interrupter" handle in the central [e]poll*() handle-set and cause – from thread W – for thread U's poll-wait to wake up. Otherwise:
      • @@ -554,7 +554,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers.html b/doc/ipc_doc/generated/html_full/namespacemembers.html index e968213d5..db49eee42 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -76,7 +76,7 @@

        - a -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_b.html b/doc/ipc_doc/generated/html_full/namespacemembers_b.html index e75023cd3..b345ad5b5 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_b.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_b.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -81,7 +81,7 @@

        - b -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_c.html b/doc/ipc_doc/generated/html_full/namespacemembers_c.html index 2bd82fb96..7d50f024a 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_c.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_c.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@

        - c -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_d.html b/doc/ipc_doc/generated/html_full/namespacemembers_d.html index 15d016665..3efe5e0f9 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_d.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_d.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - d -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_e.html b/doc/ipc_doc/generated/html_full/namespacemembers_e.html index 55e5665de..ebcb092e6 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_e.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_e.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -76,7 +76,7 @@

        - e -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_enum.html b/doc/ipc_doc/generated/html_full/namespacemembers_enum.html index d4beff0f2..e58696315 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_enum.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_enum.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_f.html b/doc/ipc_doc/generated/html_full/namespacemembers_f.html index abf27bf6c..fb68d05ea 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_f.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_f.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -75,7 +75,7 @@

        - f -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_func.html b/doc/ipc_doc/generated/html_full/namespacemembers_func.html index 8a7af1545..6e2f62eff 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_func.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_func.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -156,7 +156,7 @@

        - s -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_g.html b/doc/ipc_doc/generated/html_full/namespacemembers_g.html index 0f57f118b..d856e1ddd 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_g.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_g.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - g -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_h.html b/doc/ipc_doc/generated/html_full/namespacemembers_h.html index 0552b7635..03eb66d5a 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_h.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_h.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - h -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_i.html b/doc/ipc_doc/generated/html_full/namespacemembers_i.html index d96dd6463..bf60f5370 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_i.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_i.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - i -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_l.html b/doc/ipc_doc/generated/html_full/namespacemembers_l.html index 597983deb..1a458fac8 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_l.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_l.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - l -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_m.html b/doc/ipc_doc/generated/html_full/namespacemembers_m.html index 0fe6002c2..e2bfa3a1d 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_m.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_m.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -72,7 +72,7 @@

        - m -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_n.html b/doc/ipc_doc/generated/html_full/namespacemembers_n.html index 0a9770135..32bc38e27 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_n.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_n.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -75,7 +75,7 @@

        - n -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_o.html b/doc/ipc_doc/generated/html_full/namespacemembers_o.html index a84d1b327..99eaf34e0 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_o.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_o.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -84,7 +84,7 @@

        - o -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_p.html b/doc/ipc_doc/generated/html_full/namespacemembers_p.html index f5ec7dfdf..056a3e314 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_p.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_p.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -87,7 +87,7 @@

        - p -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_r.html b/doc/ipc_doc/generated/html_full/namespacemembers_r.html index 006a74450..0e1e890d4 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_r.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_r.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -75,7 +75,7 @@

        - r -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_s.html b/doc/ipc_doc/generated/html_full/namespacemembers_s.html index d5f0af738..2b6898d1b 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_s.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_s.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -82,7 +82,7 @@

        - s -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_t.html b/doc/ipc_doc/generated/html_full/namespacemembers_t.html index d580420b6..521a3c6c9 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_t.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_t.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -72,7 +72,7 @@

        - t -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_type.html b/doc/ipc_doc/generated/html_full/namespacemembers_type.html index 4a6f8e436..3723c846f 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_type.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_type.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -169,7 +169,7 @@

        - u -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_u.html b/doc/ipc_doc/generated/html_full/namespacemembers_u.html index cab1e678b..91ea0c561 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_u.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_u.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -71,7 +71,7 @@

        - u -

        diff --git a/doc/ipc_doc/generated/html_full/namespacemembers_vars.html b/doc/ipc_doc/generated/html_full/namespacemembers_vars.html index 0f07fb460..73ad12e8f 100644 --- a/doc/ipc_doc/generated/html_full/namespacemembers_vars.html +++ b/doc/ipc_doc/generated/html_full/namespacemembers_vars.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -80,7 +80,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/namespaces.html b/doc/ipc_doc/generated/html_full/namespaces.html index da1a4770e..e82d28b9d 100644 --- a/doc/ipc_doc/generated/html_full/namespaces.html +++ b/doc/ipc_doc/generated/html_full/namespaces.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -236,7 +236,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/native__handle_8cpp.html b/doc/ipc_doc/generated/html_full/native__handle_8cpp.html index 881522ec2..fd07d993d 100644 --- a/doc/ipc_doc/generated/html_full/native__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_full/native__handle_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -108,7 +108,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/native__handle_8cpp_source.html b/doc/ipc_doc/generated/html_full/native__handle_8cpp_source.html index 5ca2904e5..5bb991973 100644 --- a/doc/ipc_doc/generated/html_full/native__handle_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__handle_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -96,103 +96,106 @@
        24
        25// Static initializers.
        26
        -
        27// Reminder: We've assured via #error that this is being built in POSIX. (Windows has a special value too though.)
        - -
        29
        -
        30// Native_handle implementations.
        -
        31
        - -
        33 m_native_handle(native_handle)
        -
        34{
        -
        35 // Nope.
        -
        36}
        -
        37
        - -
        39{
        -
        40 // It's why we exist: prevent duplication of src.m_native_handle.
        -
        41 operator=(std::move(src));
        -
        42}
        -
        43
        - -
        45
        - -
        47{
        -
        48 using std::swap;
        -
        49
        -
        50 if (*this != src)
        -
        51 {
        - -
        53 swap(m_native_handle, src.m_native_handle); // No-op if `&src == this`.
        -
        54 }
        -
        55 return *this;
        -
        56}
        -
        57
        - -
        59
        - -
        61{
        - -
        63}
        -
        64
        -
        65std::ostream& operator<<(std::ostream& os, const Native_handle& val)
        -
        66{
        -
        67 os << "native_hndl[";
        -
        68 if (val.null())
        -
        69 {
        -
        70 os << "NONE";
        -
        71 }
        -
        72 else
        -
        73 {
        -
        74 os << val.m_native_handle;
        -
        75 }
        -
        76 return os << ']';
        -
        77}
        -
        78
        - -
        80{
        -
        81 return val1.m_native_handle == val2.m_native_handle;
        -
        82}
        -
        83
        - -
        85{
        -
        86 return !operator==(val1, val2);
        -
        87}
        -
        88
        - -
        90{
        -
        91 using boost::hash;
        -
        92
        -
        93 return hash<Native_handle::handle_t>()(val.m_native_handle);
        -
        94}
        -
        95
        - -
        97{
        -
        98 /* In POSIX and Windows this is valid. So don't worry about #ifdef'ing for OS, #error, etc.
        -
        99 * I did check that even in Windows they are formally integers still. */
        -
        100 return val1.m_native_handle < val2.m_native_handle;
        -
        101}
        -
        102
        -
        103} // namespace ipc::util
        +
        27/* Reminder: We've assured via static_assert(false) that this is being built in POSIX.
        +
        28 * (Windows has a special value too though.) */
        + +
        30
        +
        31// Native_handle implementations.
        +
        32
        + +
        34 m_native_handle(native_handle)
        +
        35{
        +
        36 // Nope.
        +
        37}
        +
        38
        + +
        40{
        +
        41 // It's why we exist: prevent duplication of src.m_native_handle.
        +
        42 operator=(std::move(src));
        +
        43}
        +
        44
        + +
        46
        + +
        48{
        +
        49 using std::swap;
        +
        50
        +
        51 if (*this != src)
        +
        52 {
        + +
        54 swap(m_native_handle, src.m_native_handle); // No-op if `&src == this`.
        +
        55 }
        +
        56 return *this;
        +
        57}
        +
        58
        + +
        60
        + +
        62{
        + +
        64}
        +
        65
        +
        66std::ostream& operator<<(std::ostream& os, const Native_handle& val)
        +
        67{
        +
        68 os << "native_hndl[";
        +
        69 if (val.null())
        +
        70 {
        +
        71 os << "NONE";
        +
        72 }
        +
        73 else
        +
        74 {
        +
        75 os << val.m_native_handle;
        +
        76 }
        +
        77 return os << ']';
        +
        78}
        +
        79
        + +
        81{
        +
        82 return val1.m_native_handle == val2.m_native_handle;
        +
        83}
        +
        84
        + +
        86{
        +
        87 return !operator==(val1, val2);
        +
        88}
        +
        89
        + +
        91{
        +
        92 using boost::hash;
        +
        93
        +
        94 return hash<Native_handle::handle_t>()(val.m_native_handle);
        +
        95}
        +
        96
        + +
        98{
        +
        99 /* In POSIX and Windows this is valid. So don't worry about #ifdef'ing for OS, static_assert(false), etc.
        +
        100 * I did check that even in Windows they are formally integers still. Update: Actually... not sure... depends
        +
        101 * on what's a Native_handle; if it's SOCKET then sure, but otherwise -- who knows? There's probably a ticket
        +
        102 * about that whole topic. */
        +
        103 return val1.m_native_handle < val2.m_native_handle;
        +
        104}
        +
        105
        +
        106} // namespace ipc::util
        void swap(Bipc_mq_handle &val1, Bipc_mq_handle &val2)
        Implements Persistent_mq_handle related concept: Swaps two objects.
        Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
        -
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        -
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        +
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        +
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        void swap(Shared_name &val1, Shared_name &val2)
        Swaps two objects.
        -
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        -
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        -
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        +
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        +
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        +
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        -
        bool null() const
        Returns true if and only if m_native_handle equals S_NULL_HANDLE.
        -
        Native_handle(handle_t native_handle=S_NULL_HANDLE)
        Constructs with given payload; also subsumes no-args construction to mean constructing an object with...
        -
        static const handle_t S_NULL_HANDLE
        The value for m_native_handle such that null() == true; else it is false.
        -
        Native_handle & operator=(Native_handle &&src)
        Move assignment; acts similarly to move ctor; but no-op if *this == src.
        -
        int handle_t
        The native handle type. Much logic relies on this type being light-weight (fast to copy).
        -
        handle_t m_native_handle
        The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        bool null() const
        Returns true if and only if m_native_handle equals S_NULL_HANDLE.
        +
        Native_handle(handle_t native_handle=S_NULL_HANDLE)
        Constructs with given payload; also subsumes no-args construction to mean constructing an object with...
        +
        static const handle_t S_NULL_HANDLE
        The value for m_native_handle such that null() == true; else it is false.
        +
        Native_handle & operator=(Native_handle &&src)
        Move assignment; acts similarly to move ctor; but no-op if *this == src.
        +
        int handle_t
        The native handle type. Much logic relies on this type being light-weight (fast to copy).
        +
        handle_t m_native_handle
        The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.

    diff --git a/doc/ipc_doc/generated/html_full/native__handle_8hpp.html b/doc/ipc_doc/generated/html_full/native__handle_8hpp.html index 7db407039..a5c3f4083 100644 --- a/doc/ipc_doc/generated/html_full/native__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_full/native__handle_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -115,7 +115,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__handle_8hpp_source.html b/doc/ipc_doc/generated/html_full/native__handle_8hpp_source.html index 3008eee2d..9a4f82108 100644 --- a/doc/ipc_doc/generated/html_full/native__handle_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__handle_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -97,206 +97,207 @@
    25{
    26
    27#ifndef FLOW_OS_LINUX
    -
    28# error "Flow-IPC supports transmitting native handles in Linux only; a core feature. Build in Linux only."
    -
    29#endif
    -
    30// From this point on (in #including .cpp files as well) POSIX is assumed; and in a few spots specifically Linux.
    -
    31
    -
    32// Types.
    -
    33
    -
    34/* Note: We lack a native_handle_fwd.hpp, as it's such a thin wrapper around an FD (int) that there's no point
    -
    35 * forward-declaring it, as it's ~always referred to by value. */
    -
    36
    -
    37/**
    -
    38 * A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    39 * It would have been acceptable to simply use an alias
    -
    40 * to the native handle type (in POSIX, `int`), but this way is better stylistically with exactly zero performance
    -
    41 * overhead. Initialize it, e.g., `Native_handle hndl(some_fd);`, where
    -
    42 * `some_fd` might be some POSIX-y FD (network socket, Unix domain socket, file descriptor, etc.).
    -
    43 * Or initialize via no-arg construction which results in an `null() == true` object. Copy construction, assignment,
    -
    44 * equality, total ordering, and hashing all work as one would expect and essentially the same as on the underlying
    -
    45 * native handles.
    -
    46 *
    -
    47 * It is either null() or stores a native handle. In the former case, null() being `true` means explicitly
    -
    48 * that `m_native_handle == Native_handle::S_NULL_HANDLE`.
    -
    49 *
    -
    50 * ### Rationale ###
    -
    51 * Originally we tried to make it aggregate-initializable, like `Native_handle hndl = {some_fd}`; for example see
    -
    52 * standard `array<>`. This is reassuring perf-wise; and it involves less (i.e., no) code to boot.
    -
    53 * However, it really is just one light-weight scalar, and there's 0% chance explicit construction is any slower.
    -
    54 * So, perf isn't an issue. Still, why not make it aggregate-initializable though? I (ygoldfel) gave up, eventually,
    -
    55 * because I wanted *some* non-default-behavior constructors to be available, namely no-args (`Native_handle()` that
    -
    56 * makes an `null() == true` one) and move (`Native_handle(Native_handle&&)` that nullifies the source object).
    -
    57 * This isn't allowed in aggregate-initializable classes; so then I made some `static` "constructors" instead; but
    -
    58 * those aren't sufficient for containers... and on it went. This way, though verbose, just works out better for the
    -
    59 * API.
    -
    60 */
    - -
    62{
    -
    63 // Types.
    -
    64
    -
    65 /// The native handle type. Much logic relies on this type being light-weight (fast to copy).
    -
    66 using handle_t = int;
    -
    67
    -
    68 // Constants.
    -
    69
    -
    70 /**
    -
    71 * The value for #m_native_handle such that `null() == true`; else it is `false`.
    -
    72 * No valid handle ever equals this.
    -
    73 */
    -
    74 static const handle_t S_NULL_HANDLE;
    -
    75
    -
    76 // Data.
    -
    77
    -
    78 /**
    -
    79 * The native handle (possibly equal to #S_NULL_HANDLE), the exact payload of this Native_handle.
    -
    80 * It can, of course, be assigned and accessed explicitly. The best way to initialize a
    -
    81 * new Native_handle is, therefore: `Native_handle{some_native_handle}`. You may also use the
    -
    82 * null() "constructor" to create a null() handle.
    -
    83 */
    - -
    85
    -
    86 // Constructors/destructor.
    -
    87
    -
    88 /**
    -
    89 * Constructs with given payload; also subsumes no-args construction to mean constructing an object with
    -
    90 * `null() == true`.
    -
    91 *
    -
    92 * @param native_handle
    -
    93 * Payload.
    -
    94 */
    -
    95 Native_handle(handle_t native_handle = S_NULL_HANDLE);
    -
    96
    -
    97 /**
    -
    98 * Constructs object equal to `src`, while making `src == null()`.
    -
    99 *
    -
    100 * ### Rationale ###
    -
    101 * This is move construction, but it's not about performance at all (as this is all quite cheap anyway);
    -
    102 * more to allow for the pattern of making an object from another object without propagating more copies of the
    -
    103 * underlying handle. Won't the default move ctor take care of it? No, because it'll just copy the handle and not
    -
    104 * nullify it.
    -
    105 *
    -
    106 * @param src
    -
    107 * Source object which will be made `null() == true`.
    -
    108 */
    - -
    110
    -
    111 /**
    -
    112 * Copy constructor.
    -
    113 * @param src
    -
    114 * Source object.
    -
    115 */
    - -
    117
    -
    118 // Methods.
    -
    119
    -
    120 /**
    -
    121 * Move assignment; acts similarly to move ctor; but no-op if `*this == src`.
    -
    122 * @param src
    -
    123 * Source object which will be made `null() == true`, unles `*this == src`.
    -
    124 * @return `*this`.
    -
    125 */
    - -
    127
    -
    128 /**
    -
    129 * Copy assignment; acts similarly to copy ctor.
    -
    130 * @param src
    -
    131 * Source object.
    -
    132 * @return `*this`.
    -
    133 */
    - -
    135
    -
    136 /**
    -
    137 * Returns `true` if and only if #m_native_handle equals #S_NULL_HANDLE.
    -
    138 * @return See above.
    -
    139 */
    -
    140 bool null() const;
    -
    141}; // struct Native_handle
    -
    142
    -
    143// Free functions.
    -
    144
    -
    145/**
    -
    146 * Returns `true` if and only if the two Native_handle objects are the same underlying handle.
    -
    147 *
    -
    148 * @relatesalso Native_handle
    -
    149 *
    -
    150 * @param val1
    -
    151 * Object.
    -
    152 * @param val2
    -
    153 * Object.
    -
    154 * @return See above.
    -
    155 */
    -
    156bool operator==(Native_handle val1, Native_handle val2);
    -
    157
    -
    158/**
    -
    159 * Negation of similar `==`.
    -
    160 *
    -
    161 * @relatesalso Native_handle
    -
    162 *
    -
    163 * @param val1
    -
    164 * Object.
    -
    165 * @param val2
    -
    166 * Object.
    -
    167 * @return See above.
    -
    168 */
    -
    169bool operator!=(Native_handle val1, Native_handle val2);
    -
    170
    -
    171/**
    -
    172 * Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees.
    -
    173 *
    -
    174 * @relatesalso Native_handle
    -
    175 *
    -
    176 * @param val1
    -
    177 * Left-hand side object.
    -
    178 * @param val2
    -
    179 * Right-hand side object.
    -
    180 * @return Whether left side is considered strictly less-than right side.
    -
    181 */
    -
    182bool operator<(Native_handle val1, Native_handle val2);
    -
    183
    -
    184/**
    -
    185 * Hasher of Native_handle for boost.unordered et al.
    -
    186 *
    -
    187 * @relatesalso Native_handle
    -
    188 *
    -
    189 * @param val
    -
    190 * Object to hash.
    -
    191 * @return See above.
    -
    192 */
    -
    193size_t hash_value(Native_handle val);
    -
    194
    -
    195/**
    -
    196 * Prints string representation of the given Native_handle to the given `ostream`.
    -
    197 *
    -
    198 * @relatesalso Native_handle
    -
    199 *
    -
    200 * @param os
    -
    201 * Stream to which to write.
    -
    202 * @param val
    -
    203 * Object to serialize.
    -
    204 * @return `os`.
    -
    205 */
    -
    206std::ostream& operator<<(std::ostream& os, const Native_handle& val);
    -
    207
    -
    208} // namespace ipc::util
    +
    28static_assert(false, "Flow-IPC supports transmitting native handles in Linux only; a core feature. "
    +
    29 "Build in Linux only.");
    +
    30#endif
    +
    31// From this point on (in #including .cpp files as well) POSIX is assumed; and in a few spots specifically Linux.
    +
    32
    +
    33// Types.
    +
    34
    +
    35/* Note: We lack a native_handle_fwd.hpp, as it's such a thin wrapper around an FD (int) that there's no point
    +
    36 * forward-declaring it, as it's ~always referred to by value. */
    +
    37
    +
    38/**
    +
    39 * A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    40 * It would have been acceptable to simply use an alias
    +
    41 * to the native handle type (in POSIX, `int`), but this way is better stylistically with exactly zero performance
    +
    42 * overhead. Initialize it, e.g., `Native_handle hndl(some_fd);`, where
    +
    43 * `some_fd` might be some POSIX-y FD (network socket, Unix domain socket, file descriptor, etc.).
    +
    44 * Or initialize via no-arg construction which results in an `null() == true` object. Copy construction, assignment,
    +
    45 * equality, total ordering, and hashing all work as one would expect and essentially the same as on the underlying
    +
    46 * native handles.
    +
    47 *
    +
    48 * It is either null() or stores a native handle. In the former case, null() being `true` means explicitly
    +
    49 * that `m_native_handle == Native_handle::S_NULL_HANDLE`.
    +
    50 *
    +
    51 * ### Rationale ###
    +
    52 * Originally we tried to make it aggregate-initializable, like `Native_handle hndl = {some_fd}`; for example see
    +
    53 * standard `array<>`. This is reassuring perf-wise; and it involves less (i.e., no) code to boot.
    +
    54 * However, it really is just one light-weight scalar, and there's 0% chance explicit construction is any slower.
    +
    55 * So, perf isn't an issue. Still, why not make it aggregate-initializable though? I (ygoldfel) gave up, eventually,
    +
    56 * because I wanted *some* non-default-behavior constructors to be available, namely no-args (`Native_handle()` that
    +
    57 * makes an `null() == true` one) and move (`Native_handle(Native_handle&&)` that nullifies the source object).
    +
    58 * This isn't allowed in aggregate-initializable classes; so then I made some `static` "constructors" instead; but
    +
    59 * those aren't sufficient for containers... and on it went. This way, though verbose, just works out better for the
    +
    60 * API.
    +
    61 */
    + +
    63{
    +
    64 // Types.
    +
    65
    +
    66 /// The native handle type. Much logic relies on this type being light-weight (fast to copy).
    +
    67 using handle_t = int;
    +
    68
    +
    69 // Constants.
    +
    70
    +
    71 /**
    +
    72 * The value for #m_native_handle such that `null() == true`; else it is `false`.
    +
    73 * No valid handle ever equals this.
    +
    74 */
    +
    75 static const handle_t S_NULL_HANDLE;
    +
    76
    +
    77 // Data.
    +
    78
    +
    79 /**
    +
    80 * The native handle (possibly equal to #S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    81 * It can, of course, be assigned and accessed explicitly. The best way to initialize a
    +
    82 * new Native_handle is, therefore: `Native_handle{some_native_handle}`. You may also use the
    +
    83 * null() "constructor" to create a null() handle.
    +
    84 */
    + +
    86
    +
    87 // Constructors/destructor.
    +
    88
    +
    89 /**
    +
    90 * Constructs with given payload; also subsumes no-args construction to mean constructing an object with
    +
    91 * `null() == true`.
    +
    92 *
    +
    93 * @param native_handle
    +
    94 * Payload.
    +
    95 */
    +
    96 Native_handle(handle_t native_handle = S_NULL_HANDLE);
    +
    97
    +
    98 /**
    +
    99 * Constructs object equal to `src`, while making `src == null()`.
    +
    100 *
    +
    101 * ### Rationale ###
    +
    102 * This is move construction, but it's not about performance at all (as this is all quite cheap anyway);
    +
    103 * more to allow for the pattern of making an object from another object without propagating more copies of the
    +
    104 * underlying handle. Won't the default move ctor take care of it? No, because it'll just copy the handle and not
    +
    105 * nullify it.
    +
    106 *
    +
    107 * @param src
    +
    108 * Source object which will be made `null() == true`.
    +
    109 */
    + +
    111
    +
    112 /**
    +
    113 * Copy constructor.
    +
    114 * @param src
    +
    115 * Source object.
    +
    116 */
    + +
    118
    +
    119 // Methods.
    +
    120
    +
    121 /**
    +
    122 * Move assignment; acts similarly to move ctor; but no-op if `*this == src`.
    +
    123 * @param src
    +
    124 * Source object which will be made `null() == true`, unles `*this == src`.
    +
    125 * @return `*this`.
    +
    126 */
    + +
    128
    +
    129 /**
    +
    130 * Copy assignment; acts similarly to copy ctor.
    +
    131 * @param src
    +
    132 * Source object.
    +
    133 * @return `*this`.
    +
    134 */
    + +
    136
    +
    137 /**
    +
    138 * Returns `true` if and only if #m_native_handle equals #S_NULL_HANDLE.
    +
    139 * @return See above.
    +
    140 */
    +
    141 bool null() const;
    +
    142}; // struct Native_handle
    +
    143
    +
    144// Free functions.
    +
    145
    +
    146/**
    +
    147 * Returns `true` if and only if the two Native_handle objects are the same underlying handle.
    +
    148 *
    +
    149 * @relatesalso Native_handle
    +
    150 *
    +
    151 * @param val1
    +
    152 * Object.
    +
    153 * @param val2
    +
    154 * Object.
    +
    155 * @return See above.
    +
    156 */
    +
    157bool operator==(Native_handle val1, Native_handle val2);
    +
    158
    +
    159/**
    +
    160 * Negation of similar `==`.
    +
    161 *
    +
    162 * @relatesalso Native_handle
    +
    163 *
    +
    164 * @param val1
    +
    165 * Object.
    +
    166 * @param val2
    +
    167 * Object.
    +
    168 * @return See above.
    +
    169 */
    +
    170bool operator!=(Native_handle val1, Native_handle val2);
    +
    171
    +
    172/**
    +
    173 * Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees.
    +
    174 *
    +
    175 * @relatesalso Native_handle
    +
    176 *
    +
    177 * @param val1
    +
    178 * Left-hand side object.
    +
    179 * @param val2
    +
    180 * Right-hand side object.
    +
    181 * @return Whether left side is considered strictly less-than right side.
    +
    182 */
    +
    183bool operator<(Native_handle val1, Native_handle val2);
    +
    184
    +
    185/**
    +
    186 * Hasher of Native_handle for boost.unordered et al.
    +
    187 *
    +
    188 * @relatesalso Native_handle
    +
    189 *
    +
    190 * @param val
    +
    191 * Object to hash.
    +
    192 * @return See above.
    +
    193 */
    +
    194size_t hash_value(Native_handle val);
    +
    195
    +
    196/**
    +
    197 * Prints string representation of the given Native_handle to the given `ostream`.
    +
    198 *
    +
    199 * @relatesalso Native_handle
    +
    200 *
    +
    201 * @param os
    +
    202 * Stream to which to write.
    +
    203 * @param val
    +
    204 * Object to serialize.
    +
    205 * @return `os`.
    +
    206 */
    +
    207std::ostream& operator<<(std::ostream& os, const Native_handle& val);
    +
    208
    +
    209} // namespace ipc::util
    Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
    -
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    -
    bool operator<(Native_handle val1, Native_handle val2)
    Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
    -
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    -
    size_t hash_value(Native_handle val)
    Hasher of Native_handle for boost.unordered et al.
    -
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    +
    bool operator<(Native_handle val1, Native_handle val2)
    Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
    +
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    +
    size_t hash_value(Native_handle val)
    Hasher of Native_handle for boost.unordered et al.
    +
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    Native_handle(const Native_handle &src)
    Copy constructor.
    -
    Native_handle(handle_t native_handle=S_NULL_HANDLE)
    Constructs with given payload; also subsumes no-args construction to mean constructing an object with...
    -
    static const handle_t S_NULL_HANDLE
    The value for m_native_handle such that null() == true; else it is false.
    -
    Native_handle & operator=(Native_handle &&src)
    Move assignment; acts similarly to move ctor; but no-op if *this == src.
    -
    int handle_t
    The native handle type. Much logic relies on this type being light-weight (fast to copy).
    -
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    Native_handle(handle_t native_handle=S_NULL_HANDLE)
    Constructs with given payload; also subsumes no-args construction to mean constructing an object with...
    +
    static const handle_t S_NULL_HANDLE
    The value for m_native_handle such that null() == true; else it is false.
    +
    Native_handle & operator=(Native_handle &&src)
    Move assignment; acts similarly to move ctor; but no-op if *this == src.
    +
    int handle_t
    The native handle type. Much logic relies on this type being light-weight (fast to copy).
    +
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    Native_handle & operator=(const Native_handle &src)
    Copy assignment; acts similarly to copy ctor.

    diff --git a/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp.html b/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp.html index e25e4a283..0842de712 100644 --- a/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -97,7 +97,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp_source.html b/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp_source.html index d13c1e208..86d832297 100644 --- a/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__handle__transport_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -91,864 +91,865 @@
    19
    20// Not compiled: for documentation only. Contains concept docs as of this writing.
    21#ifndef IPC_DOXYGEN_ONLY
    -
    22# error "As of this writing this is a documentation-only "header" (the "source" is for humans and Doxygen only)."
    -
    23#else // ifdef IPC_DOXYGEN_ONLY
    -
    24
    -
    25namespace ipc::transport
    -
    26{
    -
    27
    -
    28// Types.
    -
    29
    -
    30/**
    -
    31 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *sending* of
    -
    32 * discrete messages, each containing a native handle, a binary blob, or both. This is paired with
    -
    33 * the Native_handle_receiver concept which defines reception of such messages.
    -
    34 *
    -
    35 * ### Concept contents ###
    -
    36 * The concept defines the following behaviors/requirements.
    -
    37 * - The object has at least 2 states:
    -
    38 * - NULL: Object is not a peer: is not connected/capable of transmission. Essentially it is not a useful
    -
    39 * state. A default-cted object is in NULL state; and a moved-from object is as-if default-cted, therefore
    -
    40 * also in a NULL state. In this state all the transmission methods return `false` and no-op.
    -
    41 * - PEER: Object is or has been a peer (connected/capable of transmission). It is not possible to exit PEER
    -
    42 * state, except via being moved-from. A pipe-hosing error retains PEER state for instance.
    -
    43 * - Other states are allowed but outside the scope of the concept. For example a CONNECTING state may or may
    -
    44 * not be relevant (but again not relevant to the concept).
    -
    45 * - The (outgoing) transmission-of-messages methods, including transmission of graceful-close message.
    -
    46 * See their doc headers.
    -
    47 * - Behavior when the destructor is invoked. See ~Native_handle_sender()
    -
    48 * doc header.
    -
    49 * - Default ctor (which creates a NULL-state object that can be moved-to and to which "as-if"
    -
    50 * state any moved-from object is changed).
    -
    51 * - `sync_io`-core adopting ctor (which creates PEER-state object from an idle, as-if-just cted PEER-state
    -
    52 * sync_io::Native_handle_sender).
    -
    53 * - Move ctor, move assigment operator; these do the reasonable thing including setting the moved-from object
    -
    54 * to NULL state. Various satellite APIs (e.g., Native_socket_stream_acceptor) shall
    -
    55 * need these. That is such APIs do not rely on the factory/shared-ownership pattern.
    -
    56 *
    -
    57 * The concept (intentionally) does *not* define the following behaviors:
    -
    58 * - How to create a Native_handle_sender, except the default, `sync_io`-core-adopting, and move ctors.
    -
    59 * That is it does not define how to create a *new* (not moved-from) and *functioning* (PEER state: transmitting,
    -
    60 * connected) peer object, except the latter from an existing `sync_io`-pattern core. It only defines behavior
    -
    61 * once the user has access to a Native_handle_sender that is already in PEER state: connected to a opposing
    -
    62 * peer Native_handle_receiver.
    -
    63 *
    -
    64 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
    -
    65 * Native_handle_receiver) -- using the Unix domain socket transport.
    -
    66 * @see Channel, a pipe-composing class template that potentially implements this concept.
    -
    67 * @see Blob_sender: a degenerate version of the present concept: capable of transmitting only blobs, not
    -
    68 * `Native_handle`s.
    -
    69 *
    -
    70 * @todo In C++20, if/when we upgrade to that, Native_handle_sender (and other such doc-only classes) can become an
    -
    71 * actual concept formally implemented by class(es) that, today, implement it via the "honor system."
    -
    72 * Currently it is a class `#ifdef`-ed out from actual compilation but still participating in doc generation.
    -
    73 * Note that Doxygen (current version as of this writing: 1.9.3) claims to support doc generation from formal
    -
    74 * C++20 concepts.
    -
    75 *
    -
    76 * ### Rationale: Why is send_native_handle() not asynchronous? ###
    -
    77 * send_native_handle(), as noted in its doc header (and similarly Blob_sender::send_blob()) has 2 key properties:
    -
    78 * - It will *never* return would-block despite *always* being non-blocking.
    -
    79 * - It takes no completion handler; and it returns pipe-hosing errors synchronously via an out-arg or
    -
    80 * exception.
    -
    81 * - async_end_sending() does take a completion handler.
    -
    82 *
    -
    83 * That is, it is "somehow" both non-blocking/synchronous -- yet requires no would-block contingency on the user's
    -
    84 * part. Magical! How can this possibly work? After all we know that all known low-level transports will yield
    -
    85 * would-block eventually (as of this writing -- Unix domain sockets, POSIX MQs, bipc SHM-based MQs), if the
    -
    86 * opposing side is not popping data off the pipe. Yet, as we look at the opposing Native_handle_receiver concept
    -
    87 * we see that it makes no requirement on its impls to pop everything off the low-level transport in-pipe as soon
    -
    88 * as it arrives. (In actual fact all existing impls in Flow-IPC refuse to do any such thing.)
    -
    89 *
    -
    90 * Naturally the only answer as to how it can work is: Any given Native_handle_sender (and native Blob_sender) impl
    -
    91 * shall be ready to encounter would-block internally; if this occurs it will need to make a copy of the offending
    -
    92 * message (the meta-blob part specifically included -- that's the part that involves significant copying),
    -
    93 * enqueue it internally -- and keep enqueuing any further send_native_handle()d messages until the would-block
    -
    94 * clears, and the queue is eventually emptied.
    -
    95 *
    -
    96 * Fair enough: But isn't this a performance hazard? Answer: yes but only in a necessary way. We reached this
    -
    97 * decision after considering the entire system end-to-end:
    -
    98 * -# user prepares message blob B and tells `Native_handle_sender` S to send B;
    -
    99 * -# S tells low-level transport (possibly kernel) to accept B;
    -
    100 * -# `Native_handle_receiver` R pops B from low-level transport;
    -
    101 * -# user tells R it wanst to accept B, and R does give the latter to the user.
    -
    102 *
    -
    103 * It was a no-go to have Flow-IPC be in charge of allocating either-end buffer for B on the user's behalf:
    -
    104 * the user may want to user their own allocator, or the stack, or ??? -- possibly with zero-copy and prefix/postfix
    -
    105 * data nearby. The user buffer has to be ready, and S and R need to work with the memory areas provided by the
    -
    106 * user.
    -
    107 *
    -
    108 * Given all that, *one* or more of the following "people" has to be ready to keep B, or a copy of B, around, until
    -
    109 * the whole thing (1-4) has gone through: the sending user (1 above), S (2 above), or R (3 above). (If
    -
    110 * the receiving user (4 above) is always receiving things ASAP, without that process being processor-pegged or
    -
    111 * something, then it won't be a problem: no copying is necessary, except in step 2 when B is copied into
    -
    112 * the low-level process. Indeed that should be the case usually; we are discussing what to do *if* something goes
    -
    113 * wrong, or the receivier application is mis-coded, or who knows -- the receiver just isn't quick enough.)
    -
    114 *
    -
    115 * The answer, as already noted: *One* or more of 1, 2, 3 has to make a copy of B long enough until 4 has received it.
    -
    116 * At that point, in terms of overall performance, it *which* one of 1, 2, 3 it should be. Upon deliberating
    -
    117 * a few options occurred, but it seemed clear enough that 1 (original user) should not be the done, if it can be
    -
    118 * helped. IPC is not networking; as an end user I expect sending an out-message to work synchronously. Making
    -
    119 * me worry about a completion handler complicates the outgoing-direction API hugely -- and not in a way that
    -
    120 * makes the incoming-direction API any simpler, since that one always has to be ready for would-block
    -
    121 * (i.e., no in-messages immediately ready -- an async-receive API is required).
    -
    122 *
    -
    123 * So that left 2 or 3. I (ygoldfel) simply made the decision that one has to be chosen, and of those 2 is earlier
    -
    124 * and (internally for the concept implementer, also me at the time) more straightforward. If 3 were always
    -
    125 * reading items out of the low-level transport -- even when the user was not invoking `async_receive_*()` --
    -
    126 * then it would have to at least sometimes make copies of incoming data before the user chose to pop them out.
    -
    127 * By contrast, queueing it -- only on would-block -- in 2 would effectively make it a last-resort activity, as
    -
    128 * it should be.
    -
    129 *
    -
    130 * To summarize: Perfect opposing-receiver behavior cannot be guaranteed, and the low-level transport will eventually
    -
    131 * have a limit as to how much data it can buffer => in that case some entity must make a copy of the overflowing data
    -
    132 * => we want to make life easier for end user, so that entity should not be them => it must be either
    -
    133 * the `*_sender` or `*_receiver` => we chose `*_sender`, because it is safer and easier and faster and a last resort.
    -
    134 *
    -
    135 * One arguable drawback of this API design is that the Native_handle_sender (and Blob_sender) user won't be
    -
    136 * informed of an out-pipe-hosing error quite as soon as that object itself would know of it -- in some (rare)
    -
    137 * cases. I.e., if some data are queued up during would-block, and the user has stopped doing `send_*()`
    -
    138 * (as far as she is concerned, they're all working fine and have succeeded), and some timer later
    -
    139 * `*this` determines (in the background now) that the transport is hosed, the user would only find out about it
    -
    140 * upon the next `send_*()` call (it would *then* return the `Error_code` immediately), if any, or via
    -
    141 * async_end_sending(). Is this really a problem? Answer: Just... no. Exercise in reasoning this out (granted
    -
    142 * it is *somewhat* subjective) left to the reader. (Note we *could* supply some kind of out-of-band
    -
    143 * on-any-send-error API, and we considered this. It just was not worth it: inelegant, annoying. async_end_sending()
    -
    144 * with its completion handler is well sufficient.)
    -
    145 *
    -
    146 * It should be noted that this decision to make send_native_handle() synchronous/non-blocking/never-would-blocking
    -
    147 * has percolated through much of ipc::transport and even ipc::session: all our impls; Blob_sender and all its
    -
    148 * impls; Channel; and quite significantly struc::Channel. You'll note struc::Channel::send() is
    -
    149 * also synchronous/non-blocking/never-would-blocking, and even its implementation at the stage of actually
    -
    150 * sending binary data via Native_handle_sender/Blob_sender is quite straightforward. In Flow-IPC a
    -
    151 * `send*()` "just works."
    -
    152 *
    -
    153 * @todo Comparing Blob_sender::send_blob_max_size() (and similar checks in that family of concepts) to test
    -
    154 * whether the object is in PEER state is easy enough, but perhaps we can have a utility that would more
    -
    155 * expressively describe this check: `in_peer_state()` free function or something? It can still use the same
    -
    156 * technique internally.
    -
    157 */
    - -
    159{
    -
    160public:
    -
    161 // Constants.
    -
    162
    -
    163 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_receiver`'s.
    - -
    165
    -
    166 // Constructors/destructor.
    -
    167
    -
    168 /**
    -
    169 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state. In this state,
    -
    170 * all transmission-related methods (e.g., send_native_handle()) shall return `false` and otherwise no-op
    -
    171 * (aside from possible logging).
    -
    172 *
    -
    173 * This ctor is informally intended for the following uses:
    -
    174 * - A moved-from Native_handle_sender (i.e., the `src` arg for move-ctor and move-assignment operator)
    -
    175 * becomes as-if defaulted-constructed.
    -
    176 * - A target Native_handle_sender for a factory-like method (such as Native_socket_stream_acceptor::async_accept())
    -
    177 * shall typically be default-cted by the callin guse. (E.g.: Native_socket_stream_acceptor shall asynchronously
    -
    178 * move-assign a logger-apointed, nicely-nicknamed into that target `*this`, typically default-cted.)
    -
    179 *
    -
    180 * ### Informal corollary -- ctor that begins in PEER state ###
    -
    181 * Any functioning Native_handle_sender shall need at least one ctor that starts `*this` directly in PEER state.
    -
    182 * In that state the transmission-related methods (e.g., send_native_handle()) shall *not* return `false` and
    -
    183 * will in fact attempt transmission. However the form and function of such ctors is entirely dependent on
    -
    184 * the nature of the low-level transmission medium being encapsulated and is hence *intentionally* not a part
    -
    185 * of the concept. That said there is the `sync_io`-core-adopting ctor as well which *is* part of the concept.
    -
    186 *
    -
    187 * ### Informal corollary -- NULL-state ctors with 1+ args ###
    -
    188 * Other, 1+ arg, ctors that similarly create a NULL-state peer object are allowed/encouraged
    -
    189 * where relevant. In particular one taking a `Logger*` and a `nickname` string -- so as to subsequently enter a
    -
    190 * connecting phase via an `*_connect()` method, on the way to PEER state -- is reasonable.
    -
    191 * However this is not a formal part of this concept and is arguably not a general behavior.
    -
    192 * Such a ctor is informally intended for the following use at least:
    -
    193 * - One creates a Native_handle_sender that is `Logger`-appointed and nicely-`nickname`d; then one calls
    -
    194 * `*_connect()` on it in order to move it to a connecting phase and, hopefully, PEER state in that order.
    -
    195 * It will retain the logger and nickname (or whatever) throughout.
    -
    196 */
    - -
    198
    -
    199 /**
    -
    200 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    -
    201 * That core must be as-if-just-cted (having performed no work and not been configured via `.start_*_ops()`).
    -
    202 * That core object becomes as-if default-cted (therefore in NULL state).
    -
    203 *
    -
    204 * @param sync_io_core_in_peer_state_moved
    -
    205 * See above.
    -
    206 */
    -
    207 Native_handle_sender(sync_io::Native_handle_sender&& sync_io_core_in_peer_state_moved);
    -
    208
    -
    209 /**
    -
    210 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    -
    211 *
    -
    212 * @param src
    -
    213 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    214 */
    - -
    216
    -
    217 /// Disallow copying.
    - -
    219
    -
    220 /**
    -
    221 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
    -
    222 * still active) and cancels any pending completion handlers by invoking them ASAP with
    -
    223 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    -
    224 * As of this writing these are the completion handlers that would therefore be called:
    -
    225 * - The handler passed to async_end_sending(), if it was not `.empty()` and has not yet been invoked.
    -
    226 * Since it is not valid to call async_end_sending() more than once, there is at most 1 of these.
    -
    227 *
    -
    228 * The pending completion handler will be called from an unspecified thread that is not the calling thread.
    -
    229 * Any associated captured state for that handler will be freed shortly after the handler returns.
    -
    230 *
    -
    231 * We informally but very strongly recommend that your completion handler immediately return if the `Error_code`
    -
    232 * passed to it is `error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER`. This is similar to what one should
    -
    233 * do when using boost.asio and receiving the conceptually identical `operation_aborted` error code to an
    -
    234 * `async_...()` completion handler. In both cases, this condition means, "we have decided to shut this thing down,
    -
    235 * so the completion handlers are simply being informed of this."
    -
    236 *
    -
    237 * In NULL state the dtor shall no-op.
    -
    238 *
    -
    239 * ### Thread safety ###
    -
    240 * Same as for the transmission methods. *Plus* it is not safe to call this from within a completion handler supplied
    -
    241 * to one of those methods on the same `*this`. An implication of the latter is as follows:
    -
    242 *
    -
    243 * Any user source code line that nullifies a `Ptr` (`shared_ptr`) handle to `*this` should be seen as potentially
    -
    244 * *synchoronously* invoking this dtor. (By nullification we mean `.reset()` and anything else that makes the
    -
    245 * `Ptr` null. For example destroying a `vector<Ptr>` that contains a `Ptr` pointing to `*this` = nullification.)
    -
    246 * Therefore, if a nullification statement can possibly make the ref-count reach 0, then the user must zealously
    -
    247 * protect that statement from running concurrently with another send/receive API call on `*this`. That is to say,
    -
    248 * informally: When ensuring thread safety with respect to concurrent access to a Native_handle_sender, don't forget
    -
    249 * that the destructor also is a write-type of access, and that nullifying a `Ptr` handle to it can synchronously
    -
    250 * invoke it.
    -
    251 *
    -
    252 * @see Native_handle_receiver::~Native_handle_receiver(): sister concept with essentially equal requirements.
    -
    253 * @see Native_socket_stream::~Native_socket_stream(): implements concept (also implements just-mentioned sister
    -
    254 * concept).
    -
    255 */
    - -
    257
    -
    258 // Methods.
    -
    259
    -
    260 /**
    -
    261 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    -
    262 * No-op if `&src == this`.
    -
    263 *
    -
    264 * @see ~Native_handle_sender().
    -
    265 *
    -
    266 * @param src
    -
    267 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    268 * @return `*this`.
    -
    269 */
    - -
    271
    -
    272 /// Disallow copying.
    - -
    274
    -
    275 /**
    -
    276 * In PEER state: Returns max `meta_blob.size()` such that send_native_handle() shall not fail due to too-long
    -
    277 * payload with error::Code::S_INVALID_ARGUMENT. Always the same value once in PEER state. The opposing
    -
    278 * Blob_receiver::receive_meta_blob_max_size() shall return the same value (in the opposing object potentially
    -
    279 * in a different process).
    -
    280 *
    -
    281 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    -
    282 * a positive value.
    -
    283 *
    -
    284 * @return See above.
    -
    285 */
    - -
    287
    -
    288 /**
    -
    289 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order, to the opposing peer;
    -
    290 * the message consists of the provided native handle (if supplied); or the provided binary blob (if supplied);
    -
    291 * or both (if both supplied). The opposing peer's paired Native_handle_receiver shall receive it reliably and
    -
    292 * in-order via Native_handle_receiver::async_receive_native_handle().
    -
    293 *
    -
    294 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    -
    295 * instead and otherwise no-ops (logging aside).
    -
    296 *
    -
    297 * Providing neither a handle nor a blob results in undefined behavior (assertion may trip).
    -
    298 * To *not* supply a handle, provide object with `.null() == true`. To *not* supply a blob, provide
    -
    299 * a buffer with `.size() == 0`.
    -
    300 *
    -
    301 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
    -
    302 * If a blob is provided, it need only be valid until this method returns. The implementation shall, informally,
    -
    303 * strive to *not* save a copy of the blob (except into the low-level transport mechanism); but it is *allowed* to
    -
    304 * save it if required, such as if the low-level transport mechanism encounteres a would-block condition.
    -
    305 *
    -
    306 * This means, to the user, that this method is *both* non-blocking *and* synchronous *and* it must not
    -
    307 * refuse to send and return any conceptual would-block error (unlike, say, with a typical networked TCP socket API).
    -
    308 * Informally, the implementation must deal with any (typically quite rare) internal low-level would-block condition
    -
    309 * internally.
    -
    310 *
    -
    311 * However! Suppose send_native_handle() returns without error. This concept does *not* guarantee the message has
    -
    312 * been passed to the low-level transport at *this* point in time (informally it shall strive to make that
    -
    313 * happen in most cases however). A low-level would-block condition may cause it to be deferred. If one
    -
    314 * invokes ~Native_handle_sender() (dtor), the message may never be sent.
    -
    315 *
    -
    316 * However (part II)! It *is* guaranteed to have been passed to the transport once `*end_sending()`
    -
    317 * has been invoked, *and* its `on_done_func()` (if any) callback has been called. Therefore the expected use
    -
    318 * pattern is as follows:
    -
    319 * - Obtain a connected `Native_handle_sender` via factory.
    -
    320 * - Invoke send_native_handle() synchronously, hopefully without error.
    -
    321 * - (Repeat as needed for more such messages.)
    -
    322 * - Invoke `async_end_sending(F)` or `end_sending()` (to send graceful-close).
    -
    323 * - In `F()` destroy the `Native_handle_sender` (its dtor is invoked).
    -
    324 * - `F()` is invoked only once all queued messages, and the graceful-close, have been sent.
    -
    325 *
    -
    326 * ### Error semantics ###
    -
    327 * Firstly: See `flow::Error_code` docs for error reporting semantics (including the exception/code dichotomy).
    -
    328 *
    -
    329 * Secondly: If the generated #Error_code is error::Code::S_INVALID_ARGUMENT:
    -
    330 * - This refers to an invalid argument to *this* method invocation. This does *not* hose the pipe:
    -
    331 * further sends, etc., may be attempted with reasonable hope they will succeed.
    -
    332 * - send_meta_blob_max_size() is the limit for `meta_blob.size()`. Exceeding it leads to `S_INVALID_ARGUMENT`.
    -
    333 * - This interacts with the opposing Native_handle_receiver::async_receive_native_handle() in a subtle
    -
    334 * way. See "Blob underflow semantics" in that class concept's doc header.
    -
    335 * - At the impl's discretion, other conditions *may* lead to `S_INVALID_ARGUMENT`. If so they must
    -
    336 * be documented.
    -
    337 *
    -
    338 * Thirdly: All other non-success `Error_code`s generated should indicate the pipe is now indeed hosed; the user
    -
    339 * can count on the pipe being unusable from that point on. (It is recommended they cease to use the pipe
    -
    340 * and invoke the destructor to free resources.) If such a non-success code is emitted, the same one shall be emitted
    -
    341 * by all further send_native_handle() and async_end_sending() on `*this`.
    -
    342 *
    -
    343 * In particular error::Code::S_SENDS_FINISHED_CANNOT_SEND shall indicate that *this* method invocation
    -
    344 * occurred after invoking `*end_sending()` earlier.
    -
    345 *
    -
    346 * No would-block-like error condition shall be emitted.
    -
    347 *
    -
    348 * Lastly: The implementation is allowed to return a non-`INVALID_ARGUMENT` #Error_code in *this* invocation even
    -
    349 * though the true cause is a *previous* invocation of send_native_handle().
    -
    350 * Informally this may occur (probably in rare circumstances) if internally the handling of a previous
    -
    351 * call had to be deferred due to a low-level would-block condition; in that case the resulting problem is to be
    -
    352 * reported opportunistically with the next call. This allows for the non-blocking/synchronous semantics without
    -
    353 * the need to make send_native_handle() asynchronous.
    -
    354 *
    -
    355 * ### Thread safety ###
    -
    356 * You may call this from any thread. It is *not* required to be safe to call concurrently with
    -
    357 * any Native_handle_sender API, including this one and the destructor, invoked on `*this`.
    -
    358 *
    -
    359 * @param hndl_or_null
    -
    360 * A native handle (a/k/a FD) to send; or none if `hndl_or_null.null() == true`.
    -
    361 * @param meta_blob
    -
    362 * A binary blob to send; or none if `meta_blob.size() == 0`.
    -
    363 * @param err_code
    -
    364 * See above.
    -
    365 * @return `false` if `*this` is not in PEER (connected, transmitting) state;
    -
    366 * otherwise `true`.
    -
    367 */
    -
    368 bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const& meta_blob, Error_code* err_code = 0);
    -
    369
    -
    370 /**
    -
    371 * Equivalent to send_native_handle() but sends a graceful-close message instead of the usual payload; the opposing
    -
    372 * peer's Native_handle_receiver shall receive it reliably and in-order via
    -
    373 * Native_handle_receiver::async_receive_native_handle() in the form of
    -
    374 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE. If invoked after already invoking
    -
    375 * `*end_sending()`, the method shall no-op and return `false` and neither an exception nor truthy
    -
    376 * `*err_code`. Otherwise it shall return `true` -- but potentially emit a truthy #Error_code (if an error is
    -
    377 * detected).
    -
    378 *
    -
    379 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
    -
    380 * `false` immediately instead and otherwise no-ops (logging aside).
    -
    381 *
    -
    382 * Informally one should think of async_end_sending() as just another message, which is queued after
    -
    383 * preceding ones; but: it is the *last* message to be queued by definition. It's like an EOF or a TCP-FIN.
    -
    384 *
    -
    385 * ### Synchronicity/blockingness guarantees ###
    -
    386 * async_end_sending() is, unlike send_native_handle(), formally asynchronous. The reason for this,
    -
    387 * and the expected use pattern of async_end_sending() in the context of preceding send_native_handle()
    -
    388 * calls, is found in the doc header for Native_handle_sender::send_native_handle(). We omit further discussion here.
    -
    389 *
    -
    390 * ### Error semantics ###
    -
    391 * This section discusses the case where `true` is returned, meaning `*end_sending()` had not already
    -
    392 * been called.
    -
    393 *
    -
    394 * An #Error_code is generated and passed as the sole arg to `on_done_func()`.
    -
    395 * A falsy one indicates success. A truthy one indicates failure; but in particular:
    -
    396 * - error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER (destructor called, canceling all pending ops;
    -
    397 * spiritually identical to `boost::asio::error::operation_aborted`);
    -
    398 * - other arbitrary codes are possible, as with send_native_handle().
    -
    399 *
    -
    400 * Reminder: By the nature of `on_done_func()`, the pipe is finished regardless of whether it receives a
    -
    401 * success or non-success #Error_code.
    -
    402 *
    -
    403 * ### Thread safety ###
    -
    404 * The notes for send_native_handle() apply.
    -
    405 *
    -
    406 * @internal
    -
    407 * The semantic re. calling `*end_sending()` after already having called it and having that exclusively
    -
    408 * return `false` and do nothing was a judgment call. As of this writing there's a long-ish comment at the top of
    -
    409 * of `"sync_io::Native_socket_stream::Impl::*end_sending()"`" body discussing why I (ygoldfel) went that way.
    -
    410 * @endinternal
    -
    411 *
    -
    412 * @tparam Task_err
    -
    413 * A functor type with signature identical to `flow::async::Task_asio_err`.
    -
    414 * @param on_done_func
    -
    415 * See above. This shall be invoked from an unspecified thread that is not the calling thread.
    -
    416 * @return `false` if and only if *either* `*this` is not in PEER (connected, transmitting) state, *or*
    -
    417 * `*end_sending()` has already been called before (so this is a no-op, in both cases).
    -
    418 * Otherwise `true`.
    -
    419 */
    -
    420 template<typename Task_err>
    -
    421 bool async_end_sending(Task_err&& on_done_func);
    -
    422
    -
    423 /**
    -
    424 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
    -
    425 *
    -
    426 * Informally: If one uses this overload, it is impossible to guarantee everything queued has actually been sent,
    -
    427 * as `on_done_func()` is the only mechanism for this. Most likely this is only useful for test or proof-of-concept
    -
    428 * code; production-level robustness typically requires one to ensure everything queued has been sent. Alternatively
    -
    429 * the user's application-level protocol may already guarantee the message exchange has completed (e.g., by receiving
    -
    430 * an acknowledgment message of some sort) -- but in that case one can simply not call `*end_sending()`
    -
    431 * at all.
    -
    432 *
    -
    433 * @return Same as in async_end_sending().
    -
    434 */
    - -
    436
    -
    437 /**
    -
    438 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
    -
    439 * are ignored except that they reset any idle timer as enabled via Native_handle_receiver::idle_timer_run()
    -
    440 * (or similar). Auto-pings, at a minimum, shall be sent (subject to internal low-level transport would-block
    -
    441 * conditions) at the following times:
    -
    442 * - as soon as possible after a successful auto_ping() call; and subsequently:
    -
    443 * - at such times as to ensure that the time between 2 adjacent sends of *any* message is no more than
    -
    444 * `period`, until `*end_sending()` (if any) or error (if any).
    -
    445 * To clarify the 2nd point: If user messages are being sent already, an auto-ping may not be required or may be
    -
    446 * delayed until the last-sent message plus `period`). The implementation shall strive not to wastefully
    -
    447 * add auto-ping traffic unnecessary to this goal but is not *required* to do so. However, per the 1st point,
    -
    448 * an auto-ping shall be sent near auto_ping() time to establish a baseline.
    -
    449 *
    -
    450 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    -
    451 * instead and otherwise no-ops (logging aside). If auto_ping() has already been called successfuly,
    -
    452 * subsequently it will return `false` and no-op (logging aside). If `*end_sending()` has been called succesfully,
    -
    453 * auto_ping() will return `false` and no-op (logging side).
    -
    454 *
    -
    455 * ### Behavior past `*end_sending()` ###
    -
    456 * As noted: auto_ping() returns `false` and no-ops if invoked after successful `*end_sending()`.
    -
    457 * Rationale: If `*end_sending()` has been called, then the receiver shall (assuming no other error) receive
    -
    458 * graceful-close (and hose the in-pipe as a result) as soon as possible, or it has already received it
    -
    459 * (and hosed the pipe). Therefore any potential "further" hosing of the pipe due to idle timer would be redundant
    -
    460 * and ignored anyway given the nature of the Native_handle_receiver (and similar) API.
    -
    461 *
    -
    462 * ### Thread safety ###
    -
    463 * The notes for send_native_handle() apply.
    -
    464 *
    -
    465 * @param period
    -
    466 * Pinging occurs so as to cause the opposing receiver to receive *a* message (whether auto-ping or user
    -
    467 * message) at least this frequently, subject to limitations of the low-level transport.
    -
    468 * The optional default is chosen by the impl to most reasonably work with the opposing `idle_timer_run()`
    -
    469 * to detect a zombified/overloaded peer.
    -
    470 * @return `false` if `*this` is not in PEER (connected, transmitting) state, or if already called successfully
    -
    471 * in `PEER` state, or if `*end_sending()` was called successfully in `PEER` state; otherwise `true`.
    -
    472 */
    -
    473 bool auto_ping(util::Fine_duration period = default_value);
    -
    474}; // class Native_handle_sender
    -
    475
    -
    476/**
    -
    477 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *receiving* of
    -
    478 * discrete messages, each containing a native handle, a binary blob, or both. This is paired with
    -
    479 * the Native_handle_sender concept which defines sending of such messages.
    -
    480 *
    -
    481 * Concept contents
    -
    482 * ----------------
    -
    483 * The concept defines the following behaviors/requirements.
    -
    484 * - The object has at least 2 states, NULL and PEER. See notes in Native_handle_sender w/r/t this;
    -
    485 * they apply equally here.
    -
    486 * - The (incoming) transmission-of-messages methods, including reception of graceful-close message and
    -
    487 * cutting off any further receiving. See their doc headers.
    -
    488 * - Behavior when the destructor is invoked. See ~Native_handle_receiver() doc header.
    -
    489 * - Default ctor. See notes in Native_handle_sender w/r/t this; they apply equally here.
    -
    490 * - `sync_io`-core adopting ctor. Same deal.
    -
    491 * - Move ctor, move assigment operator. Same deal.
    -
    492 *
    -
    493 * The concept (intentionally) does *not* define the following behaviors:
    -
    494 * - How to create a Native_handle_receiver, except the default, `sync_io`-core-adopting, and move ctors.
    -
    495 * Notes for Native_handle_sender apply equally here.
    -
    496 *
    -
    497 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
    -
    498 * Native_handle_sender) -- using the Unix domain socket transport.
    -
    499 * @see Channel, a pipe-composing class template that potentially implements this concept.
    -
    500 * @see Blob_receiver: a degenerate version of the present concept: capable of transmitting only blobs, not
    -
    501 * `Native_handle`s.
    -
    502 *
    -
    503 * Blob underflow semantics
    -
    504 * ------------------------
    -
    505 * This potentially important subtlety is regarding the interplay between
    -
    506 * Native_handle_receiver::S_META_BLOB_UNDERFLOW_ALLOWED, async_receive_native_handle() `meta_blob.size()`,
    -
    507 * and Native_handle_sender::send_native_handle() `meta_blob.size()`.
    -
    508 *
    -
    509 * Consider a `*this` named `R` and an opposing `*_sender` named `S`. Note that `R.receive_meta_blob_max_size()
    -
    510 * == S.send_meta_blob_max_size()`; call this limit `L`. `L` shall always be in practice small enough to where
    -
    511 * allocating a buffer of this size as the receive target is reasonable; hence kilobytes at most, not megabytes.
    -
    512 * (In some cases, such as with `Blob_stream_mq_*`, it is configurable at runtime. In others, as with
    -
    513 * Native_socket_stream, it is a constant: sync_io::Native_socket_stream::S_MAX_META_BLOB_LENGTH.)
    -
    514 *
    -
    515 * As noted in that concept's docs, naturally, `S.send_native_handle()` shall yield immediate, non-pipe-hosing
    -
    516 * error::Code::S_INVALID_ARGUMENT, if `meta_blob.size() > L`. This is called overflow and is always enforced.
    -
    517 *
    -
    518 * Now consider `N = meta_blob.size()` for `R.async_receive_native_handle()`. This is the size of the target
    -
    519 * blob: how many bytes it *can* receive. How `L` is enforced by `R` is not uniform among this concept's impls:
    -
    520 * rather it depends on the compile-time constant Native_handle_receiver::S_META_BLOB_UNDERFLOW_ALLOWED.
    -
    521 *
    -
    522 * ### Semantics: `META_BLOB_UNDERFLOW_ALLOWED` is `false` ###
    -
    523 * Suppose it is `false` (as is the case for Blob_stream_mq_receiver). In that case `N < L` is *disallowed*:
    -
    524 * `R.async_receive_native_handle()` *shall always* fail with non-pipe-hosing error::Code::S_INVALID_ARGUMENT
    -
    525 * for that reason. Certainly `N` cannot be zero -- not even if the incoming message is expected to
    -
    526 * contain only a non-`.null() Native_handle`.
    -
    527 *
    -
    528 * @note Formally it's as written. Informally the rationale for allowing this restriction is that some low-level
    -
    529 * transports have it; and working around it would probably affect performance and is unnatural.
    -
    530 * In particular Persistent_mq_handle::try_receive() (MQ receive) shall immediately fail if a target buffer
    -
    531 * is supplied smaller than Persistent_mq_handle::max_msg_size(). For both POSIX (`man mq_receive`) and
    -
    532 * bipc (`boost::interprocess::message_queue::try_receive()` docs and source code) it is disallowed at the
    -
    533 * low-level API level.
    -
    534 *
    -
    535 * Thus since `N >= L` is guaranteed before any actual receipt attempt is made, it is *impossible* for
    -
    536 * a message to arrive such that its meta-blob's size would overflow the target blob (buffer) (of size `N`).
    -
    537 * Therefore error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE shall not be emitted.
    -
    538 *
    -
    539 * ### Semantics: `META_BLOB_UNDERFLOW_ALLOWED` is `true` ###
    -
    540 * Suppose it is `true` (as is the case for Native_socket_stream). In that case `N < L` is allowed, in the sense
    -
    541 * that `R.async_receive_native_handle()` *shall not* fail with non-pipe-hosing error::Code::S_INVALID_ARGUMENT
    -
    542 * for that reason. In particular, in that case, `N` can even be zero: this implies the incoming message *must*
    -
    543 * contain a non-`.null() Native_handle` (it is not allowed to send a message with no content at all).
    -
    544 * (In the case of degenerate concept Blob_sender, `N` must exceed zero, as it cannot transmit anything but
    -
    545 * blobs.)
    -
    546 *
    -
    547 * However suppose a message has arrived, and its meta-blob's size -- which cannot exceed `L` -- is larger than
    -
    548 * `N`. I.e., it would *underflow* the user-supplied target buffer (blob). In that case:
    -
    549 * - async_receive_native_handle() shall emit error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE.
    -
    550 * - This error shall be pipe-hosing (further receive attempts will yield the same error).
    -
    551 *
    -
    552 * Informal tips: Any blob-size error can be completely avoided by always supplying target blob with `N == L`.
    -
    553 * (`N > L` will also work but may be considered wasteful, all else being equal.) In addition this tactic will
    -
    554 * ensure the code will generically work with a different Native_handle_receiver impl for which
    -
    555 * `S_META_BLOB_UNDERFLOW_ALLOWED == false`. Alternatively, the user protocol may be such that you simply know
    -
    556 * that `S` will never send messages beyond some limit (smaller than `L`), perhaps for particular messages.
    -
    557 * In that case `N` can be set to this smaller-than-`L` value. However -- such code will fail
    -
    558 * if the concept impl is later to switched to one with `S_META_BLOB_UNDERFLOW_ALLOWED == true`. This may or
    -
    559 * may not be an issue depending on your future dev plans.
    -
    560 *
    -
    561 * ### Summary ###
    -
    562 * This dichotomy of possible semantics is a conscious choice. Mode `false` is a necessity: some low-level transports
    -
    563 * enforce it, period. Mode `true` is to support a possible algorithmic desire to allocate smaller-than-`L`
    -
    564 * target buffers. The problem is some low-level transports allow this; but others don't. We did not want to
    -
    565 * impose one type's limitations on users of the other type. Therefore, if your code is agnostic to the type
    -
    566 * of transport, then code as-if `S_META_BLOB_UNDERFLOW_ALLOWED == false`. Otherwise you may code otherwise.
    -
    567 *
    -
    568 * Rationale: Why no `end_receiving()`, given opposing concept has `*end_sending()`?
    -
    569 * ---------------------------------------------------------------------------------
    -
    570 * An early version of Native_handle_receiver and Blob_receiver did have an `end_receiving()`.
    -
    571 * The idea was it would have 2 effects (plus 1 bonus):
    -
    572 * -# Any ongoing `async_receive_*()`s would be interrupted with in-pipe-hosing error
    -
    573 * error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE -- the same one as when receing a graceful-close
    -
    574 * from opposing `*end_sending()`.
    -
    575 * -# There would be no further reading from the low-level transport for any reason.
    -
    576 * -# There was also the *thought*, but not the action, that an impl could inform the *opposing sender* of the
    -
    577 * pipe being closed by the reader. This would be conceptually similar to SIGPIPE in POSIX. In practice, of
    -
    578 * the available low-level transports as of this writing, only Native_socket_stream could actually implement it,
    -
    579 * as the otherwise-full-duplex independent pipes do live in this same peer (Unix domain socket), so the out-pipe
    -
    580 * could be used to inform the other guy that *his* out-pipe (our in-pipe) is now pointless. `Blob_stream_mq_*`
    -
    581 * are fully independent, operating on separate MQ kernel objects, so it was not realistically possible in
    -
    582 * that case.
    -
    583 *
    -
    584 * In order: (1) is fairly dubious: the local user should know when they've stopped receiving and don't need to
    -
    585 * use this mechanism to inform themselves. (3), as stated, sounded like a possible future improvement, but time
    -
    586 * told us it was not going to work out: if only a 2-pipe transport can do it in any case, organizing a concept
    -
    587 * around such a thing is just complicated. If necessary the user can (and we think likely will) just arrange
    -
    588 * their own protocol. So that leaves (2).
    -
    589 *
    -
    590 * To begin with -- in reality user protocols tend to be designed to not need such measures. If the reader is no
    -
    591 * longer interested, writer will probably know that. This is not networking after all: it is IPC.
    -
    592 * That aside, though, it only makes sense in any case if an impl *chooses* to greedily cache all low-level
    -
    593 * in-traffic in user RAM, even while no `async_receive_*()`s are pending to read it. Early on we actually did do
    -
    594 * that; but with the move to `sync_io`-pattern cores, and after contemplating
    -
    595 * "Rationale: Why is send-native-handle not asynchronous?" (Native_handle_sender concept doc header),
    -
    596 * we got rid of this waste of compute, letting unwanted in-traffic accumulate within a sender peer object
    -
    597 * (Native_handle_sender, Blob_sender) only. So in practice:
    -
    598 *
    -
    599 * If `end_receiving()` does not signal anything of value ((1) and (3)), and does not actually prevent any
    -
    600 * low-level reading that would otherwise occur, then it is a pointless complication. So that is why we got rid of it.
    -
    601 */
    - -
    603{
    -
    604public:
    -
    605 // Constants.
    -
    606
    -
    607 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_sender`'s.
    - -
    609
    -
    610 /**
    -
    611 * If `false` then `meta_blob.size() > receive_meta_blob_max_size()` in PEER-state async_receive_native_handle()
    -
    612 * shall yield non-pipe-hosing error::Code::INVALID_ARGUMENT, and it shall never yield
    -
    613 * pipe-hosing error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE; else the latter may occur, while the former
    -
    614 * shall never occur for that reason.
    -
    615 *
    -
    616 * @see "Blob underflow semantics" in class concept doc header.
    -
    617 */
    -
    618 static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED = value;
    -
    619
    -
    620 // Constructors/destructor.
    -
    621
    -
    622 /**
    -
    623 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state. In this state,
    -
    624 * all transmission-related methods (e.g., async_receive_native_handle()) shall return `false` and otherwise no-op
    -
    625 * (aside from possible logging).
    -
    626 *
    -
    627 * All notes from Native_handle_sender() default ctor doc header apply here analogously. They are helpful so
    -
    628 * please read Native_handle_sender() doc header.
    -
    629 */
    - -
    631
    -
    632 /**
    -
    633 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    -
    634 * That core must be as-if-just-cted (having performed no work and not been configured via `.start_*_ops()`).
    -
    635 * That core object becomes as-if default-cted (therefore in NULL state).
    -
    636 *
    -
    637 * @param sync_io_core_in_peer_state_moved
    -
    638 * See above.
    -
    639 */
    -
    640 Native_handle_receiver(sync_io::Native_handle_receiver&& sync_io_core_in_peer_state_moved);
    -
    641
    -
    642 /**
    -
    643 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    -
    644 *
    -
    645 * @param src
    -
    646 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    647 */
    - -
    649
    -
    650 /// Disallow copying.
    - -
    652
    -
    653 /**
    -
    654 * Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state, and if it's
    -
    655 * still active) and cancels any pending completion handlers by invoking them ASAP with
    -
    656 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    -
    657 * As of this writing these are the completion handlers that would therefore be called:
    -
    658 * - Any handler passed to async_receive_native_handle() that has not yet been invoked.
    -
    659 * There can be 0 or more of these.
    -
    660 *
    -
    661 * The pending completion handler(s) (if any) will be called from an unspecified thread that is not the calling
    -
    662 * thread. Any associated captured state for that handler will be freed shortly after the handler returns.
    -
    663 *
    -
    664 * The rest of the notes in ~Native_handle_sender() apply equally here.
    -
    665 *
    -
    666 * @see Native_handle_sender::~Native_handle_sender(): sister concept with essentially equal requirements.
    -
    667 * @see Native_socket_stream::~Native_socket_stream(): implements concept (also implements just-mentioned sister
    -
    668 * concept).
    -
    669 */
    - -
    671
    -
    672 // Methods.
    -
    673
    -
    674 /**
    -
    675 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    -
    676 * No-op if `&src == this`.
    -
    677 *
    -
    678 * @see ~Native_handle_receiver().
    -
    679 *
    -
    680 * @param src
    -
    681 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    -
    682 * @return `*this`.
    -
    683 */
    - -
    685
    -
    686 /// Disallow copying.
    - -
    688
    -
    689 /**
    -
    690 * In PEER state: Returns min `target_meta_blob.size()` such that (1) async_receive_native_handle() shall not fail
    -
    691 * with error::Code::S_INVALID_ARGUMENT (only if #S_META_BLOB_UNDERFLOW_ALLOWED is `false`; otherwise not relevant),
    -
    692 * and (2) it shall *never* fail with error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE. Please see
    -
    693 * "Blob underflow semantics" for explanation of these semantics.
    -
    694 *
    -
    695 * Always the same value once in PEER state. The opposing
    -
    696 * Blob_sender::send_meta_blob_max_size() shall return the same value (in the opposing object potentially
    -
    697 * in a different process).
    -
    698 *
    -
    699 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    -
    700 * a positive value.
    -
    701 *
    -
    702 * @return See above.
    -
    703 */
    - -
    705
    -
    706 /**
    -
    707 * In PEER state: Asynchronously awaits one discrete message -- as sent by the opposing peer via
    -
    708 * Native_handle_sender::send_native_handle() or `"Native_handle_sender::*end_sending()"` -- and
    -
    709 * receives it into the given target locations, reliably and in-order. The message is, therefore, one of the
    -
    710 * following:
    -
    711 * - A binary blob; a native handle; or both. This is indicated by `on_done_func(Error_code(), N)`.
    -
    712 * The falsy code indicates success; `N <= target_meta_blob.size()` indicates the number of bytes received into
    -
    713 * `target_meta_blob.data()` (zero means no blob was sent in the message). `*target_hndl` is set
    -
    714 * (`target_hndl->null() == true` means no handle was sent in the message).
    -
    715 * - Graceful-close. This is indicated by `on_done_func(error::code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, 0)`;
    -
    716 * neither the target blob nor target native handle are touched.
    -
    717 *
    -
    718 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    -
    719 * instead and otherwise no-ops (logging aside).
    -
    720 *
    -
    721 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
    -
    722 * `*target_hndl` and the area described by `target_meta_blob` must both remain valid until `on_done_func()`
    -
    723 * executes. The method itself shall be non-blocking.
    -
    724 *
    -
    725 * The implementation shall, informally, strive to *not* copy the received blob (if any) into
    -
    726 * `target_meta_blob.data()...` except from the low-level transport mechanism. That is: it shall strive to not
    -
    727 * store the blob data in some internal buffer before ending up in `target_meta_blob.data()...`.
    -
    728 *
    -
    729 * ### Error semantics ###
    -
    730 * An #Error_code is generated and passed as the 1st arg to `on_done_func()`.
    -
    731 * A falsy one indicates success. A truthy one indicates failure; but in particular:
    -
    732 * - error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER (destructor called, canceling all pending ops;
    -
    733 * spiritually identical to `boost::asio::error::operation_aborted`);
    -
    734 * - only if #S_META_BLOB_UNDERFLOW_ALLOWED is `true`:
    -
    735 * - error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE (opposing peer has sent a message with a meta-blob exceeding
    -
    736 * `target_meta_blob.size()` in length; in particular one can give an empty buffer if no meta-blob expected);
    -
    737 * - error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE (peer gracefully closed pipe via `*end_sending()`);
    -
    738 * - error::Code::S_RECEIVER_IDLE_TIMEOUT (idle timeout: see idle_timer_run());
    -
    739 * - other arbitrary codes are possible.
    -
    740 * - No would-block-like error condition shall be emitted.
    -
    741 *
    -
    742 * A non-success on-done invocation means the incoming pipe is hosed. (It is recommended they cease to use the pipe
    -
    743 * and invoke the destructor to free resources.) If such a non-success code is emitted, the same one shall be emitted
    -
    744 * by all further async_receive_native_handle() calls on `*this`. Key exception:
    -
    745 * - error::Code::S_INVALID_ARGUMENT:
    -
    746 * - This refers to an invalid argument to *this* method invocation.
    -
    747 * - If and only if #S_META_BLOB_UNDERFLOW_ALLOWED is `false`: A length floor on the target blob is imposed.
    -
    748 * Hence if `target_meta_blob.size() < receive_meta_blob_max_size()` then `S_INVALID_ARGUMENT` is emitted.
    -
    749 * - This shall *not* hose the pipe. Subsequent async-receives may be attempted with reasonable hope of
    -
    750 * success.
    -
    751 * - At the impl's discretion, other conditions *may* lead to `S_INVALID_ARGUMENT`. If so they must
    -
    752 * be documented.
    -
    753 *
    -
    754 * ### Thread safety ###
    -
    755 * You may call this either from any thread including the unspecified thread running within another call's
    -
    756 * `on_done_func()`. It is *not* required to be safe to call concurrently with any Native_handle_receiver API,
    -
    757 * including this one and the destructor, invoked on `*this`.
    -
    758 *
    -
    759 * @tparam Task_err_sz
    -
    760 * A functor type with signature identical to `flow::async::Task_asio_err_sz`.
    -
    761 * @param target_hndl
    -
    762 * `*target_hndl` shall be set by the time `on_done_func()` is executed with a falsy code. See above.
    -
    763 * @param target_meta_blob
    -
    764 * `target_meta_blob.data()...` shall be written to by the time `on_done_func()` is executed with a falsy
    -
    765 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
    -
    766 * `target_meta_blob.size()`. See above.
    -
    767 * @param on_done_func
    -
    768 * See above. This shall be invoked from an unspecified thread that is not the calling thread.
    -
    769 * @return `false` if `*this` is not in PEER (connected, transmitting) state;
    -
    770 * otherwise `true`.
    -
    771 */
    -
    772 template<typename Task_err_sz>
    - -
    774 const util::Blob_mutable& target_meta_blob,
    -
    775 Task_err_sz&& on_done_func);
    -
    776
    -
    777 /**
    -
    778 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
    -
    779 * the specified time has passed since the last received low-level traffic (or this call, whichever most
    -
    780 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT. The implementation
    -
    781 * shall guarantee the observer idle timeout is at least the provided value but may exceed this value for
    -
    782 * internal reasons, as long as it's by a less than human-perceptible period (roughly speaking -- milliseconds,
    -
    783 * not seconds).
    -
    784 *
    -
    785 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    -
    786 * instead and otherwise no-ops (logging aside). If idle_timer_run() has already been called successfuly,
    -
    787 * subsequently it will return `false` and no-op (logging aside).
    -
    788 *
    -
    789 * ### Important: Relationship between idle_timer_run() and async_receive_native_handle() ###
    -
    790 * idle_timer_run() is optional: if you have not called it, then the following does not apply. If you *have* called
    -
    791 * it:
    -
    792 *
    -
    793 * It will work usefully if and only if subsequently an async_receive_native_handle() is oustanding at least
    -
    794 * once each `timeout`. Informally this means it's best to immediately issue async_receive_native_handle() --
    -
    795 * unless one is already oustanding -- and then as soon as that completes (sans error) issue at least one more;
    -
    796 * and so on. Why? What are we talking about? Simple: async_receive_native_handle() impl is *not* required
    -
    797 * to read any more data from the low-level transport than is sufficient to satisfy the current
    -
    798 * async_receive_native_handle() deficit. (If it were required to do so, it would've been required to store copies
    -
    799 * of incoming meta-blobs when there's no user-request deficit; we've consciously avoided unnecessary copying.)
    -
    800 * So while there's no async_receive_native_handle() outstanding, `*this` will be considered idle; and once
    -
    801 * that continues long enough for `timeout` to be exceeded, the idle timer will hose the in-pipe.
    -
    802 *
    -
    803 * So: If you plan to use idle_timer_run(), then you need to be ~always async-receiving. Otherwise you'll risk
    -
    804 * hitting idle-timeout, even as the other side diligently sends stuff (`auto_ping()` or otherwise).
    -
    805 *
    -
    806 * ### Error semantics ###
    -
    807 * If and only if the timeout does occur down the line, the aforementioned error will be emitted via
    -
    808 * async_receive_native_handle() (or similar) handler. It shall be treated as the reason to hose the pipe
    -
    809 * (assuming it was not hosed by something else earlier).
    -
    810 *
    -
    811 * ### Thread safety ###
    -
    812 * You may call this either from any thread including the unspecified thread running within another call's
    -
    813 * `on_done_func()`. It is *not* required to be safe to call concurrently with any API, including this one
    -
    814 * and the destructor, invoked on `*this`.
    -
    815 *
    -
    816 * ### Suggested use ###
    -
    817 * Informally: There are roughly two approaches to using idle_timer_run().
    -
    818 *
    -
    819 * Firstly it can be used to gauge the state of the opposing process; if no auto-pings are arriving regularly,
    -
    820 * then the opposing Native_handle_sender (or similar) must be zombified or overloaded. To use it in this
    -
    821 * capacity, typically one must use Native_handle_sender::auto_ping() (or similar) on the opposing side.
    -
    822 * Typically one would then leave `timeout` at its suggested default value.
    -
    823 *
    -
    824 * Secondly it can be used to more generally ensure some application algorithm on the opposing side (presumably
    -
    825 * cooperating with the algorithm on the local side) is sending messages with expected frequency.
    -
    826 * That is, one would not use `auto_ping()` but rather send their own messages in a way that makes sense for
    -
    827 * the applications' algorithm.
    -
    828 *
    -
    829 * @param timeout
    -
    830 * The idle timeout to observe.
    -
    831 * The optional default is chosen by the impl to most reasonably work with the opposing `auto_ping()`
    -
    832 * to detect a zombified/overloaded peer.
    -
    833 * @return `false` if `*this` is not in PEER (connected, transmitting) state, or if already called successfully
    -
    834 * in `PEER` state; otherwise `true`.
    -
    835 */
    -
    836 bool idle_timer_run(util::Fine_duration timeout = default_value);
    -
    837}; // class Native_handle_receiver
    -
    838
    -
    839} // namespace ipc::transport
    -
    A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...
    +
    22static_assert(false, "As of this writing this is a documentation-only \"header\" "
    +
    23 "(the \"source\" is for humans and Doxygen only).");
    +
    24#else // ifdef IPC_DOXYGEN_ONLY
    +
    25
    +
    26namespace ipc::transport
    +
    27{
    +
    28
    +
    29// Types.
    +
    30
    +
    31/**
    +
    32 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *sending* of
    +
    33 * discrete messages, each containing a native handle, a binary blob, or both. This is paired with
    +
    34 * the Native_handle_receiver concept which defines reception of such messages.
    +
    35 *
    +
    36 * ### Concept contents ###
    +
    37 * The concept defines the following behaviors/requirements.
    +
    38 * - The object has at least 2 states:
    +
    39 * - NULL: Object is not a peer: is not connected/capable of transmission. Essentially it is not a useful
    +
    40 * state. A default-cted object is in NULL state; and a moved-from object is as-if default-cted, therefore
    +
    41 * also in a NULL state. In this state all the transmission methods return `false` and no-op.
    +
    42 * - PEER: Object is or has been a peer (connected/capable of transmission). It is not possible to exit PEER
    +
    43 * state, except via being moved-from. A pipe-hosing error retains PEER state for instance.
    +
    44 * - Other states are allowed but outside the scope of the concept. For example a CONNECTING state may or may
    +
    45 * not be relevant (but again not relevant to the concept).
    +
    46 * - The (outgoing) transmission-of-messages methods, including transmission of graceful-close message.
    +
    47 * See their doc headers.
    +
    48 * - Behavior when the destructor is invoked. See ~Native_handle_sender()
    +
    49 * doc header.
    +
    50 * - Default ctor (which creates a NULL-state object that can be moved-to and to which "as-if"
    +
    51 * state any moved-from object is changed).
    +
    52 * - `sync_io`-core adopting ctor (which creates PEER-state object from an idle, as-if-just cted PEER-state
    +
    53 * sync_io::Native_handle_sender).
    +
    54 * - Move ctor, move assigment operator; these do the reasonable thing including setting the moved-from object
    +
    55 * to NULL state. Various satellite APIs (e.g., Native_socket_stream_acceptor) shall
    +
    56 * need these. That is such APIs do not rely on the factory/shared-ownership pattern.
    +
    57 *
    +
    58 * The concept (intentionally) does *not* define the following behaviors:
    +
    59 * - How to create a Native_handle_sender, except the default, `sync_io`-core-adopting, and move ctors.
    +
    60 * That is it does not define how to create a *new* (not moved-from) and *functioning* (PEER state: transmitting,
    +
    61 * connected) peer object, except the latter from an existing `sync_io`-pattern core. It only defines behavior
    +
    62 * once the user has access to a Native_handle_sender that is already in PEER state: connected to a opposing
    +
    63 * peer Native_handle_receiver.
    +
    64 *
    +
    65 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
    +
    66 * Native_handle_receiver) -- using the Unix domain socket transport.
    +
    67 * @see Channel, a pipe-composing class template that potentially implements this concept.
    +
    68 * @see Blob_sender: a degenerate version of the present concept: capable of transmitting only blobs, not
    +
    69 * `Native_handle`s.
    +
    70 *
    +
    71 * @todo In C++20, if/when we upgrade to that, Native_handle_sender (and other such doc-only classes) can become an
    +
    72 * actual concept formally implemented by class(es) that, today, implement it via the "honor system."
    +
    73 * Currently it is a class `#ifdef`-ed out from actual compilation but still participating in doc generation.
    +
    74 * Note that Doxygen (current version as of this writing: 1.9.3) claims to support doc generation from formal
    +
    75 * C++20 concepts.
    +
    76 *
    +
    77 * ### Rationale: Why is send_native_handle() not asynchronous? ###
    +
    78 * send_native_handle(), as noted in its doc header (and similarly Blob_sender::send_blob()) has 2 key properties:
    +
    79 * - It will *never* return would-block despite *always* being non-blocking.
    +
    80 * - It takes no completion handler; and it returns pipe-hosing errors synchronously via an out-arg or
    +
    81 * exception.
    +
    82 * - async_end_sending() does take a completion handler.
    +
    83 *
    +
    84 * That is, it is "somehow" both non-blocking/synchronous -- yet requires no would-block contingency on the user's
    +
    85 * part. Magical! How can this possibly work? After all we know that all known low-level transports will yield
    +
    86 * would-block eventually (as of this writing -- Unix domain sockets, POSIX MQs, bipc SHM-based MQs), if the
    +
    87 * opposing side is not popping data off the pipe. Yet, as we look at the opposing Native_handle_receiver concept
    +
    88 * we see that it makes no requirement on its impls to pop everything off the low-level transport in-pipe as soon
    +
    89 * as it arrives. (In actual fact all existing impls in Flow-IPC refuse to do any such thing.)
    +
    90 *
    +
    91 * Naturally the only answer as to how it can work is: Any given Native_handle_sender (and native Blob_sender) impl
    +
    92 * shall be ready to encounter would-block internally; if this occurs it will need to make a copy of the offending
    +
    93 * message (the meta-blob part specifically included -- that's the part that involves significant copying),
    +
    94 * enqueue it internally -- and keep enqueuing any further send_native_handle()d messages until the would-block
    +
    95 * clears, and the queue is eventually emptied.
    +
    96 *
    +
    97 * Fair enough: But isn't this a performance hazard? Answer: yes but only in a necessary way. We reached this
    +
    98 * decision after considering the entire system end-to-end:
    +
    99 * -# user prepares message blob B and tells `Native_handle_sender` S to send B;
    +
    100 * -# S tells low-level transport (possibly kernel) to accept B;
    +
    101 * -# `Native_handle_receiver` R pops B from low-level transport;
    +
    102 * -# user tells R it wanst to accept B, and R does give the latter to the user.
    +
    103 *
    +
    104 * It was a no-go to have Flow-IPC be in charge of allocating either-end buffer for B on the user's behalf:
    +
    105 * the user may want to user their own allocator, or the stack, or ??? -- possibly with zero-copy and prefix/postfix
    +
    106 * data nearby. The user buffer has to be ready, and S and R need to work with the memory areas provided by the
    +
    107 * user.
    +
    108 *
    +
    109 * Given all that, *one* or more of the following "people" has to be ready to keep B, or a copy of B, around, until
    +
    110 * the whole thing (1-4) has gone through: the sending user (1 above), S (2 above), or R (3 above). (If
    +
    111 * the receiving user (4 above) is always receiving things ASAP, without that process being processor-pegged or
    +
    112 * something, then it won't be a problem: no copying is necessary, except in step 2 when B is copied into
    +
    113 * the low-level process. Indeed that should be the case usually; we are discussing what to do *if* something goes
    +
    114 * wrong, or the receivier application is mis-coded, or who knows -- the receiver just isn't quick enough.)
    +
    115 *
    +
    116 * The answer, as already noted: *One* or more of 1, 2, 3 has to make a copy of B long enough until 4 has received it.
    +
    117 * At that point, in terms of overall performance, it *which* one of 1, 2, 3 it should be. Upon deliberating
    +
    118 * a few options occurred, but it seemed clear enough that 1 (original user) should not be the done, if it can be
    +
    119 * helped. IPC is not networking; as an end user I expect sending an out-message to work synchronously. Making
    +
    120 * me worry about a completion handler complicates the outgoing-direction API hugely -- and not in a way that
    +
    121 * makes the incoming-direction API any simpler, since that one always has to be ready for would-block
    +
    122 * (i.e., no in-messages immediately ready -- an async-receive API is required).
    +
    123 *
    +
    124 * So that left 2 or 3. I (ygoldfel) simply made the decision that one has to be chosen, and of those 2 is earlier
    +
    125 * and (internally for the concept implementer, also me at the time) more straightforward. If 3 were always
    +
    126 * reading items out of the low-level transport -- even when the user was not invoking `async_receive_*()` --
    +
    127 * then it would have to at least sometimes make copies of incoming data before the user chose to pop them out.
    +
    128 * By contrast, queueing it -- only on would-block -- in 2 would effectively make it a last-resort activity, as
    +
    129 * it should be.
    +
    130 *
    +
    131 * To summarize: Perfect opposing-receiver behavior cannot be guaranteed, and the low-level transport will eventually
    +
    132 * have a limit as to how much data it can buffer => in that case some entity must make a copy of the overflowing data
    +
    133 * => we want to make life easier for end user, so that entity should not be them => it must be either
    +
    134 * the `*_sender` or `*_receiver` => we chose `*_sender`, because it is safer and easier and faster and a last resort.
    +
    135 *
    +
    136 * One arguable drawback of this API design is that the Native_handle_sender (and Blob_sender) user won't be
    +
    137 * informed of an out-pipe-hosing error quite as soon as that object itself would know of it -- in some (rare)
    +
    138 * cases. I.e., if some data are queued up during would-block, and the user has stopped doing `send_*()`
    +
    139 * (as far as she is concerned, they're all working fine and have succeeded), and some timer later
    +
    140 * `*this` determines (in the background now) that the transport is hosed, the user would only find out about it
    +
    141 * upon the next `send_*()` call (it would *then* return the `Error_code` immediately), if any, or via
    +
    142 * async_end_sending(). Is this really a problem? Answer: Just... no. Exercise in reasoning this out (granted
    +
    143 * it is *somewhat* subjective) left to the reader. (Note we *could* supply some kind of out-of-band
    +
    144 * on-any-send-error API, and we considered this. It just was not worth it: inelegant, annoying. async_end_sending()
    +
    145 * with its completion handler is well sufficient.)
    +
    146 *
    +
    147 * It should be noted that this decision to make send_native_handle() synchronous/non-blocking/never-would-blocking
    +
    148 * has percolated through much of ipc::transport and even ipc::session: all our impls; Blob_sender and all its
    +
    149 * impls; Channel; and quite significantly struc::Channel. You'll note struc::Channel::send() is
    +
    150 * also synchronous/non-blocking/never-would-blocking, and even its implementation at the stage of actually
    +
    151 * sending binary data via Native_handle_sender/Blob_sender is quite straightforward. In Flow-IPC a
    +
    152 * `send*()` "just works."
    +
    153 *
    +
    154 * @todo Comparing Blob_sender::send_blob_max_size() (and similar checks in that family of concepts) to test
    +
    155 * whether the object is in PEER state is easy enough, but perhaps we can have a utility that would more
    +
    156 * expressively describe this check: `in_peer_state()` free function or something? It can still use the same
    +
    157 * technique internally.
    +
    158 */
    + +
    160{
    +
    161public:
    +
    162 // Constants.
    +
    163
    +
    164 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_receiver`'s.
    + +
    166
    +
    167 // Constructors/destructor.
    +
    168
    +
    169 /**
    +
    170 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state. In this state,
    +
    171 * all transmission-related methods (e.g., send_native_handle()) shall return `false` and otherwise no-op
    +
    172 * (aside from possible logging).
    +
    173 *
    +
    174 * This ctor is informally intended for the following uses:
    +
    175 * - A moved-from Native_handle_sender (i.e., the `src` arg for move-ctor and move-assignment operator)
    +
    176 * becomes as-if defaulted-constructed.
    +
    177 * - A target Native_handle_sender for a factory-like method (such as Native_socket_stream_acceptor::async_accept())
    +
    178 * shall typically be default-cted by the callin guse. (E.g.: Native_socket_stream_acceptor shall asynchronously
    +
    179 * move-assign a logger-apointed, nicely-nicknamed into that target `*this`, typically default-cted.)
    +
    180 *
    +
    181 * ### Informal corollary -- ctor that begins in PEER state ###
    +
    182 * Any functioning Native_handle_sender shall need at least one ctor that starts `*this` directly in PEER state.
    +
    183 * In that state the transmission-related methods (e.g., send_native_handle()) shall *not* return `false` and
    +
    184 * will in fact attempt transmission. However the form and function of such ctors is entirely dependent on
    +
    185 * the nature of the low-level transmission medium being encapsulated and is hence *intentionally* not a part
    +
    186 * of the concept. That said there is the `sync_io`-core-adopting ctor as well which *is* part of the concept.
    +
    187 *
    +
    188 * ### Informal corollary -- NULL-state ctors with 1+ args ###
    +
    189 * Other, 1+ arg, ctors that similarly create a NULL-state peer object are allowed/encouraged
    +
    190 * where relevant. In particular one taking a `Logger*` and a `nickname` string -- so as to subsequently enter a
    +
    191 * connecting phase via an `*_connect()` method, on the way to PEER state -- is reasonable.
    +
    192 * However this is not a formal part of this concept and is arguably not a general behavior.
    +
    193 * Such a ctor is informally intended for the following use at least:
    +
    194 * - One creates a Native_handle_sender that is `Logger`-appointed and nicely-`nickname`d; then one calls
    +
    195 * `*_connect()` on it in order to move it to a connecting phase and, hopefully, PEER state in that order.
    +
    196 * It will retain the logger and nickname (or whatever) throughout.
    +
    197 */
    + +
    199
    +
    200 /**
    +
    201 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    +
    202 * That core must be as-if-just-cted (having performed no work and not been configured via `.start_*_ops()`).
    +
    203 * That core object becomes as-if default-cted (therefore in NULL state).
    +
    204 *
    +
    205 * @param sync_io_core_in_peer_state_moved
    +
    206 * See above.
    +
    207 */
    +
    208 Native_handle_sender(sync_io::Native_handle_sender&& sync_io_core_in_peer_state_moved);
    +
    209
    +
    210 /**
    +
    211 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    +
    212 *
    +
    213 * @param src
    +
    214 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    215 */
    + +
    217
    +
    218 /// Disallow copying.
    + +
    220
    +
    221 /**
    +
    222 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
    +
    223 * still active) and cancels any pending completion handlers by invoking them ASAP with
    +
    224 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    +
    225 * As of this writing these are the completion handlers that would therefore be called:
    +
    226 * - The handler passed to async_end_sending(), if it was not `.empty()` and has not yet been invoked.
    +
    227 * Since it is not valid to call async_end_sending() more than once, there is at most 1 of these.
    +
    228 *
    +
    229 * The pending completion handler will be called from an unspecified thread that is not the calling thread.
    +
    230 * Any associated captured state for that handler will be freed shortly after the handler returns.
    +
    231 *
    +
    232 * We informally but very strongly recommend that your completion handler immediately return if the `Error_code`
    +
    233 * passed to it is `error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER`. This is similar to what one should
    +
    234 * do when using boost.asio and receiving the conceptually identical `operation_aborted` error code to an
    +
    235 * `async_...()` completion handler. In both cases, this condition means, "we have decided to shut this thing down,
    +
    236 * so the completion handlers are simply being informed of this."
    +
    237 *
    +
    238 * In NULL state the dtor shall no-op.
    +
    239 *
    +
    240 * ### Thread safety ###
    +
    241 * Same as for the transmission methods. *Plus* it is not safe to call this from within a completion handler supplied
    +
    242 * to one of those methods on the same `*this`. An implication of the latter is as follows:
    +
    243 *
    +
    244 * Any user source code line that nullifies a `Ptr` (`shared_ptr`) handle to `*this` should be seen as potentially
    +
    245 * *synchoronously* invoking this dtor. (By nullification we mean `.reset()` and anything else that makes the
    +
    246 * `Ptr` null. For example destroying a `vector<Ptr>` that contains a `Ptr` pointing to `*this` = nullification.)
    +
    247 * Therefore, if a nullification statement can possibly make the ref-count reach 0, then the user must zealously
    +
    248 * protect that statement from running concurrently with another send/receive API call on `*this`. That is to say,
    +
    249 * informally: When ensuring thread safety with respect to concurrent access to a Native_handle_sender, don't forget
    +
    250 * that the destructor also is a write-type of access, and that nullifying a `Ptr` handle to it can synchronously
    +
    251 * invoke it.
    +
    252 *
    +
    253 * @see Native_handle_receiver::~Native_handle_receiver(): sister concept with essentially equal requirements.
    +
    254 * @see Native_socket_stream::~Native_socket_stream(): implements concept (also implements just-mentioned sister
    +
    255 * concept).
    +
    256 */
    + +
    258
    +
    259 // Methods.
    +
    260
    +
    261 /**
    +
    262 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    +
    263 * No-op if `&src == this`.
    +
    264 *
    +
    265 * @see ~Native_handle_sender().
    +
    266 *
    +
    267 * @param src
    +
    268 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    269 * @return `*this`.
    +
    270 */
    + +
    272
    +
    273 /// Disallow copying.
    + +
    275
    +
    276 /**
    +
    277 * In PEER state: Returns max `meta_blob.size()` such that send_native_handle() shall not fail due to too-long
    +
    278 * payload with error::Code::S_INVALID_ARGUMENT. Always the same value once in PEER state. The opposing
    +
    279 * Blob_receiver::receive_meta_blob_max_size() shall return the same value (in the opposing object potentially
    +
    280 * in a different process).
    +
    281 *
    +
    282 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    +
    283 * a positive value.
    +
    284 *
    +
    285 * @return See above.
    +
    286 */
    + +
    288
    +
    289 /**
    +
    290 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order, to the opposing peer;
    +
    291 * the message consists of the provided native handle (if supplied); or the provided binary blob (if supplied);
    +
    292 * or both (if both supplied). The opposing peer's paired Native_handle_receiver shall receive it reliably and
    +
    293 * in-order via Native_handle_receiver::async_receive_native_handle().
    +
    294 *
    +
    295 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    +
    296 * instead and otherwise no-ops (logging aside).
    +
    297 *
    +
    298 * Providing neither a handle nor a blob results in undefined behavior (assertion may trip).
    +
    299 * To *not* supply a handle, provide object with `.null() == true`. To *not* supply a blob, provide
    +
    300 * a buffer with `.size() == 0`.
    +
    301 *
    +
    302 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
    +
    303 * If a blob is provided, it need only be valid until this method returns. The implementation shall, informally,
    +
    304 * strive to *not* save a copy of the blob (except into the low-level transport mechanism); but it is *allowed* to
    +
    305 * save it if required, such as if the low-level transport mechanism encounteres a would-block condition.
    +
    306 *
    +
    307 * This means, to the user, that this method is *both* non-blocking *and* synchronous *and* it must not
    +
    308 * refuse to send and return any conceptual would-block error (unlike, say, with a typical networked TCP socket API).
    +
    309 * Informally, the implementation must deal with any (typically quite rare) internal low-level would-block condition
    +
    310 * internally.
    +
    311 *
    +
    312 * However! Suppose send_native_handle() returns without error. This concept does *not* guarantee the message has
    +
    313 * been passed to the low-level transport at *this* point in time (informally it shall strive to make that
    +
    314 * happen in most cases however). A low-level would-block condition may cause it to be deferred. If one
    +
    315 * invokes ~Native_handle_sender() (dtor), the message may never be sent.
    +
    316 *
    +
    317 * However (part II)! It *is* guaranteed to have been passed to the transport once `*end_sending()`
    +
    318 * has been invoked, *and* its `on_done_func()` (if any) callback has been called. Therefore the expected use
    +
    319 * pattern is as follows:
    +
    320 * - Obtain a connected `Native_handle_sender` via factory.
    +
    321 * - Invoke send_native_handle() synchronously, hopefully without error.
    +
    322 * - (Repeat as needed for more such messages.)
    +
    323 * - Invoke `async_end_sending(F)` or `end_sending()` (to send graceful-close).
    +
    324 * - In `F()` destroy the `Native_handle_sender` (its dtor is invoked).
    +
    325 * - `F()` is invoked only once all queued messages, and the graceful-close, have been sent.
    +
    326 *
    +
    327 * ### Error semantics ###
    +
    328 * Firstly: See `flow::Error_code` docs for error reporting semantics (including the exception/code dichotomy).
    +
    329 *
    +
    330 * Secondly: If the generated #Error_code is error::Code::S_INVALID_ARGUMENT:
    +
    331 * - This refers to an invalid argument to *this* method invocation. This does *not* hose the pipe:
    +
    332 * further sends, etc., may be attempted with reasonable hope they will succeed.
    +
    333 * - send_meta_blob_max_size() is the limit for `meta_blob.size()`. Exceeding it leads to `S_INVALID_ARGUMENT`.
    +
    334 * - This interacts with the opposing Native_handle_receiver::async_receive_native_handle() in a subtle
    +
    335 * way. See "Blob underflow semantics" in that class concept's doc header.
    +
    336 * - At the impl's discretion, other conditions *may* lead to `S_INVALID_ARGUMENT`. If so they must
    +
    337 * be documented.
    +
    338 *
    +
    339 * Thirdly: All other non-success `Error_code`s generated should indicate the pipe is now indeed hosed; the user
    +
    340 * can count on the pipe being unusable from that point on. (It is recommended they cease to use the pipe
    +
    341 * and invoke the destructor to free resources.) If such a non-success code is emitted, the same one shall be emitted
    +
    342 * by all further send_native_handle() and async_end_sending() on `*this`.
    +
    343 *
    +
    344 * In particular error::Code::S_SENDS_FINISHED_CANNOT_SEND shall indicate that *this* method invocation
    +
    345 * occurred after invoking `*end_sending()` earlier.
    +
    346 *
    +
    347 * No would-block-like error condition shall be emitted.
    +
    348 *
    +
    349 * Lastly: The implementation is allowed to return a non-`INVALID_ARGUMENT` #Error_code in *this* invocation even
    +
    350 * though the true cause is a *previous* invocation of send_native_handle().
    +
    351 * Informally this may occur (probably in rare circumstances) if internally the handling of a previous
    +
    352 * call had to be deferred due to a low-level would-block condition; in that case the resulting problem is to be
    +
    353 * reported opportunistically with the next call. This allows for the non-blocking/synchronous semantics without
    +
    354 * the need to make send_native_handle() asynchronous.
    +
    355 *
    +
    356 * ### Thread safety ###
    +
    357 * You may call this from any thread. It is *not* required to be safe to call concurrently with
    +
    358 * any Native_handle_sender API, including this one and the destructor, invoked on `*this`.
    +
    359 *
    +
    360 * @param hndl_or_null
    +
    361 * A native handle (a/k/a FD) to send; or none if `hndl_or_null.null() == true`.
    +
    362 * @param meta_blob
    +
    363 * A binary blob to send; or none if `meta_blob.size() == 0`.
    +
    364 * @param err_code
    +
    365 * See above.
    +
    366 * @return `false` if `*this` is not in PEER (connected, transmitting) state;
    +
    367 * otherwise `true`.
    +
    368 */
    +
    369 bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const& meta_blob, Error_code* err_code = 0);
    +
    370
    +
    371 /**
    +
    372 * Equivalent to send_native_handle() but sends a graceful-close message instead of the usual payload; the opposing
    +
    373 * peer's Native_handle_receiver shall receive it reliably and in-order via
    +
    374 * Native_handle_receiver::async_receive_native_handle() in the form of
    +
    375 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE. If invoked after already invoking
    +
    376 * `*end_sending()`, the method shall no-op and return `false` and neither an exception nor truthy
    +
    377 * `*err_code`. Otherwise it shall return `true` -- but potentially emit a truthy #Error_code (if an error is
    +
    378 * detected).
    +
    379 *
    +
    380 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
    +
    381 * `false` immediately instead and otherwise no-ops (logging aside).
    +
    382 *
    +
    383 * Informally one should think of async_end_sending() as just another message, which is queued after
    +
    384 * preceding ones; but: it is the *last* message to be queued by definition. It's like an EOF or a TCP-FIN.
    +
    385 *
    +
    386 * ### Synchronicity/blockingness guarantees ###
    +
    387 * async_end_sending() is, unlike send_native_handle(), formally asynchronous. The reason for this,
    +
    388 * and the expected use pattern of async_end_sending() in the context of preceding send_native_handle()
    +
    389 * calls, is found in the doc header for Native_handle_sender::send_native_handle(). We omit further discussion here.
    +
    390 *
    +
    391 * ### Error semantics ###
    +
    392 * This section discusses the case where `true` is returned, meaning `*end_sending()` had not already
    +
    393 * been called.
    +
    394 *
    +
    395 * An #Error_code is generated and passed as the sole arg to `on_done_func()`.
    +
    396 * A falsy one indicates success. A truthy one indicates failure; but in particular:
    +
    397 * - error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER (destructor called, canceling all pending ops;
    +
    398 * spiritually identical to `boost::asio::error::operation_aborted`);
    +
    399 * - other arbitrary codes are possible, as with send_native_handle().
    +
    400 *
    +
    401 * Reminder: By the nature of `on_done_func()`, the pipe is finished regardless of whether it receives a
    +
    402 * success or non-success #Error_code.
    +
    403 *
    +
    404 * ### Thread safety ###
    +
    405 * The notes for send_native_handle() apply.
    +
    406 *
    +
    407 * @internal
    +
    408 * The semantic re. calling `*end_sending()` after already having called it and having that exclusively
    +
    409 * return `false` and do nothing was a judgment call. As of this writing there's a long-ish comment at the top of
    +
    410 * of `"sync_io::Native_socket_stream::Impl::*end_sending()"`" body discussing why I (ygoldfel) went that way.
    +
    411 * @endinternal
    +
    412 *
    +
    413 * @tparam Task_err
    +
    414 * A functor type with signature identical to `flow::async::Task_asio_err`.
    +
    415 * @param on_done_func
    +
    416 * See above. This shall be invoked from an unspecified thread that is not the calling thread.
    +
    417 * @return `false` if and only if *either* `*this` is not in PEER (connected, transmitting) state, *or*
    +
    418 * `*end_sending()` has already been called before (so this is a no-op, in both cases).
    +
    419 * Otherwise `true`.
    +
    420 */
    +
    421 template<typename Task_err>
    +
    422 bool async_end_sending(Task_err&& on_done_func);
    +
    423
    +
    424 /**
    +
    425 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
    +
    426 *
    +
    427 * Informally: If one uses this overload, it is impossible to guarantee everything queued has actually been sent,
    +
    428 * as `on_done_func()` is the only mechanism for this. Most likely this is only useful for test or proof-of-concept
    +
    429 * code; production-level robustness typically requires one to ensure everything queued has been sent. Alternatively
    +
    430 * the user's application-level protocol may already guarantee the message exchange has completed (e.g., by receiving
    +
    431 * an acknowledgment message of some sort) -- but in that case one can simply not call `*end_sending()`
    +
    432 * at all.
    +
    433 *
    +
    434 * @return Same as in async_end_sending().
    +
    435 */
    + +
    437
    +
    438 /**
    +
    439 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
    +
    440 * are ignored except that they reset any idle timer as enabled via Native_handle_receiver::idle_timer_run()
    +
    441 * (or similar). Auto-pings, at a minimum, shall be sent (subject to internal low-level transport would-block
    +
    442 * conditions) at the following times:
    +
    443 * - as soon as possible after a successful auto_ping() call; and subsequently:
    +
    444 * - at such times as to ensure that the time between 2 adjacent sends of *any* message is no more than
    +
    445 * `period`, until `*end_sending()` (if any) or error (if any).
    +
    446 * To clarify the 2nd point: If user messages are being sent already, an auto-ping may not be required or may be
    +
    447 * delayed until the last-sent message plus `period`). The implementation shall strive not to wastefully
    +
    448 * add auto-ping traffic unnecessary to this goal but is not *required* to do so. However, per the 1st point,
    +
    449 * an auto-ping shall be sent near auto_ping() time to establish a baseline.
    +
    450 *
    +
    451 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    +
    452 * instead and otherwise no-ops (logging aside). If auto_ping() has already been called successfuly,
    +
    453 * subsequently it will return `false` and no-op (logging aside). If `*end_sending()` has been called succesfully,
    +
    454 * auto_ping() will return `false` and no-op (logging side).
    +
    455 *
    +
    456 * ### Behavior past `*end_sending()` ###
    +
    457 * As noted: auto_ping() returns `false` and no-ops if invoked after successful `*end_sending()`.
    +
    458 * Rationale: If `*end_sending()` has been called, then the receiver shall (assuming no other error) receive
    +
    459 * graceful-close (and hose the in-pipe as a result) as soon as possible, or it has already received it
    +
    460 * (and hosed the pipe). Therefore any potential "further" hosing of the pipe due to idle timer would be redundant
    +
    461 * and ignored anyway given the nature of the Native_handle_receiver (and similar) API.
    +
    462 *
    +
    463 * ### Thread safety ###
    +
    464 * The notes for send_native_handle() apply.
    +
    465 *
    +
    466 * @param period
    +
    467 * Pinging occurs so as to cause the opposing receiver to receive *a* message (whether auto-ping or user
    +
    468 * message) at least this frequently, subject to limitations of the low-level transport.
    +
    469 * The optional default is chosen by the impl to most reasonably work with the opposing `idle_timer_run()`
    +
    470 * to detect a zombified/overloaded peer.
    +
    471 * @return `false` if `*this` is not in PEER (connected, transmitting) state, or if already called successfully
    +
    472 * in `PEER` state, or if `*end_sending()` was called successfully in `PEER` state; otherwise `true`.
    +
    473 */
    +
    474 bool auto_ping(util::Fine_duration period = default_value);
    +
    475}; // class Native_handle_sender
    +
    476
    +
    477/**
    +
    478 * A documentation-only *concept* defining the behavior of an object capable of reliably/in-order *receiving* of
    +
    479 * discrete messages, each containing a native handle, a binary blob, or both. This is paired with
    +
    480 * the Native_handle_sender concept which defines sending of such messages.
    +
    481 *
    +
    482 * Concept contents
    +
    483 * ----------------
    +
    484 * The concept defines the following behaviors/requirements.
    +
    485 * - The object has at least 2 states, NULL and PEER. See notes in Native_handle_sender w/r/t this;
    +
    486 * they apply equally here.
    +
    487 * - The (incoming) transmission-of-messages methods, including reception of graceful-close message and
    +
    488 * cutting off any further receiving. See their doc headers.
    +
    489 * - Behavior when the destructor is invoked. See ~Native_handle_receiver() doc header.
    +
    490 * - Default ctor. See notes in Native_handle_sender w/r/t this; they apply equally here.
    +
    491 * - `sync_io`-core adopting ctor. Same deal.
    +
    492 * - Move ctor, move assigment operator. Same deal.
    +
    493 *
    +
    494 * The concept (intentionally) does *not* define the following behaviors:
    +
    495 * - How to create a Native_handle_receiver, except the default, `sync_io`-core-adopting, and move ctors.
    +
    496 * Notes for Native_handle_sender apply equally here.
    +
    497 *
    +
    498 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
    +
    499 * Native_handle_sender) -- using the Unix domain socket transport.
    +
    500 * @see Channel, a pipe-composing class template that potentially implements this concept.
    +
    501 * @see Blob_receiver: a degenerate version of the present concept: capable of transmitting only blobs, not
    +
    502 * `Native_handle`s.
    +
    503 *
    +
    504 * Blob underflow semantics
    +
    505 * ------------------------
    +
    506 * This potentially important subtlety is regarding the interplay between
    +
    507 * Native_handle_receiver::S_META_BLOB_UNDERFLOW_ALLOWED, async_receive_native_handle() `meta_blob.size()`,
    +
    508 * and Native_handle_sender::send_native_handle() `meta_blob.size()`.
    +
    509 *
    +
    510 * Consider a `*this` named `R` and an opposing `*_sender` named `S`. Note that `R.receive_meta_blob_max_size()
    +
    511 * == S.send_meta_blob_max_size()`; call this limit `L`. `L` shall always be in practice small enough to where
    +
    512 * allocating a buffer of this size as the receive target is reasonable; hence kilobytes at most, not megabytes.
    +
    513 * (In some cases, such as with `Blob_stream_mq_*`, it is configurable at runtime. In others, as with
    +
    514 * Native_socket_stream, it is a constant: sync_io::Native_socket_stream::S_MAX_META_BLOB_LENGTH.)
    +
    515 *
    +
    516 * As noted in that concept's docs, naturally, `S.send_native_handle()` shall yield immediate, non-pipe-hosing
    +
    517 * error::Code::S_INVALID_ARGUMENT, if `meta_blob.size() > L`. This is called overflow and is always enforced.
    +
    518 *
    +
    519 * Now consider `N = meta_blob.size()` for `R.async_receive_native_handle()`. This is the size of the target
    +
    520 * blob: how many bytes it *can* receive. How `L` is enforced by `R` is not uniform among this concept's impls:
    +
    521 * rather it depends on the compile-time constant Native_handle_receiver::S_META_BLOB_UNDERFLOW_ALLOWED.
    +
    522 *
    +
    523 * ### Semantics: `META_BLOB_UNDERFLOW_ALLOWED` is `false` ###
    +
    524 * Suppose it is `false` (as is the case for Blob_stream_mq_receiver). In that case `N < L` is *disallowed*:
    +
    525 * `R.async_receive_native_handle()` *shall always* fail with non-pipe-hosing error::Code::S_INVALID_ARGUMENT
    +
    526 * for that reason. Certainly `N` cannot be zero -- not even if the incoming message is expected to
    +
    527 * contain only a non-`.null() Native_handle`.
    +
    528 *
    +
    529 * @note Formally it's as written. Informally the rationale for allowing this restriction is that some low-level
    +
    530 * transports have it; and working around it would probably affect performance and is unnatural.
    +
    531 * In particular Persistent_mq_handle::try_receive() (MQ receive) shall immediately fail if a target buffer
    +
    532 * is supplied smaller than Persistent_mq_handle::max_msg_size(). For both POSIX (`man mq_receive`) and
    +
    533 * bipc (`boost::interprocess::message_queue::try_receive()` docs and source code) it is disallowed at the
    +
    534 * low-level API level.
    +
    535 *
    +
    536 * Thus since `N >= L` is guaranteed before any actual receipt attempt is made, it is *impossible* for
    +
    537 * a message to arrive such that its meta-blob's size would overflow the target blob (buffer) (of size `N`).
    +
    538 * Therefore error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE shall not be emitted.
    +
    539 *
    +
    540 * ### Semantics: `META_BLOB_UNDERFLOW_ALLOWED` is `true` ###
    +
    541 * Suppose it is `true` (as is the case for Native_socket_stream). In that case `N < L` is allowed, in the sense
    +
    542 * that `R.async_receive_native_handle()` *shall not* fail with non-pipe-hosing error::Code::S_INVALID_ARGUMENT
    +
    543 * for that reason. In particular, in that case, `N` can even be zero: this implies the incoming message *must*
    +
    544 * contain a non-`.null() Native_handle` (it is not allowed to send a message with no content at all).
    +
    545 * (In the case of degenerate concept Blob_sender, `N` must exceed zero, as it cannot transmit anything but
    +
    546 * blobs.)
    +
    547 *
    +
    548 * However suppose a message has arrived, and its meta-blob's size -- which cannot exceed `L` -- is larger than
    +
    549 * `N`. I.e., it would *underflow* the user-supplied target buffer (blob). In that case:
    +
    550 * - async_receive_native_handle() shall emit error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE.
    +
    551 * - This error shall be pipe-hosing (further receive attempts will yield the same error).
    +
    552 *
    +
    553 * Informal tips: Any blob-size error can be completely avoided by always supplying target blob with `N == L`.
    +
    554 * (`N > L` will also work but may be considered wasteful, all else being equal.) In addition this tactic will
    +
    555 * ensure the code will generically work with a different Native_handle_receiver impl for which
    +
    556 * `S_META_BLOB_UNDERFLOW_ALLOWED == false`. Alternatively, the user protocol may be such that you simply know
    +
    557 * that `S` will never send messages beyond some limit (smaller than `L`), perhaps for particular messages.
    +
    558 * In that case `N` can be set to this smaller-than-`L` value. However -- such code will fail
    +
    559 * if the concept impl is later to switched to one with `S_META_BLOB_UNDERFLOW_ALLOWED == true`. This may or
    +
    560 * may not be an issue depending on your future dev plans.
    +
    561 *
    +
    562 * ### Summary ###
    +
    563 * This dichotomy of possible semantics is a conscious choice. Mode `false` is a necessity: some low-level transports
    +
    564 * enforce it, period. Mode `true` is to support a possible algorithmic desire to allocate smaller-than-`L`
    +
    565 * target buffers. The problem is some low-level transports allow this; but others don't. We did not want to
    +
    566 * impose one type's limitations on users of the other type. Therefore, if your code is agnostic to the type
    +
    567 * of transport, then code as-if `S_META_BLOB_UNDERFLOW_ALLOWED == false`. Otherwise you may code otherwise.
    +
    568 *
    +
    569 * Rationale: Why no `end_receiving()`, given opposing concept has `*end_sending()`?
    +
    570 * ---------------------------------------------------------------------------------
    +
    571 * An early version of Native_handle_receiver and Blob_receiver did have an `end_receiving()`.
    +
    572 * The idea was it would have 2 effects (plus 1 bonus):
    +
    573 * -# Any ongoing `async_receive_*()`s would be interrupted with in-pipe-hosing error
    +
    574 * error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE -- the same one as when receing a graceful-close
    +
    575 * from opposing `*end_sending()`.
    +
    576 * -# There would be no further reading from the low-level transport for any reason.
    +
    577 * -# There was also the *thought*, but not the action, that an impl could inform the *opposing sender* of the
    +
    578 * pipe being closed by the reader. This would be conceptually similar to SIGPIPE in POSIX. In practice, of
    +
    579 * the available low-level transports as of this writing, only Native_socket_stream could actually implement it,
    +
    580 * as the otherwise-full-duplex independent pipes do live in this same peer (Unix domain socket), so the out-pipe
    +
    581 * could be used to inform the other guy that *his* out-pipe (our in-pipe) is now pointless. `Blob_stream_mq_*`
    +
    582 * are fully independent, operating on separate MQ kernel objects, so it was not realistically possible in
    +
    583 * that case.
    +
    584 *
    +
    585 * In order: (1) is fairly dubious: the local user should know when they've stopped receiving and don't need to
    +
    586 * use this mechanism to inform themselves. (3), as stated, sounded like a possible future improvement, but time
    +
    587 * told us it was not going to work out: if only a 2-pipe transport can do it in any case, organizing a concept
    +
    588 * around such a thing is just complicated. If necessary the user can (and we think likely will) just arrange
    +
    589 * their own protocol. So that leaves (2).
    +
    590 *
    +
    591 * To begin with -- in reality user protocols tend to be designed to not need such measures. If the reader is no
    +
    592 * longer interested, writer will probably know that. This is not networking after all: it is IPC.
    +
    593 * That aside, though, it only makes sense in any case if an impl *chooses* to greedily cache all low-level
    +
    594 * in-traffic in user RAM, even while no `async_receive_*()`s are pending to read it. Early on we actually did do
    +
    595 * that; but with the move to `sync_io`-pattern cores, and after contemplating
    +
    596 * "Rationale: Why is send-native-handle not asynchronous?" (Native_handle_sender concept doc header),
    +
    597 * we got rid of this waste of compute, letting unwanted in-traffic accumulate within a sender peer object
    +
    598 * (Native_handle_sender, Blob_sender) only. So in practice:
    +
    599 *
    +
    600 * If `end_receiving()` does not signal anything of value ((1) and (3)), and does not actually prevent any
    +
    601 * low-level reading that would otherwise occur, then it is a pointless complication. So that is why we got rid of it.
    +
    602 */
    + +
    604{
    +
    605public:
    +
    606 // Constants.
    +
    607
    +
    608 /// Shared_name relative-folder fragment (no separators) identifying this resource type. Equals `_sender`'s.
    + +
    610
    +
    611 /**
    +
    612 * If `false` then `meta_blob.size() > receive_meta_blob_max_size()` in PEER-state async_receive_native_handle()
    +
    613 * shall yield non-pipe-hosing error::Code::INVALID_ARGUMENT, and it shall never yield
    +
    614 * pipe-hosing error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE; else the latter may occur, while the former
    +
    615 * shall never occur for that reason.
    +
    616 *
    +
    617 * @see "Blob underflow semantics" in class concept doc header.
    +
    618 */
    +
    619 static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED = value;
    +
    620
    +
    621 // Constructors/destructor.
    +
    622
    +
    623 /**
    +
    624 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state. In this state,
    +
    625 * all transmission-related methods (e.g., async_receive_native_handle()) shall return `false` and otherwise no-op
    +
    626 * (aside from possible logging).
    +
    627 *
    +
    628 * All notes from Native_handle_sender() default ctor doc header apply here analogously. They are helpful so
    +
    629 * please read Native_handle_sender() doc header.
    +
    630 */
    + +
    632
    +
    633 /**
    +
    634 * `sync_io`-core-adopting ctor: Creates a peer object in PEER state by subsuming a `sync_io` core in that state.
    +
    635 * That core must be as-if-just-cted (having performed no work and not been configured via `.start_*_ops()`).
    +
    636 * That core object becomes as-if default-cted (therefore in NULL state).
    +
    637 *
    +
    638 * @param sync_io_core_in_peer_state_moved
    +
    639 * See above.
    +
    640 */
    +
    641 Native_handle_receiver(sync_io::Native_handle_receiver&& sync_io_core_in_peer_state_moved);
    +
    642
    +
    643 /**
    +
    644 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
    +
    645 *
    +
    646 * @param src
    +
    647 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    648 */
    + +
    650
    +
    651 /// Disallow copying.
    + +
    653
    +
    654 /**
    +
    655 * Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state, and if it's
    +
    656 * still active) and cancels any pending completion handlers by invoking them ASAP with
    +
    657 * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER.
    +
    658 * As of this writing these are the completion handlers that would therefore be called:
    +
    659 * - Any handler passed to async_receive_native_handle() that has not yet been invoked.
    +
    660 * There can be 0 or more of these.
    +
    661 *
    +
    662 * The pending completion handler(s) (if any) will be called from an unspecified thread that is not the calling
    +
    663 * thread. Any associated captured state for that handler will be freed shortly after the handler returns.
    +
    664 *
    +
    665 * The rest of the notes in ~Native_handle_sender() apply equally here.
    +
    666 *
    +
    667 * @see Native_handle_sender::~Native_handle_sender(): sister concept with essentially equal requirements.
    +
    668 * @see Native_socket_stream::~Native_socket_stream(): implements concept (also implements just-mentioned sister
    +
    669 * concept).
    +
    670 */
    + +
    672
    +
    673 // Methods.
    +
    674
    +
    675 /**
    +
    676 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
    +
    677 * No-op if `&src == this`.
    +
    678 *
    +
    679 * @see ~Native_handle_receiver().
    +
    680 *
    +
    681 * @param src
    +
    682 * Source object. For reasonable uses of `src` after this ctor returns: see default ctor doc header.
    +
    683 * @return `*this`.
    +
    684 */
    + +
    686
    +
    687 /// Disallow copying.
    + +
    689
    +
    690 /**
    +
    691 * In PEER state: Returns min `target_meta_blob.size()` such that (1) async_receive_native_handle() shall not fail
    +
    692 * with error::Code::S_INVALID_ARGUMENT (only if #S_META_BLOB_UNDERFLOW_ALLOWED is `false`; otherwise not relevant),
    +
    693 * and (2) it shall *never* fail with error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE. Please see
    +
    694 * "Blob underflow semantics" for explanation of these semantics.
    +
    695 *
    +
    696 * Always the same value once in PEER state. The opposing
    +
    697 * Blob_sender::send_meta_blob_max_size() shall return the same value (in the opposing object potentially
    +
    698 * in a different process).
    +
    699 *
    +
    700 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns zero; else
    +
    701 * a positive value.
    +
    702 *
    +
    703 * @return See above.
    +
    704 */
    + +
    706
    +
    707 /**
    +
    708 * In PEER state: Asynchronously awaits one discrete message -- as sent by the opposing peer via
    +
    709 * Native_handle_sender::send_native_handle() or `"Native_handle_sender::*end_sending()"` -- and
    +
    710 * receives it into the given target locations, reliably and in-order. The message is, therefore, one of the
    +
    711 * following:
    +
    712 * - A binary blob; a native handle; or both. This is indicated by `on_done_func(Error_code(), N)`.
    +
    713 * The falsy code indicates success; `N <= target_meta_blob.size()` indicates the number of bytes received into
    +
    714 * `target_meta_blob.data()` (zero means no blob was sent in the message). `*target_hndl` is set
    +
    715 * (`target_hndl->null() == true` means no handle was sent in the message).
    +
    716 * - Graceful-close. This is indicated by `on_done_func(error::code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, 0)`;
    +
    717 * neither the target blob nor target native handle are touched.
    +
    718 *
    +
    719 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    +
    720 * instead and otherwise no-ops (logging aside).
    +
    721 *
    +
    722 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
    +
    723 * `*target_hndl` and the area described by `target_meta_blob` must both remain valid until `on_done_func()`
    +
    724 * executes. The method itself shall be non-blocking.
    +
    725 *
    +
    726 * The implementation shall, informally, strive to *not* copy the received blob (if any) into
    +
    727 * `target_meta_blob.data()...` except from the low-level transport mechanism. That is: it shall strive to not
    +
    728 * store the blob data in some internal buffer before ending up in `target_meta_blob.data()...`.
    +
    729 *
    +
    730 * ### Error semantics ###
    +
    731 * An #Error_code is generated and passed as the 1st arg to `on_done_func()`.
    +
    732 * A falsy one indicates success. A truthy one indicates failure; but in particular:
    +
    733 * - error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER (destructor called, canceling all pending ops;
    +
    734 * spiritually identical to `boost::asio::error::operation_aborted`);
    +
    735 * - only if #S_META_BLOB_UNDERFLOW_ALLOWED is `true`:
    +
    736 * - error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE (opposing peer has sent a message with a meta-blob exceeding
    +
    737 * `target_meta_blob.size()` in length; in particular one can give an empty buffer if no meta-blob expected);
    +
    738 * - error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE (peer gracefully closed pipe via `*end_sending()`);
    +
    739 * - error::Code::S_RECEIVER_IDLE_TIMEOUT (idle timeout: see idle_timer_run());
    +
    740 * - other arbitrary codes are possible.
    +
    741 * - No would-block-like error condition shall be emitted.
    +
    742 *
    +
    743 * A non-success on-done invocation means the incoming pipe is hosed. (It is recommended they cease to use the pipe
    +
    744 * and invoke the destructor to free resources.) If such a non-success code is emitted, the same one shall be emitted
    +
    745 * by all further async_receive_native_handle() calls on `*this`. Key exception:
    +
    746 * - error::Code::S_INVALID_ARGUMENT:
    +
    747 * - This refers to an invalid argument to *this* method invocation.
    +
    748 * - If and only if #S_META_BLOB_UNDERFLOW_ALLOWED is `false`: A length floor on the target blob is imposed.
    +
    749 * Hence if `target_meta_blob.size() < receive_meta_blob_max_size()` then `S_INVALID_ARGUMENT` is emitted.
    +
    750 * - This shall *not* hose the pipe. Subsequent async-receives may be attempted with reasonable hope of
    +
    751 * success.
    +
    752 * - At the impl's discretion, other conditions *may* lead to `S_INVALID_ARGUMENT`. If so they must
    +
    753 * be documented.
    +
    754 *
    +
    755 * ### Thread safety ###
    +
    756 * You may call this either from any thread including the unspecified thread running within another call's
    +
    757 * `on_done_func()`. It is *not* required to be safe to call concurrently with any Native_handle_receiver API,
    +
    758 * including this one and the destructor, invoked on `*this`.
    +
    759 *
    +
    760 * @tparam Task_err_sz
    +
    761 * A functor type with signature identical to `flow::async::Task_asio_err_sz`.
    +
    762 * @param target_hndl
    +
    763 * `*target_hndl` shall be set by the time `on_done_func()` is executed with a falsy code. See above.
    +
    764 * @param target_meta_blob
    +
    765 * `target_meta_blob.data()...` shall be written to by the time `on_done_func()` is executed with a falsy
    +
    766 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
    +
    767 * `target_meta_blob.size()`. See above.
    +
    768 * @param on_done_func
    +
    769 * See above. This shall be invoked from an unspecified thread that is not the calling thread.
    +
    770 * @return `false` if `*this` is not in PEER (connected, transmitting) state;
    +
    771 * otherwise `true`.
    +
    772 */
    +
    773 template<typename Task_err_sz>
    + +
    775 const util::Blob_mutable& target_meta_blob,
    +
    776 Task_err_sz&& on_done_func);
    +
    777
    +
    778 /**
    +
    779 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
    +
    780 * the specified time has passed since the last received low-level traffic (or this call, whichever most
    +
    781 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT. The implementation
    +
    782 * shall guarantee the observer idle timeout is at least the provided value but may exceed this value for
    +
    783 * internal reasons, as long as it's by a less than human-perceptible period (roughly speaking -- milliseconds,
    +
    784 * not seconds).
    +
    785 *
    +
    786 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
    +
    787 * instead and otherwise no-ops (logging aside). If idle_timer_run() has already been called successfuly,
    +
    788 * subsequently it will return `false` and no-op (logging aside).
    +
    789 *
    +
    790 * ### Important: Relationship between idle_timer_run() and async_receive_native_handle() ###
    +
    791 * idle_timer_run() is optional: if you have not called it, then the following does not apply. If you *have* called
    +
    792 * it:
    +
    793 *
    +
    794 * It will work usefully if and only if subsequently an async_receive_native_handle() is oustanding at least
    +
    795 * once each `timeout`. Informally this means it's best to immediately issue async_receive_native_handle() --
    +
    796 * unless one is already oustanding -- and then as soon as that completes (sans error) issue at least one more;
    +
    797 * and so on. Why? What are we talking about? Simple: async_receive_native_handle() impl is *not* required
    +
    798 * to read any more data from the low-level transport than is sufficient to satisfy the current
    +
    799 * async_receive_native_handle() deficit. (If it were required to do so, it would've been required to store copies
    +
    800 * of incoming meta-blobs when there's no user-request deficit; we've consciously avoided unnecessary copying.)
    +
    801 * So while there's no async_receive_native_handle() outstanding, `*this` will be considered idle; and once
    +
    802 * that continues long enough for `timeout` to be exceeded, the idle timer will hose the in-pipe.
    +
    803 *
    +
    804 * So: If you plan to use idle_timer_run(), then you need to be ~always async-receiving. Otherwise you'll risk
    +
    805 * hitting idle-timeout, even as the other side diligently sends stuff (`auto_ping()` or otherwise).
    +
    806 *
    +
    807 * ### Error semantics ###
    +
    808 * If and only if the timeout does occur down the line, the aforementioned error will be emitted via
    +
    809 * async_receive_native_handle() (or similar) handler. It shall be treated as the reason to hose the pipe
    +
    810 * (assuming it was not hosed by something else earlier).
    +
    811 *
    +
    812 * ### Thread safety ###
    +
    813 * You may call this either from any thread including the unspecified thread running within another call's
    +
    814 * `on_done_func()`. It is *not* required to be safe to call concurrently with any API, including this one
    +
    815 * and the destructor, invoked on `*this`.
    +
    816 *
    +
    817 * ### Suggested use ###
    +
    818 * Informally: There are roughly two approaches to using idle_timer_run().
    +
    819 *
    +
    820 * Firstly it can be used to gauge the state of the opposing process; if no auto-pings are arriving regularly,
    +
    821 * then the opposing Native_handle_sender (or similar) must be zombified or overloaded. To use it in this
    +
    822 * capacity, typically one must use Native_handle_sender::auto_ping() (or similar) on the opposing side.
    +
    823 * Typically one would then leave `timeout` at its suggested default value.
    +
    824 *
    +
    825 * Secondly it can be used to more generally ensure some application algorithm on the opposing side (presumably
    +
    826 * cooperating with the algorithm on the local side) is sending messages with expected frequency.
    +
    827 * That is, one would not use `auto_ping()` but rather send their own messages in a way that makes sense for
    +
    828 * the applications' algorithm.
    +
    829 *
    +
    830 * @param timeout
    +
    831 * The idle timeout to observe.
    +
    832 * The optional default is chosen by the impl to most reasonably work with the opposing `auto_ping()`
    +
    833 * to detect a zombified/overloaded peer.
    +
    834 * @return `false` if `*this` is not in PEER (connected, transmitting) state, or if already called successfully
    +
    835 * in `PEER` state; otherwise `true`.
    +
    836 */
    +
    837 bool idle_timer_run(util::Fine_duration timeout = default_value);
    +
    838}; // class Native_handle_receiver
    +
    839
    +
    840} // namespace ipc::transport
    +
    A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...
    Native_handle_receiver(Native_handle_receiver &&src)
    Move-constructs from src; src becomes as-if default-cted (therefore in NULL state).
    bool idle_timer_run(util::Fine_duration timeout=default_value)
    In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is,...
    Native_handle_receiver & operator=(const Native_handle_receiver &)=delete
    Disallow copying.
    -
    static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED
    If false then meta_blob.size() > receive_meta_blob_max_size() in PEER-state async_receive_native_hand...
    +
    static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED
    If false then meta_blob.size() > receive_meta_blob_max_size() in PEER-state async_receive_native_hand...
    Native_handle_receiver()
    Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    Native_handle_receiver & operator=(Native_handle_receiver &&src)
    Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    Native_handle_receiver(sync_io::Native_handle_receiver &&sync_io_core_in_peer_state_moved)
    sync_io-core-adopting ctor: Creates a peer object in PEER state by subsuming a sync_io core in that s...
    bool async_receive_native_handle(Native_handle *target_hndl, const util::Blob_mutable &target_meta_blob, Task_err_sz &&on_done_func)
    In PEER state: Asynchronously awaits one discrete message – as sent by the opposing peer via Native_h...
    ~Native_handle_receiver()
    Destroys this peer endpoint which will end the conceptual incoming-direction pipe (in PEER state,...
    size_t receive_meta_blob_max_size() const
    In PEER state: Returns min target_meta_blob.size() such that (1) async_receive_native_handle() shall ...
    Native_handle_receiver(const Native_handle_receiver &)=delete
    Disallow copying.
    -
    A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...
    +
    A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...
    Native_handle_sender(Native_handle_sender &&src)
    Move-constructs from src; src becomes as-if default-cted (therefore in NULL state).
    bool async_end_sending(Task_err &&on_done_func)
    Equivalent to send_native_handle() but sends a graceful-close message instead of the usual payload; t...
    Native_handle_sender(const Native_handle_sender &)=delete
    Disallow copying.
    Native_handle_sender(sync_io::Native_handle_sender &&sync_io_core_in_peer_state_moved)
    sync_io-core-adopting ctor: Creates a peer object in PEER state by subsuming a sync_io core in that s...
    size_t send_meta_blob_max_size() const
    In PEER state: Returns max meta_blob.size() such that send_native_handle() shall not fail due to too-...
    Native_handle_sender & operator=(Native_handle_sender &&src)
    Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type....
    bool auto_ping(util::Fine_duration period=default_value)
    In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level message...
    Native_handle_sender & operator=(const Native_handle_sender &)=delete
    Disallow copying.
    ~Native_handle_sender()
    Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
    bool end_sending()
    Equivalent to async_end_sending(F) wherein F() does nothing.
    Native_handle_sender()
    Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
    bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const &meta_blob, Error_code *err_code=0)
    In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order,...
    -
    A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
    -
    A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
    +
    A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
    +
    A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp.html index ba1a8dc65..5943e70dc 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -97,7 +97,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp_source.html index ad0cadba5..d7de063cb 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -270,20 +270,20 @@
    A process's credentials (PID, UID, GID as of this writing).
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    util::Shared_name Shared_name
    Convenience alias for the commonly used type util::Shared_name.
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp.html index 17f554644..95fac930b 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -101,7 +101,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp_source.html index 4ea05a2d1..c068f5d36 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -974,21 +974,21 @@
    Implements both sync_io::Native_handle_sender and sync_io::Native_handle_receiver concepts by using a...
    A process's credentials (PID, UID, GID as of this writing).
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp.html index 79024d064..d5e5133c8 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -101,7 +101,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp_source.html index 98015b46c..55608fa07 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -334,234 +334,235 @@
    262 * particular. Just re-check that for sanity for now. (This is a bit of future-proofing, so that the problem is
    263 * obvious if porting the code.) */
    264#ifndef FLOW_OS_LINUX
    -
    265# error "Should not have gotten to this line; should have required Linux; the next thing assumes not-Win-<8.1."
    -
    266#endif
    -
    267 // Could store a raw handle too, but this is exactly as fast and adds some logging niceties.
    -
    268 Native_handle native_peer_socket(m_next_peer_socket.release());
    -
    269 assert(!m_next_peer_socket.is_open()); // Non-exhaustive sanity check that it's back in empty/unconnected state.
    -
    270 FLOW_LOG_TRACE("Acceptor [" << *this << "]: "
    -
    271 "Ejected ownership of new incoming peer socket [" << native_peer_socket << "].");
    -
    272
    -
    273 auto new_peer
    -
    274 = boost::movelib::make_unique<Peer>
    -
    275 (get_logger(),
    -
    276 // Nickname is, like, "_pathName_of_this_acceptor=>native_hndl[35]" (as I write this).
    -
    277 ostream_op_string(m_absolute_name.str(), "=>", native_peer_socket),
    -
    278 std::move(native_peer_socket));
    -
    279 // Caution: native_peer_socket is now invalid.
    -
    280 assert(native_peer_socket.null());
    -
    281
    -
    282 // Queue up and handle result.
    -
    283
    -
    284 // As above -- on error we wouldn't have kept trying to accept more.
    -
    285 assert(m_pending_results_q.empty() || (!holds_alternative<Error_code>(m_pending_results_q.back())));
    -
    286
    -
    287 // We are in steady state. Make this one change...
    -
    288 m_pending_results_q.emplace(std::move(new_peer)); // (new_peer may now be hosed.)
    -
    289 // ...and immediately handle it appropriately to get back into steady state.
    - -
    291 } // else if (!sys_err_code)
    -
    292
    -
    293 // Either there was success (!sys_err_code), or a non-fatal error (otherwise). Keep the async chain going.
    -
    294
    -
    295 /* @todo Does it help perf-wise to spin through non-blocking accepts here (in case more incoming peers have been
    -
    296 * queued up by OS) until would-block? I (ygoldfel) have done it in the past when doing TCP/UDP reads, but I never
    -
    297 * really checked whether it's beneficial, and anyway this situation is not really the same (incoming load
    -
    298 * should be much less intense here). */
    -
    299
    -
    300 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Starting the next background accept.");
    -
    301 m_acceptor->async_accept(m_next_peer_socket,
    -
    302 [this](const Error_code& async_err_code)
    -
    303 {
    -
    304 // We are in thread W.
    -
    305 on_next_peer_socket_or_error(async_err_code);
    -
    306 });
    -
    307} // Native_socket_stream_acceptor::on_next_peer_socket_or_error()
    -
    308
    - -
    310{
    -
    311 using boost::movelib::make_unique;
    -
    312 using std::get;
    -
    313 using std::holds_alternative;
    -
    314
    -
    315 // We are in thread U/W. (They *are* allowed to invoke async_accept() from within their completion handler.)
    -
    316
    -
    317 /* We don't lock our state, hence we do everything in thread W.
    -
    318 *
    -
    319 * If we are in thread U: Post on thread W.
    -
    320 *
    -
    321 * If we are in thread W already (being invoked from earlier user completion handler): Still post on thread W.
    -
    322 * Otherwise we may well invoke handler synchronously (if surplus is available at the moment) which would
    -
    323 * mean nested handler invocation, which we promised not to do (for good reason: if, say, their handler
    -
    324 * is bracketed by a non-recursive lock, then they would get a deadlock trying to acquire the lock in
    -
    325 * the 2nd -- inner -- handler execution). */
    -
    326 m_worker.post([this, target_peer, on_done_func = std::move(on_done_func)]
    -
    327 () mutable // To allow for the on_done_func to be move()d again.
    -
    328 {
    -
    329 // We are in thread W.
    -
    330
    -
    331 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Handling async-accept request.");
    -
    332
    -
    333 auto new_req = make_unique<User_request>();
    -
    334 new_req->m_target_peer = target_peer;
    -
    335 new_req->m_on_done_func = std::move(on_done_func);
    -
    336
    -
    337 // We are in steady state. Make this one change....
    -
    338 m_pending_user_requests_q.emplace(std::move(new_req)); // (new_req may now be hosed.)
    -
    339 // ...and immediately handle it appropriately to get back into steady state:
    -
    340
    -
    341 if (m_pending_results_q.empty())
    -
    342 {
    -
    343 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-accept request pushed onto deficit queue; "
    -
    344 "but there is no surplus (no pending results). Will await results.");
    -
    345 return;
    -
    346 }
    -
    347 // else if (!m_pending_results_q.empty())
    -
    348
    -
    349 /* If deficit existed *before* the request was pushed, and there's surplus too, then it wasn't steady state
    -
    350 * pre-push. Violates our invariant (see data member doc headers). */
    -
    351 assert(m_pending_user_requests_q.size() == 1);
    -
    352
    -
    353 auto& peer_or_err_code = m_pending_results_q.front();
    -
    354 if (holds_alternative<Error_code>(peer_or_err_code))
    -
    355 {
    -
    356 assert(m_pending_results_q.size() == 1); // An error always caps the queue (and never leaves it).
    -
    357 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-request pushed onto deficit queue; "
    -
    358 "and there is surplus in the form of a fatal error code. Will feed error to the request "
    -
    359 "*without* popping it from surplus queue (size remains 1).");
    -
    360 feed_error_result_to_deficit(get<Error_code>(peer_or_err_code));
    -
    361 }
    -
    362 else
    -
    363 {
    -
    364 assert(holds_alternative<Peer_ptr>(peer_or_err_code));
    -
    365
    -
    366 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-request pushed onto deficit queue; "
    -
    367 "and there is surplus in the form of a new peer handle. Will feed handle to the request. "
    -
    368 "Queue size will become [" << (m_pending_results_q.size() - 1) << "].");
    -
    369
    -
    370 Peer_ptr peer(std::move(get<Peer_ptr>(peer_or_err_code)));
    - -
    372 feed_success_result_to_deficit(std::move(peer));
    -
    373 }
    -
    374 }); // m_worker.post()
    -
    375} // Native_socket_stream_acceptor::async_accept_impl()
    -
    376
    - -
    378{
    -
    379 using std::get;
    -
    380 using std::holds_alternative;
    -
    381
    -
    382 // We are in thread W.
    -
    383
    -
    384 assert((!m_pending_results_q.empty()) && holds_alternative<Error_code>(m_pending_results_q.back()));
    -
    385
    -
    386 if (m_pending_user_requests_q.empty())
    -
    387 {
    -
    388 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Fatal error pushed onto surplus queue; "
    -
    389 "but there is no deficit (no pending requests). Will await async-accept request(s).");
    -
    390 return;
    -
    391 }
    -
    392 // else if (!m_pending_user_requests_q.empty())
    -
    393
    -
    394 /* If surplus existed *before* the error was pushed, and there's deficit too, then it wasn't steady state pre-push.
    -
    395 * Violates our pre-condition. */
    -
    396 assert(m_pending_results_q.size() == 1);
    -
    397
    -
    398 const auto err_code = get<Error_code>(m_pending_results_q.front());
    -
    399 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Fatal error pushed onto surplus queue; "
    -
    400 "and there is deficit (1+ pending requests). Will feed error to all pending requests *without* "
    -
    401 "popping surplus queue, whose size remains 1.");
    - -
    403} // Native_socket_stream_acceptor::finalize_q_surplus_on_error()
    -
    404
    - -
    406{
    -
    407 using std::get;
    -
    408 using std::holds_alternative;
    -
    409
    -
    410 // We are in thread W.
    -
    411
    -
    412 assert((!m_pending_results_q.empty()) && holds_alternative<Peer_ptr>(m_pending_results_q.back()));
    -
    413
    -
    414 if (m_pending_user_requests_q.empty())
    -
    415 {
    -
    416 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New peer socket handle pushed onto surplus queue; "
    -
    417 "but there is no deficit (no pending requests). Will await async-accept request(s).");
    -
    418 return;
    -
    419 }
    -
    420 // else if (!m_pending_user_requests_q.empty())
    -
    421
    -
    422 /* If surplus existed *before* the handle was pushed, and there's deficit too, then it wasn't steady state pre-push.
    -
    423 * Violates our pre-condition. */
    -
    424 assert(m_pending_results_q.size() == 1);
    -
    425
    -
    426 Peer_ptr peer(std::move(get<Peer_ptr>(m_pending_results_q.front())));
    - -
    428 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New peer socket handle pushed onto surplus queue; "
    -
    429 "and there is deficit (1+ pending requests). Will feed to next pending request, having "
    -
    430 "popped it from surplus queue (size is now 0).");
    -
    431 feed_success_result_to_deficit(std::move(peer));
    -
    432} // Native_socket_stream_acceptor::finalize_q_surplus_on_success()
    -
    433
    - -
    435{
    -
    436 assert(!m_pending_user_requests_q.empty());
    -
    437
    -
    438 size_t idx = 0;
    -
    439 do // while (!empty())
    -
    440 {
    -
    441 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Feeding to user async-accept request handler [" << idx << "]: "
    -
    442 "Error code [" << err_code << "] [" << err_code.message() << "].");
    -
    443 m_pending_user_requests_q.front()->m_on_done_func(err_code);
    - -
    445
    -
    446 ++idx;
    -
    447 }
    -
    448 while (!m_pending_user_requests_q.empty());
    -
    449} // Native_socket_stream_acceptor::feed_error_result_to_deficit()
    -
    450
    - -
    452{
    -
    453 assert(!m_pending_user_requests_q.empty());
    -
    454
    -
    455 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Feeding to user async-accept request handler: "
    -
    456 "Socket stream [" << *peer << "]. User request queue size post-pop is "
    -
    457 "[" << (m_pending_user_requests_q.size() - 1) << "].");
    -
    458 auto& head_request = m_pending_user_requests_q.front();
    -
    459 *head_request->m_target_peer = std::move(*peer);
    -
    460 head_request->m_on_done_func(Error_code());
    - -
    462} // Native_socket_stream_acceptor::feed_success_result_to_deficit()
    -
    463
    - -
    465{
    -
    466 return m_absolute_name;
    -
    467}
    -
    468
    -
    469std::ostream& operator<<(std::ostream& os, const Native_socket_stream_acceptor& val)
    -
    470{
    -
    471 return os << "sh_name[" << val.absolute_name() << "]@" << static_cast<const void*>(&val);
    -
    472}
    -
    473
    -
    474} // namespace ipc::transport
    +
    265 static_assert(false, "Should not have gotten to this line; should have required Linux; "
    +
    266 "the next thing assumes not-Win-<8.1.");
    +
    267#endif
    +
    268 // Could store a raw handle too, but this is exactly as fast and adds some logging niceties.
    +
    269 Native_handle native_peer_socket(m_next_peer_socket.release());
    +
    270 assert(!m_next_peer_socket.is_open()); // Non-exhaustive sanity check that it's back in empty/unconnected state.
    +
    271 FLOW_LOG_TRACE("Acceptor [" << *this << "]: "
    +
    272 "Ejected ownership of new incoming peer socket [" << native_peer_socket << "].");
    +
    273
    +
    274 auto new_peer
    +
    275 = boost::movelib::make_unique<Peer>
    +
    276 (get_logger(),
    +
    277 // Nickname is, like, "_pathName_of_this_acceptor=>native_hndl[35]" (as I write this).
    +
    278 ostream_op_string(m_absolute_name.str(), "=>", native_peer_socket),
    +
    279 std::move(native_peer_socket));
    +
    280 // Caution: native_peer_socket is now invalid.
    +
    281 assert(native_peer_socket.null());
    +
    282
    +
    283 // Queue up and handle result.
    +
    284
    +
    285 // As above -- on error we wouldn't have kept trying to accept more.
    +
    286 assert(m_pending_results_q.empty() || (!holds_alternative<Error_code>(m_pending_results_q.back())));
    +
    287
    +
    288 // We are in steady state. Make this one change...
    +
    289 m_pending_results_q.emplace(std::move(new_peer)); // (new_peer may now be hosed.)
    +
    290 // ...and immediately handle it appropriately to get back into steady state.
    + +
    292 } // else if (!sys_err_code)
    +
    293
    +
    294 // Either there was success (!sys_err_code), or a non-fatal error (otherwise). Keep the async chain going.
    +
    295
    +
    296 /* @todo Does it help perf-wise to spin through non-blocking accepts here (in case more incoming peers have been
    +
    297 * queued up by OS) until would-block? I (ygoldfel) have done it in the past when doing TCP/UDP reads, but I never
    +
    298 * really checked whether it's beneficial, and anyway this situation is not really the same (incoming load
    +
    299 * should be much less intense here). */
    +
    300
    +
    301 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Starting the next background accept.");
    +
    302 m_acceptor->async_accept(m_next_peer_socket,
    +
    303 [this](const Error_code& async_err_code)
    +
    304 {
    +
    305 // We are in thread W.
    +
    306 on_next_peer_socket_or_error(async_err_code);
    +
    307 });
    +
    308} // Native_socket_stream_acceptor::on_next_peer_socket_or_error()
    +
    309
    + +
    311{
    +
    312 using boost::movelib::make_unique;
    +
    313 using std::get;
    +
    314 using std::holds_alternative;
    +
    315
    +
    316 // We are in thread U/W. (They *are* allowed to invoke async_accept() from within their completion handler.)
    +
    317
    +
    318 /* We don't lock our state, hence we do everything in thread W.
    +
    319 *
    +
    320 * If we are in thread U: Post on thread W.
    +
    321 *
    +
    322 * If we are in thread W already (being invoked from earlier user completion handler): Still post on thread W.
    +
    323 * Otherwise we may well invoke handler synchronously (if surplus is available at the moment) which would
    +
    324 * mean nested handler invocation, which we promised not to do (for good reason: if, say, their handler
    +
    325 * is bracketed by a non-recursive lock, then they would get a deadlock trying to acquire the lock in
    +
    326 * the 2nd -- inner -- handler execution). */
    +
    327 m_worker.post([this, target_peer, on_done_func = std::move(on_done_func)]
    +
    328 () mutable // To allow for the on_done_func to be move()d again.
    +
    329 {
    +
    330 // We are in thread W.
    +
    331
    +
    332 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Handling async-accept request.");
    +
    333
    +
    334 auto new_req = make_unique<User_request>();
    +
    335 new_req->m_target_peer = target_peer;
    +
    336 new_req->m_on_done_func = std::move(on_done_func);
    +
    337
    +
    338 // We are in steady state. Make this one change....
    +
    339 m_pending_user_requests_q.emplace(std::move(new_req)); // (new_req may now be hosed.)
    +
    340 // ...and immediately handle it appropriately to get back into steady state:
    +
    341
    +
    342 if (m_pending_results_q.empty())
    +
    343 {
    +
    344 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-accept request pushed onto deficit queue; "
    +
    345 "but there is no surplus (no pending results). Will await results.");
    +
    346 return;
    +
    347 }
    +
    348 // else if (!m_pending_results_q.empty())
    +
    349
    +
    350 /* If deficit existed *before* the request was pushed, and there's surplus too, then it wasn't steady state
    +
    351 * pre-push. Violates our invariant (see data member doc headers). */
    +
    352 assert(m_pending_user_requests_q.size() == 1);
    +
    353
    +
    354 auto& peer_or_err_code = m_pending_results_q.front();
    +
    355 if (holds_alternative<Error_code>(peer_or_err_code))
    +
    356 {
    +
    357 assert(m_pending_results_q.size() == 1); // An error always caps the queue (and never leaves it).
    +
    358 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-request pushed onto deficit queue; "
    +
    359 "and there is surplus in the form of a fatal error code. Will feed error to the request "
    +
    360 "*without* popping it from surplus queue (size remains 1).");
    +
    361 feed_error_result_to_deficit(get<Error_code>(peer_or_err_code));
    +
    362 }
    +
    363 else
    +
    364 {
    +
    365 assert(holds_alternative<Peer_ptr>(peer_or_err_code));
    +
    366
    +
    367 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New async-request pushed onto deficit queue; "
    +
    368 "and there is surplus in the form of a new peer handle. Will feed handle to the request. "
    +
    369 "Queue size will become [" << (m_pending_results_q.size() - 1) << "].");
    +
    370
    +
    371 Peer_ptr peer(std::move(get<Peer_ptr>(peer_or_err_code)));
    + +
    373 feed_success_result_to_deficit(std::move(peer));
    +
    374 }
    +
    375 }); // m_worker.post()
    +
    376} // Native_socket_stream_acceptor::async_accept_impl()
    +
    377
    + +
    379{
    +
    380 using std::get;
    +
    381 using std::holds_alternative;
    +
    382
    +
    383 // We are in thread W.
    +
    384
    +
    385 assert((!m_pending_results_q.empty()) && holds_alternative<Error_code>(m_pending_results_q.back()));
    +
    386
    +
    387 if (m_pending_user_requests_q.empty())
    +
    388 {
    +
    389 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Fatal error pushed onto surplus queue; "
    +
    390 "but there is no deficit (no pending requests). Will await async-accept request(s).");
    +
    391 return;
    +
    392 }
    +
    393 // else if (!m_pending_user_requests_q.empty())
    +
    394
    +
    395 /* If surplus existed *before* the error was pushed, and there's deficit too, then it wasn't steady state pre-push.
    +
    396 * Violates our pre-condition. */
    +
    397 assert(m_pending_results_q.size() == 1);
    +
    398
    +
    399 const auto err_code = get<Error_code>(m_pending_results_q.front());
    +
    400 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Fatal error pushed onto surplus queue; "
    +
    401 "and there is deficit (1+ pending requests). Will feed error to all pending requests *without* "
    +
    402 "popping surplus queue, whose size remains 1.");
    + +
    404} // Native_socket_stream_acceptor::finalize_q_surplus_on_error()
    +
    405
    + +
    407{
    +
    408 using std::get;
    +
    409 using std::holds_alternative;
    +
    410
    +
    411 // We are in thread W.
    +
    412
    +
    413 assert((!m_pending_results_q.empty()) && holds_alternative<Peer_ptr>(m_pending_results_q.back()));
    +
    414
    +
    415 if (m_pending_user_requests_q.empty())
    +
    416 {
    +
    417 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New peer socket handle pushed onto surplus queue; "
    +
    418 "but there is no deficit (no pending requests). Will await async-accept request(s).");
    +
    419 return;
    +
    420 }
    +
    421 // else if (!m_pending_user_requests_q.empty())
    +
    422
    +
    423 /* If surplus existed *before* the handle was pushed, and there's deficit too, then it wasn't steady state pre-push.
    +
    424 * Violates our pre-condition. */
    +
    425 assert(m_pending_results_q.size() == 1);
    +
    426
    +
    427 Peer_ptr peer(std::move(get<Peer_ptr>(m_pending_results_q.front())));
    + +
    429 FLOW_LOG_TRACE("Acceptor [" << *this << "]: New peer socket handle pushed onto surplus queue; "
    +
    430 "and there is deficit (1+ pending requests). Will feed to next pending request, having "
    +
    431 "popped it from surplus queue (size is now 0).");
    +
    432 feed_success_result_to_deficit(std::move(peer));
    +
    433} // Native_socket_stream_acceptor::finalize_q_surplus_on_success()
    +
    434
    + +
    436{
    +
    437 assert(!m_pending_user_requests_q.empty());
    +
    438
    +
    439 size_t idx = 0;
    +
    440 do // while (!empty())
    +
    441 {
    +
    442 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Feeding to user async-accept request handler [" << idx << "]: "
    +
    443 "Error code [" << err_code << "] [" << err_code.message() << "].");
    +
    444 m_pending_user_requests_q.front()->m_on_done_func(err_code);
    + +
    446
    +
    447 ++idx;
    +
    448 }
    +
    449 while (!m_pending_user_requests_q.empty());
    +
    450} // Native_socket_stream_acceptor::feed_error_result_to_deficit()
    +
    451
    + +
    453{
    +
    454 assert(!m_pending_user_requests_q.empty());
    +
    455
    +
    456 FLOW_LOG_TRACE("Acceptor [" << *this << "]: Feeding to user async-accept request handler: "
    +
    457 "Socket stream [" << *peer << "]. User request queue size post-pop is "
    +
    458 "[" << (m_pending_user_requests_q.size() - 1) << "].");
    +
    459 auto& head_request = m_pending_user_requests_q.front();
    +
    460 *head_request->m_target_peer = std::move(*peer);
    +
    461 head_request->m_on_done_func(Error_code());
    + +
    463} // Native_socket_stream_acceptor::feed_success_result_to_deficit()
    +
    464
    + +
    466{
    +
    467 return m_absolute_name;
    +
    468}
    +
    469
    +
    470std::ostream& operator<<(std::ostream& os, const Native_socket_stream_acceptor& val)
    +
    471{
    +
    472 return os << "sh_name[" << val.absolute_name() << "]@" << static_cast<const void*>(&val);
    +
    473}
    +
    474
    +
    475} // namespace ipc::transport
    A server object that binds to a Shared_name and listens for incoming Native_socket_stream connect att...
    static const Shared_name & S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type.
    -
    void async_accept_impl(Peer *target_peer, On_peer_accepted_func &&on_done_func)
    Non-template impl of async_accept().
    +
    void async_accept_impl(Peer *target_peer, On_peer_accepted_func &&on_done_func)
    Non-template impl of async_accept().
    flow::async::Single_thread_task_loop m_worker
    A single-threaded async task loop that starts in constructor and ends in destructor.
    boost::movelib::unique_ptr< Peer > Peer_ptr
    Short-hand for internally stored PEER-state sync_io::Native_socket_stream in m_pending_results_q.
    std::queue< User_request::Ptr > m_pending_user_requests_q
    Queue storing deficit async-accept requests queued up due to lacking pending ready peer socket handle...
    -
    void finalize_q_surplus_on_error()
    In thread W, in steady state except for an Error_code just pushed to the back of m_pending_results_q ...
    +
    void finalize_q_surplus_on_error()
    In thread W, in steady state except for an Error_code just pushed to the back of m_pending_results_q ...
    ~Native_socket_stream_acceptor()
    Destroys this acceptor which will stop listening in the background and cancel any pending completion ...
    Native_socket_stream_acceptor(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code=0)
    Creates the Native_socket_stream_acceptor and immediately begins listening in the background,...
    asio_local_stream_socket::Peer_socket m_next_peer_socket
    Unix domain peer socket, always empty/unconnected while a background m_acceptor.async_accept() is pro...
    -
    void feed_error_result_to_deficit(const Error_code &err_code)
    In thread W, gets back to steady state by feeding the given Error_code (which must be the sole elemen...
    +
    void feed_error_result_to_deficit(const Error_code &err_code)
    In thread W, gets back to steady state by feeding the given Error_code (which must be the sole elemen...
    boost::movelib::unique_ptr< asio_local_stream_socket::Acceptor > m_acceptor
    Unix domain socket acceptor.
    flow::async::Task_asio_err On_peer_accepted_func
    Short-hand for callback called on new peer-to-peer connection; or on unrecoverable error.
    -
    void finalize_q_surplus_on_success()
    In thread W, in steady state, introduces the just-established peer socket handle into the state machi...
    +
    void finalize_q_surplus_on_success()
    In thread W, in steady state, introduces the just-established peer socket handle into the state machi...
    std::queue< std::variant< Peer_ptr, Error_code > > m_pending_results_q
    Queue storing surplus finalized async-accept results queued up due to lacking async_accept() requests...
    -
    const Shared_name & absolute_name() const
    Returns the full name/address to which the constructor bound, or attempted to bind,...
    -
    void feed_success_result_to_deficit(Peer_ptr &&peer)
    In thread W, gets back to steady state by feeding the given just-connected peer socket (which must ha...
    +
    const Shared_name & absolute_name() const
    Returns the full name/address to which the constructor bound, or attempted to bind,...
    +
    void feed_success_result_to_deficit(Peer_ptr &&peer)
    In thread W, gets back to steady state by feeding the given just-connected peer socket (which must ha...
    void on_next_peer_socket_or_error(const Error_code &sys_err_code)
    Handler for incoming connection on m_acceptor.
    Implements both sync_io::Native_handle_sender and sync_io::Native_handle_receiver concepts by using a...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    @@ -572,21 +573,21 @@
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    Endpoint endpoint_at_shared_name(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code)
    Returns an Endpoint corresponding to the given absolute Shared_name, so that an Acceptor or Peer_sock...
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    util::Shared_name Shared_name
    Convenience alias for the commonly used type util::Shared_name.
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp.html index 4b7d2b53e..06f073b3b 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -104,7 +104,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp_source.html index 733f0ae07..90cf458b6 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__acceptor_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -474,23 +474,23 @@
    A server object that binds to a Shared_name and listens for incoming Native_socket_stream connect att...
    static const Shared_name & S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type.
    -
    void async_accept_impl(Peer *target_peer, On_peer_accepted_func &&on_done_func)
    Non-template impl of async_accept().
    +
    void async_accept_impl(Peer *target_peer, On_peer_accepted_func &&on_done_func)
    Non-template impl of async_accept().
    flow::async::Single_thread_task_loop m_worker
    A single-threaded async task loop that starts in constructor and ends in destructor.
    boost::movelib::unique_ptr< Peer > Peer_ptr
    Short-hand for internally stored PEER-state sync_io::Native_socket_stream in m_pending_results_q.
    std::queue< User_request::Ptr > m_pending_user_requests_q
    Queue storing deficit async-accept requests queued up due to lacking pending ready peer socket handle...
    -
    void finalize_q_surplus_on_error()
    In thread W, in steady state except for an Error_code just pushed to the back of m_pending_results_q ...
    +
    void finalize_q_surplus_on_error()
    In thread W, in steady state except for an Error_code just pushed to the back of m_pending_results_q ...
    ~Native_socket_stream_acceptor()
    Destroys this acceptor which will stop listening in the background and cancel any pending completion ...
    Native_socket_stream_acceptor(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code=0)
    Creates the Native_socket_stream_acceptor and immediately begins listening in the background,...
    asio_local_stream_socket::Peer_socket m_next_peer_socket
    Unix domain peer socket, always empty/unconnected while a background m_acceptor.async_accept() is pro...
    void async_accept(Peer *target_peer, Task_err &&on_done_func)
    Asynchronously awaits for a peer connection to be established and calls on_done_func(),...
    -
    void feed_error_result_to_deficit(const Error_code &err_code)
    In thread W, gets back to steady state by feeding the given Error_code (which must be the sole elemen...
    +
    void feed_error_result_to_deficit(const Error_code &err_code)
    In thread W, gets back to steady state by feeding the given Error_code (which must be the sole elemen...
    boost::movelib::unique_ptr< asio_local_stream_socket::Acceptor > m_acceptor
    Unix domain socket acceptor.
    flow::async::Task_asio_err On_peer_accepted_func
    Short-hand for callback called on new peer-to-peer connection; or on unrecoverable error.
    -
    void finalize_q_surplus_on_success()
    In thread W, in steady state, introduces the just-established peer socket handle into the state machi...
    +
    void finalize_q_surplus_on_success()
    In thread W, in steady state, introduces the just-established peer socket handle into the state machi...
    std::queue< std::variant< Peer_ptr, Error_code > > m_pending_results_q
    Queue storing surplus finalized async-accept results queued up due to lacking async_accept() requests...
    -
    const Shared_name & absolute_name() const
    Returns the full name/address to which the constructor bound, or attempted to bind,...
    -
    void feed_success_result_to_deficit(Peer_ptr &&peer)
    In thread W, gets back to steady state by feeding the given just-connected peer socket (which must ha...
    +
    const Shared_name & absolute_name() const
    Returns the full name/address to which the constructor bound, or attempted to bind,...
    +
    void feed_success_result_to_deficit(Peer_ptr &&peer)
    In thread W, gets back to steady state by feeding the given just-connected peer socket (which must ha...
    void on_next_peer_socket_or_error(const Error_code &sys_err_code)
    Handler for incoming connection on m_acceptor.
    sync_io::Native_socket_stream Sync_io_obj
    Useful for generic programming, the sync_io-pattern counterpart to *this type.
    Dummy type for use as a template param to Channel when either the blobs pipe or handles pipe is disab...
    Definition: channel.hpp:1000
    @@ -498,8 +498,8 @@
    Implements both sync_io::Native_handle_sender and sync_io::Native_handle_receiver concepts by using a...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    Protocol::socket Peer_socket
    Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    Data store representing a deficit user async-accept request that had to be saved due to lacking surpl...
    @@ -510,7 +510,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp.html index 0f2052175..caac2d2bb 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -92,7 +92,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp_source.html index 96a5cd65b..15dd45fd4 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__rcv_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -902,7 +902,7 @@
    bool start_receive_native_handle_ops(Event_wait_func_t &&ev_wait_func)
    Implements Native_handle_receiver API per contract.
    size_t receive_meta_blob_max_size() const
    Implements Native_handle_receiver API per contract.
    -
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    +
    size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &target_payload_blob, Error_code *err_code, int message_flags)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->read_some(targ...
    @ S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE
    Unable to receive incoming traffic: an earlier-reported, or at least logged, system error had hosed t...
    @ S_SYNC_IO_WOULD_BLOCK
    A sync_io operation could not immediately complete; it will complete contingent on active async-wait ...
    @ S_RECEIVES_FINISHED_CANNOT_RECEIVE
    Will not receive message: either opposing user sent graceful-close via API.
    @@ -911,17 +911,17 @@
    @ S_BLOB_RECEIVER_GOT_NON_BLOB
    User protocol-code mismatch: local user expected blob only and no native handle; received at least th...
    sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
    Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
    In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp.html b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp.html index 87165b2e7..cc1254f03 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -93,7 +93,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp_source.html b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp_source.html index f9268d4e0..570d1b5fb 100644 --- a/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/native__socket__stream__impl__snd_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -1122,8 +1122,8 @@
    bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const &meta_blob, Error_code *err_code=0)
    Implements Native_handle_sender API per contract.
    flow::log::Logger * get_logger() const
    Returns logger (possibly null).
    -
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    -
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    +
    size_t nb_write_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Error_code *err_code)
    boost.asio extension similar to peer_socket->non_blocking(true); auto n = peer_socket->write_some(pay...
    +
    void async_write_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle payload_hndl, const util::Blob_const &payload_blob, Task_err &&on_sent_or_error)
    boost.asio extension similar to boost::asio::async_write(Peer_socket&, Blob_const,...
    @ S_SENDS_FINISHED_CANNOT_SEND
    Will not send message: local user already ended sending via API marking this.
    @ S_SYNC_IO_WOULD_BLOCK
    A sync_io operation could not immediately complete; it will complete contingent on active async-wait ...
    @ S_INVALID_ARGUMENT
    User called an API with 1 or more arguments against the API spec.
    @@ -1131,17 +1131,17 @@
    sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
    In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    diff --git a/doc/ipc_doc/generated/html_full/pages.html b/doc/ipc_doc/generated/html_full/pages.html index 1eb8e46f3..908b88a25 100644 --- a/doc/ipc_doc/generated/html_full/pages.html +++ b/doc/ipc_doc/generated/html_full/pages.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -87,7 +87,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp.html index 09e5d2882..455c7558f 100644 --- a/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -101,7 +101,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp_source.html b/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp_source.html index 3c6a12c19..dcb826cd7 100644 --- a/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/persistent__mq__handle_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -91,694 +91,695 @@
    19
    20// Not compiled: for documentation only. Contains concept docs as of this writing.
    21#ifndef IPC_DOXYGEN_ONLY
    -
    22# error "As of this writing this is a documentation-only "header" (the "source" is for humans and Doxygen only)."
    -
    23#else // ifdef IPC_DOXYGEN_ONLY
    -
    24
    -
    25namespace ipc::transport
    -
    26{
    -
    27
    -
    28// Types.
    -
    29
    -
    30/**
    -
    31 * A documentation-only *concept* defining the behavior of an object representing a light-weight handle
    -
    32 * to a message queue, capable of receiving/sending discrete messages in non-blocking/blocking/timed-blocking
    -
    33 * fashion, as well as some support for polling/waiting and interruptions thereof. The message queue (MQ)
    -
    34 * is assumed to be of at least kernel persistence, meaning a handle to an MQ
    -
    35 * closing does not delete the MQ, and another handle may reattach to it; in order to delete the underlying MQ
    -
    36 * a separate remove op is needed (and is provided as well as a `static` method).
    -
    37 *
    -
    38 * ### How to use ###
    -
    39 * The following are relevant operations to do with MQs. (Read Rationale for background.)
    -
    40 * - Create (named) MQ: Persistent_mq_handle() ctor, with either util::Create_only or util::Open_or_create tag arg.
    -
    41 * A Shared_name specifies the name.
    -
    42 * If one does not need a handle simply destroy the resulting object: the underlying created MQ continues existing.
    -
    43 * - Create handle to the (named) MQ: Persistent_mq_handle() ctor, with either util::Open_only or
    -
    44 * util::Open_or_create tag arg.
    -
    45 * A Shared_name specifies the name.
    -
    46 * - Send message into the MQ, via handle: try_send() (non-blocking), send() (blocking), timed_send() (blocking with
    -
    47 * timeout).
    -
    48 * - Await writability without writing: is_sendable() (instant poll), wait_sendable() (blocking),
    -
    49 * timed_wait_sendable() (blocking with timeout).
    -
    50 * - Interrupt and/or preempt all above blocking operations including concurrently/preempt is_sendable():
    -
    51 * interrupt_sends(). Undo: allow_sends().
    -
    52 * - Receive message out of the MQ, via handle: try_receive() (non-blocking), receive() (blocking),
    -
    53 * timed_receive() (blocking with timeout).
    -
    54 * - Await readability without reading: is_receivable() (instant poll), wait_receivable() (blocking),
    -
    55 * timed_wait_receivable() (blocking with timeout).
    -
    56 * - Interrupt and/or preempt all above blocking operations including concurrently/preempt is_receivable():
    -
    57 * interrupt_receives(). Undo: allow_receives().
    -
    58 * - Destroy handle to the MQ: ~Persistent_mq_handle() destructor. The underlying MQ continues existing.
    -
    59 * - Destroy (named) MQ: remove_persistent(). Underlying MQ name disappears, but MQ continues existing until
    -
    60 * all handles machine-wide are closed. A Shared_name specifies the name.
    -
    61 *
    -
    62 * ### Thread safety ###
    -
    63 * Concurrent ops safe on different objects (including when the same-named queue is being accessed).
    -
    64 * Concurrent non-`const` ops (where at least 1 is non-`const`) not safe on the same `*this`.
    -
    65 *
    -
    66 * The notable exception to the latter: each of `interrupt_*()` and `allow_*()` is safe to call on the same
    -
    67 * `*this` concurrently to any method except `interrupt_*()` and `allow_*()` themselves. In fact
    -
    68 * `interrupt_*()` ability to interrupt a concurrent timed-waiting of infinitely-waiting read or write is
    -
    69 * most of those methods' utility.
    -
    70 *
    -
    71 * ### Rationale ###
    -
    72 * Here's why this concept exists and how it was designed to be the way it is. It's actually quite simple;
    -
    73 * the only question is why it is this way and not some other way. Update: It's somewhat less simple now but not bad.
    -
    74 *
    -
    75 * ipc::transport features the Blob_sender and Blob_receiver concepts, each of which is a peer endpoint of a
    -
    76 * connected one-way pipe capable of transmitting discrete messages, each consisting of a binary blob.
    -
    77 * They are first-class citizens of ipc::transport, or at least of its core-layer portion, meaning they're likely
    -
    78 * to be used by the user directly or at least in highly visible fashion by another aspect of ipc::transport impl.
    -
    79 * They have a vaguely socket-like API, with an asynchronous receive method and a convenient non-blocking/synchronous
    -
    80 * sender method (that cannot yield would-block). Lastly the destructor of either ensures the underlying transport
    -
    81 * cannot be used again by somehow opening another handle to the same thing.
    -
    82 *
    -
    83 * One implementation of Blob_sender and Blob_receiver simultaneously might be Native_socket_stream which
    -
    84 * uses Unix domain stream connection as underlying transport. That one is a natural fit for the concept,
    -
    85 * including the fact that closing a Unix domain socket hoses the connection entirely (one cannot somehow "reattach"
    -
    86 * to it). It's good. However, benchmark tests (details omitted) show that, when need not also send native handles
    -
    87 * over such a connection, *message queue* low-level transports might be more performant or at least competitive.
    -
    88 *
    -
    89 * In our ecosystem, two message queue (MQ) transports are candidates: the POSIX message queue (provided by Linux)
    -
    90 * (see `man mq_overview`) and the boost.interprocess (bipc) message queue (web-search for
    -
    91 * `boost::interprocess::message_queue`). We wanted to support both and then provide the choice of which one to use.
    -
    92 * So the goal is to write Blob_sender and Blob_receiver concept impls for each type of MQ (and possibly others
    -
    93 * over time). So how to do that nicely?
    -
    94 *
    -
    95 * The 2 low-level MQ APIs (POSIX MQ and bipc MQ) are extremely different, conceptually and in practice, from
    -
    96 * stream socket APIs of any kind. For one thing, the MQs have kernel persistence -- they're like files in memory that
    -
    97 * disappear at reboot but otherwise stay around, so one can reattach a handle to one even after closing another one;
    -
    98 * and deleting it is a separate operation not involving any handle. For another, they don't use socket-descriptors
    -
    99 * and hence do not participate in `epoll/poll/select()` mechanisms and feature only blocking, non-blocking, and
    -
    100 * blocking-with-timeout send and receive APIs. (POSIX MQ does have `mq_notify()`, but this async-notify mechanism
    -
    101 * is quite limited, either creating a new thread for each notification, or using a signal. POSIX MQ in Linux
    -
    102 * *does* happen to have a non-portable property wherein the descriptor is really an FD, so it *can* participate
    -
    103 * in `epoll/poll/select()` mechanisms; and boost.asio *does* have a `posix::descriptor` that can wrap such a
    -
    104 * native descriptor. However: bipc MQ lacks anything like this at all.)
    -
    105 *
    -
    106 * The 2 APIs are, however, extremely similar to each other. In fact, one gets the impression that the authors
    -
    107 * of bipc MQ considered wrapping POSIX MQs but reconsidered for whatever reason (maybe the obscure limit semantics,
    -
    108 * lack of availability in all Linux versions and other Unixes and Windows) -- but fairly closely mirrored the API
    -
    109 * therein.
    -
    110 *
    -
    111 * Knowing this, it looked pretty natural to write some Blob_sender/Blob_receiver impls holding
    -
    112 * some `bipc::message_queue` handles internally. However, while conceptually similar, the POSIX MQ API is a
    -
    113 * C API, not a Boost-style C++ thing. It would be entirely possible to still write Blob_sender/Blob_receiver impls
    -
    114 * around this API, but since conceptually it's so similar to bipc MQ, why waste the effort? Code reuse for the win.
    -
    115 *
    -
    116 * That brings us to this concept. What it is is: A thing I (ygoldfel) came up with by simply taking
    -
    117 * `bipc::message_queue` and working backwards, making a concept for an MQ handle, Persistent_mq_handle, to which
    -
    118 * `bipc::message_queue` directly conforms already in most key ways (to wit: the send/receive methods).
    -
    119 * Then one could write a very thin non-polymorphic HAS-A wrapper class (with no added data stored) and a couple other
    -
    120 * utility functions with very thin adaptations to match ipc::transport style (like using Shared_name instead of
    -
    121 * strings when creating or removing kernel-persistent queue instances). This class is Bipc_mq_handle; it
    -
    122 * implements this Persistent_mq_handle.
    -
    123 *
    -
    124 * Next, a class can be written to mirror this API but for POSIX MQs. This is a little harder, since it can't just
    -
    125 * expose some existing super-class's send/receive functions, but it would just wrap the Linux C API and store
    -
    126 * an MQ handle; done. This class is Posix_mq_handle; it also implements Persistent_mq_handle.
    -
    127 *
    -
    128 * Now that Persistent_mq_handle provides a uniform API, a Blob_sender/Blob_receiver can be written around a
    -
    129 * `typename Persistent_mq_handle` which can be either Bipc_mq_handle or Posix_mq_handle (or a future wrapper around
    -
    130 * something else).
    -
    131 *
    -
    132 * ### Poll/wait and interrupt facilities ###
    -
    133 * Somewhat later we added a major feature to the concept (and both known impls): For each type of transmission
    -
    134 * operation in a given direction (instant poll, blocking, blocking with timeout), there is a poll/wait counterpart
    -
    135 * which is almost the same except it does not actually transmit but merely returns the fact transmission
    -
    136 * is possible. E.g., try_receive() <=> is_receivable(), receive() <=> wait_receivable(),
    -
    137 * timed_receive() <=> timed_wait_receivable(). In fact -- in the absence of a competing `*this` --
    -
    138 * receive() = wait_receivable() + try_receive() (succeeds), timed_receive() = timed_wait_receivable() + try_receive()
    -
    139 * (succeeds).
    -
    140 *
    -
    141 * This is useful at least in that it allows one to defer deciding on a target buffer for receiving, until
    -
    142 * receiving would (probably) actually work. In the other direction it can still provide useful flexibility in
    -
    143 * a multi-threaded setup (one thread blockingly-waits, the other is signaled about readiness and tries to
    -
    144 * transmit but without blocking -- useful in a thread U/thread W setup).
    -
    145 *
    -
    146 * Lastly, any blocking (with or without timeout) can be interrupted via the `interrupt_*()` methods.
    -
    147 * For example a receive() or wait_receivable() may be ongoing in thread W, and thread U can interrupt_receives()
    -
    148 * to immediately make the blocking op exit with error::Code::S_INTERRUPTED.
    -
    149 *
    -
    150 * ### Discussion: The road to boost.asio-like async I/O ###
    -
    151 * What would be cool, which isn't here, is if this concept described a boost.asio I/O object, capable of plugging
    -
    152 * into a boost.asio loop; or ~equivalently something a-la Blob_sender and/or Blob_receiver. However that was not
    -
    153 * our aim -- we only want a thin wrapper as noted in "Rationale" above -- and Blob_stream_mq_receiver and
    -
    154 * Blob_stream_mq_sender achieve it (and arguably more -- albeit with the limit of a single writer and single reader).
    -
    155 * That said: it may be useful to contemplate what parts the concept does have that are conducive to that type of work.
    -
    156 *
    -
    157 * Without the poll/wait facilities combined with interrupt facilities, it was possible but somewhat clunky,
    -
    158 * having to at least start a background thread in which to perform blocking transmit calls; they'd have to
    -
    159 * be broken up into subject-to-timeout shorter calls, so that the thread could be stopped and joined during
    -
    160 * deinit. Even then full deinit could only occur with a potential pause until the current short call in the
    -
    161 * background thread W could return. By having thread W do (indefinite) waits only, and allowing thread U to
    -
    162 * do non-blocking transmits only *and* `interrupt_*()`, we achieve pretty good flexibility and responsiveness.
    -
    163 * That is what Blob_stream_mq_sender and Blob_stream_mq_receiver can do given the present concept.
    -
    164 *
    -
    165 * However -- it *can* be more advanced still. Consider the specific impl Posix_mq_handle, which has the
    -
    166 * additional-to-concept (edit: see below update) method Posix_mq_handle::native_handle(); in Linux a #Native_handle.
    -
    167 * This can be waited-on, natively with `[e]poll*()`; with boost.asio via util::sync_io::Asio_waitable_native_handle
    -
    168 * (more or less a `boost::asio::posix::descriptor`). *Now* no background thread W is necessary: thread U
    -
    169 * can ask the *kernel* to report readability/writability -- when active it can do non-blocking stuff.
    -
    170 *
    -
    171 * The wrinkle: Posix_mq_handle has it; but Bipc_mq_handle does not (and there is no FD inside its impl either;
    -
    172 * it is fully SHM-based internally). Can it be generalized nevertheless? Yes and no. Yes: in that it can be
    -
    173 * simulated by "secretly" having a thread W and having it use a pipe (or something) to translate readable/writable
    -
    174 * events into a live FD that could be detected via `[e]poll*()` or boost.asio. No: in that it turns a
    -
    175 * hypothetical Persistent_mq_handle impl, namely Bipc_mq_handle, into something complex as opposed to any kind
    -
    176 * of thin wrapper around an MQ API. Therefore we did not do it.
    -
    177 *
    -
    178 * However -- we did ~such a thing with sync_io::Blob_stream_mq_sender and sync_io::Blob_stream_mq_receiver which
    -
    179 * are templated on Persistent_mq_handle as a template-parameter; and, being
    -
    180 * `sync_io`-pattern-impls (see util::sync_io), they each expose a waitable-on #Native_handle.
    -
    181 * Indeed as of this writing each of these templates keeps a "secret" thread W that performs
    -
    182 * blocking waits, while the user-accessible API makes it look like a nice, kernel-reported-via-FDs
    -
    183 * reactor/proactor-supporting I/O object. By operating on what is directly available via the present concept,
    -
    184 * this setup of Blob_stream_mq_sender and Blob_stream_mq_receiver internals is agnostic to the type of MQ.
    -
    185 *
    -
    186 * However, if one wanted to take advantage of the non-concept (edit: see below update) ability to be watched
    -
    187 * (via FD) with the kernel's help and without an added thread, they could specialize `Blob_stream_mq_*er`
    -
    188 * for Posix_mq_handle which does offer a kernel-FD accessor `.native_handle()`. Update: This is now done
    -
    189 * (in fact it is not specialized as of this writing but rather uses a few simple `if constexpr
    -
    190 * ()`s). Accordingly the concept now allows for `native_handle()` optionally: see
    -
    191 * Persistent_mq_handle::S_HAS_NATIVE_HANDLE.
    -
    192 */
    -
    193class Persistent_mq_handle // Note: movable but not copyable.
    -
    194{
    -
    195public:
    -
    196 // Constants.
    -
    197
    -
    198 /// Shared_name relative-folder fragment (no separators) identifying this resource type.
    - -
    200
    -
    201 /// `true` if and only if native_handle() method exists, and the returned value may be waited-on by `poll()`/etc.
    -
    202 static constexpr bool S_HAS_NATIVE_HANDLE = unspecified;
    -
    203
    -
    204 // Constructors/destructor.
    -
    205
    -
    206 /**
    -
    207 * Construct null handle, suitable only for being subsequently moved-to or destroyed.
    -
    208 * If you do anything on `*this`, other than invoking dtor or move-assignment, behavior is undefined.
    -
    209 */
    - -
    211
    -
    212 /**
    -
    213 * Construct handle to non-existing named MQ, creating it first. If it already exists, it is an error.
    -
    214 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    -
    215 * move-assignment, behavior is undefined.
    -
    216 *
    -
    217 * @param logger_ptr
    -
    218 * Logger to use for subsequently logging.
    -
    219 * @param absolute_name
    -
    220 * Absolute name at which the persistent MQ lives.
    -
    221 * @param mode_tag
    -
    222 * API-choosing tag util::CREATE_ONLY.
    -
    223 * @param perms
    -
    224 * Permissions to use for creation. Suggest the use of util::shared_resource_permissions() to translate
    -
    225 * from one of a small handful of levels of access; these apply almost always in practice.
    -
    226 * The applied permissions shall *ignore* the process umask and shall thus exactly match `perms`,
    -
    227 * unless an error occurs.
    -
    228 * @param max_n_msg
    -
    229 * Max # of unpopped messages in created queue.
    -
    230 * @param max_msg_sz
    -
    231 * Max # of bytes in any one message in created queue.
    -
    232 * @param err_code
    -
    233 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    234 * various. Most likely creation failed due to permissions, or it already existed.
    -
    235 */
    -
    236 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    237 util::Create_only mode_tag, size_t max_n_msg, size_t max_msg_sz,
    -
    238 const util::Permissions& perms = util::Permissions(),
    -
    239 Error_code* err_code = 0);
    -
    240
    -
    241 /**
    -
    242 * Construct handle to existing named MQ, or else if it does not exist creates it first and opens it (atomically).
    -
    243 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    -
    244 * move-assignment, behavior is undefined.
    -
    245 *
    -
    246 * @param logger_ptr
    -
    247 * Logger to use for subsequently logging.
    -
    248 * @param absolute_name
    -
    249 * Absolute name at which the persistent MQ lives.
    -
    250 * @param mode_tag
    -
    251 * API-choosing tag util::OPEN_OR_CREATE.
    -
    252 * @param perms_on_create
    -
    253 * Permissions to use if creation is required. Suggest the use of util::shared_resource_permissions() to
    -
    254 * translate from one of a small handful of levels of access; these apply almost always in practice.
    -
    255 * The applied permissions shall *ignore* the process umask and shall thus exactly match `perms_on_create`,
    -
    256 * unless an error occurs.
    -
    257 * @param max_n_msg_on_create
    -
    258 * Max # of unpopped messages in created queue if creation is required.
    -
    259 * @param max_msg_sz_on_create
    -
    260 * Max # of bytes in any one message in created queue if creation is required.
    -
    261 * @param err_code
    -
    262 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    263 * various. Most likely creation failed due to permissions.
    -
    264 */
    -
    265 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    266 util::Open_or_create mode_tag, size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    -
    267 const util::Permissions& perms_on_create = util::Permissions(),
    -
    268 Error_code* err_code = 0);
    -
    269
    -
    270 /**
    -
    271 * Construct handle to existing named MQ. If it does not exist, it is an error.
    -
    272 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    -
    273 * move-assignment, behavior is undefined.
    -
    274 *
    -
    275 * @param logger_ptr
    -
    276 * Logger to use for subsequently logging.
    -
    277 * @param absolute_name
    -
    278 * Absolute name at which the persistent MQ lives.
    -
    279 * @param mode_tag
    -
    280 * API-choosing tag util::OPEN_ONLY.
    -
    281 * @param err_code
    -
    282 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    283 * various. Most likely it already existed.
    -
    284 */
    -
    285 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    286 util::Open_only mode_tag, Error_code* err_code = 0);
    -
    287
    -
    288 /**
    -
    289 * Constructs handle from the source handle while making the latter invalid.
    -
    290 * If you do anything on `src` after this, other than invoking dtor or move-assignment, behavior is undefined.
    -
    291 *
    -
    292 * Informally: this is a light-weight op.
    -
    293 *
    -
    294 * @param src
    -
    295 * Source object which is nullified.
    -
    296 */
    - -
    298
    -
    299 /// Copying of handles is prohibited.
    - -
    301
    -
    302 /**
    -
    303 * Destroys this handle (or no-op if no handle was successfully constructed, or if it's a moved-from or default-cted
    -
    304 * handle). The underlying MQ (if any) is *not* destroyed and can be attached-to by another handle.
    -
    305 */
    - -
    307
    -
    308 // Methods.
    -
    309
    -
    310 /**
    -
    311 * Replaces handle with the source handle while making the latter invalid.
    -
    312 * If you do anything on `src` after this, other than invoking dtor or move-assignment, behavior is undefined.
    -
    313 *
    -
    314 * Informally: this is a light-weight op.
    -
    315 *
    -
    316 * @param src
    -
    317 * Source object which is nullified.
    -
    318 * @return `*this`.
    -
    319 */
    - -
    321
    -
    322 /// Copying of handles is prohibited.
    - -
    324
    -
    325 /**
    -
    326 * Removes the named persistent MQ. The name `name` is removed from the system immediately; and
    -
    327 * the function is non-blocking. However the underlying MQ if any continues to exist until all handles to it are
    -
    328 * closed; their presence in this or other process is *not* an error.
    -
    329 *
    -
    330 * @see `util::remove_each_persistent_*`() for a convenient way to remove more than one item. E.g.,
    -
    331 * `util::remove_each_persistent_with_name_prefix<Pool_arena>()` combines remove_persistent() and
    -
    332 * for_each_persistent() in a common-sense way to remove only those `name`s starting with a given prefix;
    -
    333 * or simply all of them.
    -
    334 *
    -
    335 * Trying to remove a non-existent name *is* an error.
    -
    336 *
    -
    337 * Logs INFO message.
    -
    338 *
    -
    339 * @warning The impl should be carefully checked to conform to this. As of this writing the 2 relevant
    -
    340 * low-level MQ APIs (bipc and POSIX) do, but there could be more.
    -
    341 *
    -
    342 * @param logger_ptr
    -
    343 * Logger to use for subsequently logging.
    -
    344 * @param name
    -
    345 * Absolute name at which the persistent MQ lives.
    -
    346 * @param err_code
    -
    347 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    348 * various.
    -
    349 */
    -
    350 static void remove_persistent(flow::log::Logger* logger_ptr, const Shared_name& name,
    -
    351 Error_code* err_code = 0);
    -
    352
    -
    353 /**
    -
    354 * Lists all named persistent MQs currently persisting, invoking the given handler synchronously on each one.
    -
    355 *
    -
    356 * Note that, in a sanely set-up OS install, all existing pools will be listed by this function;
    -
    357 * but permissions/ownership may forbid certain operations the user may typically want to invoke on
    -
    358 * a given listed name -- for example remove_persistent(). This function does *not* filter-out any
    -
    359 * potentially inaccessible items.
    -
    360 *
    -
    361 * @tparam Handle_name_func
    -
    362 * Function object matching signature `void F(const Shared_name&)`.
    -
    363 * @param handle_name_func
    -
    364 * `handle_name_func()` shall be invoked for each (matching, if applicable) item. See `Handle_name_func`.
    -
    365 */
    -
    366 template<typename Handle_name_func>
    -
    367 static void for_each_persistent(const Handle_name_func& handle_name_func);
    -
    368
    -
    369 /**
    -
    370 * Non-blocking send: pushes copy of message to queue and returns `true`; if queue is full then no-op and returns
    -
    371 * `false`. A null blob (`blob.size() == 0`) is allowed.
    -
    372 *
    -
    373 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    374 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    -
    375 * documented below, is emitted; this is not fatal to `*this`.
    -
    376 *
    -
    377 * @param blob
    -
    378 * Buffer to copy into MQ; if empty then an empty message is pushed.
    -
    379 * @param err_code
    -
    380 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    381 * various. Would-block shall not be emitted.
    -
    382 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    -
    383 * max_msg_size()).
    -
    384 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    -
    385 * between would-block and fatal error.
    -
    386 */
    -
    387 bool try_send(const util::Blob_const& blob, Error_code* err_code = 0);
    -
    388
    -
    389 /**
    -
    390 * Blocking send: pushes copy of message to queue; if queue is full blocks until it is not.
    -
    391 * A null blob (`blob.size() == 0`) is allowed.
    -
    392 *
    -
    393 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    394 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    -
    395 * documented below, is emitted; this is not fatal to `*this`. Exception to this: interrupt_sends()
    -
    396 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    -
    397 *
    -
    398 * @param blob
    -
    399 * See try_send().
    -
    400 * @param err_code
    -
    401 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    402 * various. Would-block shall not be emitted.
    -
    403 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    -
    404 * max_msg_size()).
    -
    405 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    -
    406 */
    -
    407 void send(const util::Blob_const& blob, Error_code* err_code = 0);
    -
    408
    -
    409 /**
    -
    410 * Blocking timed send: pushes copy of message to queue; if queue is full blocks until it is not, or the
    -
    411 * specified time passes, whichever happens first. Returns `true` on success; `false` on timeout or error.
    -
    412 * A null blob (`blob.size() == 0`) is allowed.
    -
    413 *
    -
    414 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    415 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    -
    416 * documented below, is emitted; this is not fatal to `*this`. Exception to this: interrupt_sends()
    -
    417 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    -
    418 *
    -
    419 * @warning The user must not count on precision/stability -- unlike with, say, boost.asio timers -- here.
    -
    420 * If timing precision is required, the user will have to add an async layer with more precise timing
    -
    421 * and not rely on this. For example, informally, suggest: Use timed_send() with 250msec increments
    -
    422 * to model an interruptible indefinitely-blocking send(). In a parallel thread, if it's time to
    -
    423 * interrupt the modeled endless send(), set some flag that'll cause the 250msec-long attempts to cease.
    -
    424 * The last one (that straddles the interruption point) can just be ignored.
    -
    425 *
    -
    426 * @param blob
    -
    427 * See try_send().
    -
    428 * @param timeout_from_now
    -
    429 * Now + (this long) = the timeout time point.
    -
    430 * @param err_code
    -
    431 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    432 * various. Would-block shall not be emitted. Timeout shall not be emitted.
    -
    433 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    -
    434 * max_msg_size()).
    -
    435 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    -
    436 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    -
    437 * between timeout and fatal error.
    -
    438 */
    -
    439 bool timed_send(const util::Blob_const& blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    440
    -
    441 /**
    -
    442 * Equivalent to try_send() except stops short of writing anything, with `true` result indicating that
    -
    443 * try_send() *would* work at that moment.
    -
    444 *
    -
    445 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    446 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    -
    447 * below; this is not fatal to `*this.
    -
    448 *
    -
    449 * @param err_code
    -
    450 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    451 * various. Would-block shall not be emitted.
    -
    452 * error::Code::S_INTERRUPTED (preempted by interrupt_sends()).
    -
    453 * @return `true` if transmissible; `false` if not, or on error.
    -
    454 */
    -
    455 bool is_sendable(Error_code* err_code = 0);
    -
    456
    -
    457 /**
    -
    458 * Equivalent to send() except stops short of writing anything, with non-error return indicating that
    -
    459 * try_send() *would* work at that moment. It shall block indefinitely until fatal error, or
    -
    460 * error::Code::S_INTERRUPTED, or transmissibility.
    -
    461 *
    -
    462 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    463 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    -
    464 * below; this is not fatal to `*this.
    -
    465 *
    -
    466 * @param err_code
    -
    467 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    468 * various. Would-block shall not be emitted.
    -
    469 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    -
    470 */
    -
    471 void wait_sendable(Error_code* err_code = 0);
    -
    472
    -
    473 /**
    -
    474 * Equivalent to timed_send() except stops short of writing anything, with `true` result indicating that
    -
    475 * try_send() *would* work at that moment. It shall block until fatal error, or
    -
    476 * error::Code::S_INTERRUPTED, or timeout, or transmissibility.
    -
    477 *
    -
    478 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    479 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    -
    480 * below; this is not fatal to `*this.
    -
    481 *
    -
    482 * @param timeout_from_now
    -
    483 * See timed_send().
    -
    484 * @param err_code
    -
    485 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    486 * various. Would-block shall not be emitted.
    -
    487 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    -
    488 * @return `true` if transmissible; `false` if not, or on error or timeout; in the latter case `*err_code`
    -
    489 * distinguishes between timeout and fatal error.
    -
    490 */
    -
    491 bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    492
    -
    493 /**
    -
    494 * Non-blocking receive: pops copy of message from queue into buffer and returns `true`; if queue is empty then no-op
    -
    495 * and returns `false`. On `true` `blob->size()` is modified to store the # of bytes received.
    -
    496 * A null blob (`blob->size() == 0` post-condition) is possible.
    -
    497 *
    -
    498 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    499 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    -
    500 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    -
    501 *
    -
    502 * @param blob
    -
    503 * Buffer into which to copy into MQ and whose `->size()` to update to the # of bytes received;
    -
    504 * if message empty it is set to zero. Original `->size()` value indicates capacity of buffer;
    -
    505 * if this is insufficient based on either the popped message size or an upper limit (if any), it is an error.
    -
    506 * @param err_code
    -
    507 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    508 * various. Would-block shall not be emitted.
    -
    509 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    -
    510 * max_msg_size()).
    -
    511 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    -
    512 * between would-block and fatal error.
    -
    513 */
    -
    514 bool try_receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    -
    515
    -
    516 /**
    -
    517 * Blocking receive: pops copy of message from queue into buffer; if queue is empty blocks until it is not.
    -
    518 * On `true` `blob->size()` is modified to store the # of bytes received.
    -
    519 * A null blob (`blob->size() == 0` post-condition) is possible.
    -
    520 *
    -
    521 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    522 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    -
    523 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    -
    524 * Exception to this: interrupt_receives()
    -
    525 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    -
    526 *
    -
    527 * @param blob
    -
    528 * See try_receive().
    -
    529 * @param err_code
    -
    530 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    531 * various. Would-block shall not be emitted.
    -
    532 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    -
    533 * max_msg_size()).
    -
    534 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    -
    535 */
    -
    536 void receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    -
    537
    -
    538 /**
    -
    539 * Blocking timed receive: pops copy of message from queue into buffer; if queue is empty blocks until it is not, or
    -
    540 * the specified time passes, whichever happens first. Returns `true` on success; `false` on timeout or error.
    -
    541 * On `true` `blob->size()` is modified to store the # of bytes received.
    -
    542 * A null blob (`blob->size() == 0` post-condition) is possible.
    -
    543 *
    -
    544 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    545 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    -
    546 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    -
    547 *
    -
    548 * @warning Read the warning on timed_send() about the accuracy of the timeout. Same applies here.
    -
    549 *
    -
    550 * @param blob
    -
    551 * See try_receive().
    -
    552 * @param timeout_from_now
    -
    553 * Now + (this long) = the timeout time point.
    -
    554 * @param err_code
    -
    555 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    556 * various. Would-block shall not be emitted. Timeout shall not be emitted.
    -
    557 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    -
    558 * max_msg_size()).
    -
    559 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    -
    560 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    -
    561 * between timeout and fatal error.
    -
    562 */
    -
    563 bool timed_receive(util::Blob_mutable* blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    564
    -
    565 /**
    -
    566 * Equivalent to try_receive() except stops short of reading anything, with `true` result indicating that
    -
    567 * try_receive() *would* work at that moment.
    -
    568 *
    -
    569 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    570 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    -
    571 * below; this is not fatal to `*this.
    -
    572 *
    -
    573 * @param err_code
    -
    574 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    575 * various. Would-block shall not be emitted.
    -
    576 * error::Code::S_INTERRUPTED (preempted by interrupt_receives()).
    -
    577 * @return `true` if transmissible; `false` if not, or on error.
    -
    578 */
    -
    579 bool is_receivable(Error_code* err_code = 0);
    -
    580
    -
    581 /**
    -
    582 * Equivalent to receive() except stops short of reading anything, with non-error return indicating that
    -
    583 * try_receive() *would* work at that moment. It shall block indefinitely until fatal error, or
    -
    584 * error::Code::S_INTERRUPTED, or transmissibility.
    -
    585 *
    -
    586 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    587 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    -
    588 * below; this is not fatal to `*this.
    -
    589 *
    -
    590 * @param err_code
    -
    591 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    592 * various. Would-block shall not be emitted.
    -
    593 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    -
    594 */
    -
    595 void wait_receivable(Error_code* err_code = 0);
    -
    596
    -
    597 /**
    -
    598 * Equivalent to timed_receive() except stops short of reading anything, with `true` result indicating that
    -
    599 * try_receive() *would* work at that moment. It shall block until fatal error, or
    -
    600 * error::Code::S_INTERRUPTED, or timeout, or transmissibility.
    -
    601 *
    -
    602 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    -
    603 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    -
    604 * below; this is not fatal to `*this.
    -
    605 *
    -
    606 * @param timeout_from_now
    -
    607 * See timed_receive().
    -
    608 * @param err_code
    -
    609 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    -
    610 * various. Would-block shall not be emitted.
    -
    611 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    -
    612 * @return `true` if transmissible; `false` if not, or on error or timeout; in the latter case `*err_code`
    -
    613 * distinguishes between timeout and fatal error.
    -
    614 */
    -
    615 bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    616
    -
    617 /**
    -
    618 * Enables sends-interrupted mode: is_sendable() (future calls), send() (future or concurrent calls),
    -
    619 * timed_send() (ditto), wait_sendable() (ditto), timed_wait_sendable() (ditto) shall emit
    -
    620 * error::Code::S_INTERRUPTED as soon as possible.
    -
    621 *
    -
    622 * @return `true` on success; `false` is already enabled.
    -
    623 */
    - -
    625
    -
    626 /**
    -
    627 * Disables mode enabled by interrupt_sends().
    -
    628 *
    -
    629 * @return `true` on success; `false` if already disabled.
    -
    630 */
    - -
    632
    -
    633 /**
    -
    634 * Enables receives-interrupted mode: is_receivable() (future calls), receive() (future or concurrent calls),
    -
    635 * timed_receive() (ditto), wait_receivable() (ditto), timed_wait_receivable() (ditto) shall emit
    -
    636 * error::Code::S_INTERRUPTED as soon as possible.
    -
    637 *
    -
    638 * @return `true` on success; `false` is already enabled.
    -
    639 */
    - -
    641
    -
    642 /**
    -
    643 * Disables mode enabled by interrupt_receives().
    -
    644 *
    -
    645 * @return `true` on success; `false` if already disabled.
    -
    646 */
    - -
    648
    -
    649 /**
    -
    650 * Returns name equal to `absolute_name` passed to ctor.
    -
    651 * @return See above.
    -
    652 */
    - -
    654
    -
    655 /**
    -
    656 * Returns the max message size of the underlying queue. This should at least approximately equal
    -
    657 * what was passed to ctor when creating the MQ; however the underlying transport may tweak it, such as rounding
    -
    658 * to page size.
    -
    659 *
    -
    660 * @return See above.
    -
    661 */
    -
    662 size_t max_msg_size() const;
    -
    663
    -
    664 /**
    -
    665 * Returns the max message count of the underlying queue. This should at least approximately equal
    -
    666 * what was passed to ctor when creating the MQ; however the underlying transport may tweak it if it desires.
    -
    667 *
    -
    668 * @return See above.
    -
    669 */
    -
    670 size_t max_n_msgs() const;
    -
    671
    -
    672 /**
    -
    673 * Available if and only if #S_HAS_NATIVE_HANDLE is `true`: Returns the stored native MQ handle; null means a
    -
    674 * constructor failed, or `*this` has been moved-from, hence the handle is to not-a-queue.
    -
    675 * See class doc header for important background discussion w/r/t the rationale behind this method.
    -
    676 *
    -
    677 * Medium-length story short: this is (in Linux impl of POSIX MQ) really an FD and as such can
    -
    678 * be wrapped via `boost::asio::posix::descriptor` and hence participate
    -
    679 * in a `Task_engine` event loop which internally will use `epoll()` together with all the other waited-on
    -
    680 * resources; or simply be `poll()`ed (etc.). E.g., boost.asio `async_wait()` for readability;
    -
    681 * then invoke `this->try_receive()` once it is readable.
    -
    682 *
    -
    683 * Behavior is undefined if you operate on this value, such as sending or receiving, concurrently to any
    -
    684 * transmission APIs acting on `*this`.
    -
    685 *
    -
    686 * @note It is possible to get away with not using this by using the `*_sendable()` and `*_receivable()`
    -
    687 * methods. However the blocking and timed variations cannot be straightforwardly interrupted.
    -
    688 *
    -
    689 * @return See above.
    -
    690 */
    - -
    692}; // class Persistent_mq_handle
    -
    693
    -
    694// Free functions.
    -
    695
    -
    696/**
    -
    697 * Swaps two objects. Constant-time. Suitable for standard ADL-swap pattern `using std::swap; swap(val1, val2);`.
    -
    698 *
    -
    699 * @relatesalso Persistent_mq_handle
    -
    700 *
    -
    701 * @param val1
    -
    702 * Object.
    -
    703 * @param val2
    -
    704 * Object.
    -
    705 */
    - -
    707
    -
    708} // namespace ipc::transport
    -
    A documentation-only concept defining the behavior of an object representing a light-weight handle to...
    +
    22static_assert(false, "As of this writing this is a documentation-only \"header\" "
    +
    23 "(the \"source\" is for humans and Doxygen only).");
    +
    24#else // ifdef IPC_DOXYGEN_ONLY
    +
    25
    +
    26namespace ipc::transport
    +
    27{
    +
    28
    +
    29// Types.
    +
    30
    +
    31/**
    +
    32 * A documentation-only *concept* defining the behavior of an object representing a light-weight handle
    +
    33 * to a message queue, capable of receiving/sending discrete messages in non-blocking/blocking/timed-blocking
    +
    34 * fashion, as well as some support for polling/waiting and interruptions thereof. The message queue (MQ)
    +
    35 * is assumed to be of at least kernel persistence, meaning a handle to an MQ
    +
    36 * closing does not delete the MQ, and another handle may reattach to it; in order to delete the underlying MQ
    +
    37 * a separate remove op is needed (and is provided as well as a `static` method).
    +
    38 *
    +
    39 * ### How to use ###
    +
    40 * The following are relevant operations to do with MQs. (Read Rationale for background.)
    +
    41 * - Create (named) MQ: Persistent_mq_handle() ctor, with either util::Create_only or util::Open_or_create tag arg.
    +
    42 * A Shared_name specifies the name.
    +
    43 * If one does not need a handle simply destroy the resulting object: the underlying created MQ continues existing.
    +
    44 * - Create handle to the (named) MQ: Persistent_mq_handle() ctor, with either util::Open_only or
    +
    45 * util::Open_or_create tag arg.
    +
    46 * A Shared_name specifies the name.
    +
    47 * - Send message into the MQ, via handle: try_send() (non-blocking), send() (blocking), timed_send() (blocking with
    +
    48 * timeout).
    +
    49 * - Await writability without writing: is_sendable() (instant poll), wait_sendable() (blocking),
    +
    50 * timed_wait_sendable() (blocking with timeout).
    +
    51 * - Interrupt and/or preempt all above blocking operations including concurrently/preempt is_sendable():
    +
    52 * interrupt_sends(). Undo: allow_sends().
    +
    53 * - Receive message out of the MQ, via handle: try_receive() (non-blocking), receive() (blocking),
    +
    54 * timed_receive() (blocking with timeout).
    +
    55 * - Await readability without reading: is_receivable() (instant poll), wait_receivable() (blocking),
    +
    56 * timed_wait_receivable() (blocking with timeout).
    +
    57 * - Interrupt and/or preempt all above blocking operations including concurrently/preempt is_receivable():
    +
    58 * interrupt_receives(). Undo: allow_receives().
    +
    59 * - Destroy handle to the MQ: ~Persistent_mq_handle() destructor. The underlying MQ continues existing.
    +
    60 * - Destroy (named) MQ: remove_persistent(). Underlying MQ name disappears, but MQ continues existing until
    +
    61 * all handles machine-wide are closed. A Shared_name specifies the name.
    +
    62 *
    +
    63 * ### Thread safety ###
    +
    64 * Concurrent ops safe on different objects (including when the same-named queue is being accessed).
    +
    65 * Concurrent non-`const` ops (where at least 1 is non-`const`) not safe on the same `*this`.
    +
    66 *
    +
    67 * The notable exception to the latter: each of `interrupt_*()` and `allow_*()` is safe to call on the same
    +
    68 * `*this` concurrently to any method except `interrupt_*()` and `allow_*()` themselves. In fact
    +
    69 * `interrupt_*()` ability to interrupt a concurrent timed-waiting of infinitely-waiting read or write is
    +
    70 * most of those methods' utility.
    +
    71 *
    +
    72 * ### Rationale ###
    +
    73 * Here's why this concept exists and how it was designed to be the way it is. It's actually quite simple;
    +
    74 * the only question is why it is this way and not some other way. Update: It's somewhat less simple now but not bad.
    +
    75 *
    +
    76 * ipc::transport features the Blob_sender and Blob_receiver concepts, each of which is a peer endpoint of a
    +
    77 * connected one-way pipe capable of transmitting discrete messages, each consisting of a binary blob.
    +
    78 * They are first-class citizens of ipc::transport, or at least of its core-layer portion, meaning they're likely
    +
    79 * to be used by the user directly or at least in highly visible fashion by another aspect of ipc::transport impl.
    +
    80 * They have a vaguely socket-like API, with an asynchronous receive method and a convenient non-blocking/synchronous
    +
    81 * sender method (that cannot yield would-block). Lastly the destructor of either ensures the underlying transport
    +
    82 * cannot be used again by somehow opening another handle to the same thing.
    +
    83 *
    +
    84 * One implementation of Blob_sender and Blob_receiver simultaneously might be Native_socket_stream which
    +
    85 * uses Unix domain stream connection as underlying transport. That one is a natural fit for the concept,
    +
    86 * including the fact that closing a Unix domain socket hoses the connection entirely (one cannot somehow "reattach"
    +
    87 * to it). It's good. However, benchmark tests (details omitted) show that, when need not also send native handles
    +
    88 * over such a connection, *message queue* low-level transports might be more performant or at least competitive.
    +
    89 *
    +
    90 * In our ecosystem, two message queue (MQ) transports are candidates: the POSIX message queue (provided by Linux)
    +
    91 * (see `man mq_overview`) and the boost.interprocess (bipc) message queue (web-search for
    +
    92 * `boost::interprocess::message_queue`). We wanted to support both and then provide the choice of which one to use.
    +
    93 * So the goal is to write Blob_sender and Blob_receiver concept impls for each type of MQ (and possibly others
    +
    94 * over time). So how to do that nicely?
    +
    95 *
    +
    96 * The 2 low-level MQ APIs (POSIX MQ and bipc MQ) are extremely different, conceptually and in practice, from
    +
    97 * stream socket APIs of any kind. For one thing, the MQs have kernel persistence -- they're like files in memory that
    +
    98 * disappear at reboot but otherwise stay around, so one can reattach a handle to one even after closing another one;
    +
    99 * and deleting it is a separate operation not involving any handle. For another, they don't use socket-descriptors
    +
    100 * and hence do not participate in `epoll/poll/select()` mechanisms and feature only blocking, non-blocking, and
    +
    101 * blocking-with-timeout send and receive APIs. (POSIX MQ does have `mq_notify()`, but this async-notify mechanism
    +
    102 * is quite limited, either creating a new thread for each notification, or using a signal. POSIX MQ in Linux
    +
    103 * *does* happen to have a non-portable property wherein the descriptor is really an FD, so it *can* participate
    +
    104 * in `epoll/poll/select()` mechanisms; and boost.asio *does* have a `posix::descriptor` that can wrap such a
    +
    105 * native descriptor. However: bipc MQ lacks anything like this at all.)
    +
    106 *
    +
    107 * The 2 APIs are, however, extremely similar to each other. In fact, one gets the impression that the authors
    +
    108 * of bipc MQ considered wrapping POSIX MQs but reconsidered for whatever reason (maybe the obscure limit semantics,
    +
    109 * lack of availability in all Linux versions and other Unixes and Windows) -- but fairly closely mirrored the API
    +
    110 * therein.
    +
    111 *
    +
    112 * Knowing this, it looked pretty natural to write some Blob_sender/Blob_receiver impls holding
    +
    113 * some `bipc::message_queue` handles internally. However, while conceptually similar, the POSIX MQ API is a
    +
    114 * C API, not a Boost-style C++ thing. It would be entirely possible to still write Blob_sender/Blob_receiver impls
    +
    115 * around this API, but since conceptually it's so similar to bipc MQ, why waste the effort? Code reuse for the win.
    +
    116 *
    +
    117 * That brings us to this concept. What it is is: A thing I (ygoldfel) came up with by simply taking
    +
    118 * `bipc::message_queue` and working backwards, making a concept for an MQ handle, Persistent_mq_handle, to which
    +
    119 * `bipc::message_queue` directly conforms already in most key ways (to wit: the send/receive methods).
    +
    120 * Then one could write a very thin non-polymorphic HAS-A wrapper class (with no added data stored) and a couple other
    +
    121 * utility functions with very thin adaptations to match ipc::transport style (like using Shared_name instead of
    +
    122 * strings when creating or removing kernel-persistent queue instances). This class is Bipc_mq_handle; it
    +
    123 * implements this Persistent_mq_handle.
    +
    124 *
    +
    125 * Next, a class can be written to mirror this API but for POSIX MQs. This is a little harder, since it can't just
    +
    126 * expose some existing super-class's send/receive functions, but it would just wrap the Linux C API and store
    +
    127 * an MQ handle; done. This class is Posix_mq_handle; it also implements Persistent_mq_handle.
    +
    128 *
    +
    129 * Now that Persistent_mq_handle provides a uniform API, a Blob_sender/Blob_receiver can be written around a
    +
    130 * `typename Persistent_mq_handle` which can be either Bipc_mq_handle or Posix_mq_handle (or a future wrapper around
    +
    131 * something else).
    +
    132 *
    +
    133 * ### Poll/wait and interrupt facilities ###
    +
    134 * Somewhat later we added a major feature to the concept (and both known impls): For each type of transmission
    +
    135 * operation in a given direction (instant poll, blocking, blocking with timeout), there is a poll/wait counterpart
    +
    136 * which is almost the same except it does not actually transmit but merely returns the fact transmission
    +
    137 * is possible. E.g., try_receive() <=> is_receivable(), receive() <=> wait_receivable(),
    +
    138 * timed_receive() <=> timed_wait_receivable(). In fact -- in the absence of a competing `*this` --
    +
    139 * receive() = wait_receivable() + try_receive() (succeeds), timed_receive() = timed_wait_receivable() + try_receive()
    +
    140 * (succeeds).
    +
    141 *
    +
    142 * This is useful at least in that it allows one to defer deciding on a target buffer for receiving, until
    +
    143 * receiving would (probably) actually work. In the other direction it can still provide useful flexibility in
    +
    144 * a multi-threaded setup (one thread blockingly-waits, the other is signaled about readiness and tries to
    +
    145 * transmit but without blocking -- useful in a thread U/thread W setup).
    +
    146 *
    +
    147 * Lastly, any blocking (with or without timeout) can be interrupted via the `interrupt_*()` methods.
    +
    148 * For example a receive() or wait_receivable() may be ongoing in thread W, and thread U can interrupt_receives()
    +
    149 * to immediately make the blocking op exit with error::Code::S_INTERRUPTED.
    +
    150 *
    +
    151 * ### Discussion: The road to boost.asio-like async I/O ###
    +
    152 * What would be cool, which isn't here, is if this concept described a boost.asio I/O object, capable of plugging
    +
    153 * into a boost.asio loop; or ~equivalently something a-la Blob_sender and/or Blob_receiver. However that was not
    +
    154 * our aim -- we only want a thin wrapper as noted in "Rationale" above -- and Blob_stream_mq_receiver and
    +
    155 * Blob_stream_mq_sender achieve it (and arguably more -- albeit with the limit of a single writer and single reader).
    +
    156 * That said: it may be useful to contemplate what parts the concept does have that are conducive to that type of work.
    +
    157 *
    +
    158 * Without the poll/wait facilities combined with interrupt facilities, it was possible but somewhat clunky,
    +
    159 * having to at least start a background thread in which to perform blocking transmit calls; they'd have to
    +
    160 * be broken up into subject-to-timeout shorter calls, so that the thread could be stopped and joined during
    +
    161 * deinit. Even then full deinit could only occur with a potential pause until the current short call in the
    +
    162 * background thread W could return. By having thread W do (indefinite) waits only, and allowing thread U to
    +
    163 * do non-blocking transmits only *and* `interrupt_*()`, we achieve pretty good flexibility and responsiveness.
    +
    164 * That is what Blob_stream_mq_sender and Blob_stream_mq_receiver can do given the present concept.
    +
    165 *
    +
    166 * However -- it *can* be more advanced still. Consider the specific impl Posix_mq_handle, which has the
    +
    167 * additional-to-concept (edit: see below update) method Posix_mq_handle::native_handle(); in Linux a #Native_handle.
    +
    168 * This can be waited-on, natively with `[e]poll*()`; with boost.asio via util::sync_io::Asio_waitable_native_handle
    +
    169 * (more or less a `boost::asio::posix::descriptor`). *Now* no background thread W is necessary: thread U
    +
    170 * can ask the *kernel* to report readability/writability -- when active it can do non-blocking stuff.
    +
    171 *
    +
    172 * The wrinkle: Posix_mq_handle has it; but Bipc_mq_handle does not (and there is no FD inside its impl either;
    +
    173 * it is fully SHM-based internally). Can it be generalized nevertheless? Yes and no. Yes: in that it can be
    +
    174 * simulated by "secretly" having a thread W and having it use a pipe (or something) to translate readable/writable
    +
    175 * events into a live FD that could be detected via `[e]poll*()` or boost.asio. No: in that it turns a
    +
    176 * hypothetical Persistent_mq_handle impl, namely Bipc_mq_handle, into something complex as opposed to any kind
    +
    177 * of thin wrapper around an MQ API. Therefore we did not do it.
    +
    178 *
    +
    179 * However -- we did ~such a thing with sync_io::Blob_stream_mq_sender and sync_io::Blob_stream_mq_receiver which
    +
    180 * are templated on Persistent_mq_handle as a template-parameter; and, being
    +
    181 * `sync_io`-pattern-impls (see util::sync_io), they each expose a waitable-on #Native_handle.
    +
    182 * Indeed as of this writing each of these templates keeps a "secret" thread W that performs
    +
    183 * blocking waits, while the user-accessible API makes it look like a nice, kernel-reported-via-FDs
    +
    184 * reactor/proactor-supporting I/O object. By operating on what is directly available via the present concept,
    +
    185 * this setup of Blob_stream_mq_sender and Blob_stream_mq_receiver internals is agnostic to the type of MQ.
    +
    186 *
    +
    187 * However, if one wanted to take advantage of the non-concept (edit: see below update) ability to be watched
    +
    188 * (via FD) with the kernel's help and without an added thread, they could specialize `Blob_stream_mq_*er`
    +
    189 * for Posix_mq_handle which does offer a kernel-FD accessor `.native_handle()`. Update: This is now done
    +
    190 * (in fact it is not specialized as of this writing but rather uses a few simple `if constexpr
    +
    191 * ()`s). Accordingly the concept now allows for `native_handle()` optionally: see
    +
    192 * Persistent_mq_handle::S_HAS_NATIVE_HANDLE.
    +
    193 */
    +
    194class Persistent_mq_handle // Note: movable but not copyable.
    +
    195{
    +
    196public:
    +
    197 // Constants.
    +
    198
    +
    199 /// Shared_name relative-folder fragment (no separators) identifying this resource type.
    + +
    201
    +
    202 /// `true` if and only if native_handle() method exists, and the returned value may be waited-on by `poll()`/etc.
    +
    203 static constexpr bool S_HAS_NATIVE_HANDLE = unspecified;
    +
    204
    +
    205 // Constructors/destructor.
    +
    206
    +
    207 /**
    +
    208 * Construct null handle, suitable only for being subsequently moved-to or destroyed.
    +
    209 * If you do anything on `*this`, other than invoking dtor or move-assignment, behavior is undefined.
    +
    210 */
    + +
    212
    +
    213 /**
    +
    214 * Construct handle to non-existing named MQ, creating it first. If it already exists, it is an error.
    +
    215 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    +
    216 * move-assignment, behavior is undefined.
    +
    217 *
    +
    218 * @param logger_ptr
    +
    219 * Logger to use for subsequently logging.
    +
    220 * @param absolute_name
    +
    221 * Absolute name at which the persistent MQ lives.
    +
    222 * @param mode_tag
    +
    223 * API-choosing tag util::CREATE_ONLY.
    +
    224 * @param perms
    +
    225 * Permissions to use for creation. Suggest the use of util::shared_resource_permissions() to translate
    +
    226 * from one of a small handful of levels of access; these apply almost always in practice.
    +
    227 * The applied permissions shall *ignore* the process umask and shall thus exactly match `perms`,
    +
    228 * unless an error occurs.
    +
    229 * @param max_n_msg
    +
    230 * Max # of unpopped messages in created queue.
    +
    231 * @param max_msg_sz
    +
    232 * Max # of bytes in any one message in created queue.
    +
    233 * @param err_code
    +
    234 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    235 * various. Most likely creation failed due to permissions, or it already existed.
    +
    236 */
    +
    237 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    238 util::Create_only mode_tag, size_t max_n_msg, size_t max_msg_sz,
    +
    239 const util::Permissions& perms = util::Permissions(),
    +
    240 Error_code* err_code = 0);
    +
    241
    +
    242 /**
    +
    243 * Construct handle to existing named MQ, or else if it does not exist creates it first and opens it (atomically).
    +
    244 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    +
    245 * move-assignment, behavior is undefined.
    +
    246 *
    +
    247 * @param logger_ptr
    +
    248 * Logger to use for subsequently logging.
    +
    249 * @param absolute_name
    +
    250 * Absolute name at which the persistent MQ lives.
    +
    251 * @param mode_tag
    +
    252 * API-choosing tag util::OPEN_OR_CREATE.
    +
    253 * @param perms_on_create
    +
    254 * Permissions to use if creation is required. Suggest the use of util::shared_resource_permissions() to
    +
    255 * translate from one of a small handful of levels of access; these apply almost always in practice.
    +
    256 * The applied permissions shall *ignore* the process umask and shall thus exactly match `perms_on_create`,
    +
    257 * unless an error occurs.
    +
    258 * @param max_n_msg_on_create
    +
    259 * Max # of unpopped messages in created queue if creation is required.
    +
    260 * @param max_msg_sz_on_create
    +
    261 * Max # of bytes in any one message in created queue if creation is required.
    +
    262 * @param err_code
    +
    263 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    264 * various. Most likely creation failed due to permissions.
    +
    265 */
    +
    266 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    267 util::Open_or_create mode_tag, size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    +
    268 const util::Permissions& perms_on_create = util::Permissions(),
    +
    269 Error_code* err_code = 0);
    +
    270
    +
    271 /**
    +
    272 * Construct handle to existing named MQ. If it does not exist, it is an error.
    +
    273 * If an error is emitted via `*err_code`, and you do anything on `*this` other than invoking dtor or
    +
    274 * move-assignment, behavior is undefined.
    +
    275 *
    +
    276 * @param logger_ptr
    +
    277 * Logger to use for subsequently logging.
    +
    278 * @param absolute_name
    +
    279 * Absolute name at which the persistent MQ lives.
    +
    280 * @param mode_tag
    +
    281 * API-choosing tag util::OPEN_ONLY.
    +
    282 * @param err_code
    +
    283 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    284 * various. Most likely it already existed.
    +
    285 */
    +
    286 explicit Persistent_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    287 util::Open_only mode_tag, Error_code* err_code = 0);
    +
    288
    +
    289 /**
    +
    290 * Constructs handle from the source handle while making the latter invalid.
    +
    291 * If you do anything on `src` after this, other than invoking dtor or move-assignment, behavior is undefined.
    +
    292 *
    +
    293 * Informally: this is a light-weight op.
    +
    294 *
    +
    295 * @param src
    +
    296 * Source object which is nullified.
    +
    297 */
    + +
    299
    +
    300 /// Copying of handles is prohibited.
    + +
    302
    +
    303 /**
    +
    304 * Destroys this handle (or no-op if no handle was successfully constructed, or if it's a moved-from or default-cted
    +
    305 * handle). The underlying MQ (if any) is *not* destroyed and can be attached-to by another handle.
    +
    306 */
    + +
    308
    +
    309 // Methods.
    +
    310
    +
    311 /**
    +
    312 * Replaces handle with the source handle while making the latter invalid.
    +
    313 * If you do anything on `src` after this, other than invoking dtor or move-assignment, behavior is undefined.
    +
    314 *
    +
    315 * Informally: this is a light-weight op.
    +
    316 *
    +
    317 * @param src
    +
    318 * Source object which is nullified.
    +
    319 * @return `*this`.
    +
    320 */
    + +
    322
    +
    323 /// Copying of handles is prohibited.
    + +
    325
    +
    326 /**
    +
    327 * Removes the named persistent MQ. The name `name` is removed from the system immediately; and
    +
    328 * the function is non-blocking. However the underlying MQ if any continues to exist until all handles to it are
    +
    329 * closed; their presence in this or other process is *not* an error.
    +
    330 *
    +
    331 * @see `util::remove_each_persistent_*`() for a convenient way to remove more than one item. E.g.,
    +
    332 * `util::remove_each_persistent_with_name_prefix<Pool_arena>()` combines remove_persistent() and
    +
    333 * for_each_persistent() in a common-sense way to remove only those `name`s starting with a given prefix;
    +
    334 * or simply all of them.
    +
    335 *
    +
    336 * Trying to remove a non-existent name *is* an error.
    +
    337 *
    +
    338 * Logs INFO message.
    +
    339 *
    +
    340 * @warning The impl should be carefully checked to conform to this. As of this writing the 2 relevant
    +
    341 * low-level MQ APIs (bipc and POSIX) do, but there could be more.
    +
    342 *
    +
    343 * @param logger_ptr
    +
    344 * Logger to use for subsequently logging.
    +
    345 * @param name
    +
    346 * Absolute name at which the persistent MQ lives.
    +
    347 * @param err_code
    +
    348 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    349 * various.
    +
    350 */
    +
    351 static void remove_persistent(flow::log::Logger* logger_ptr, const Shared_name& name,
    +
    352 Error_code* err_code = 0);
    +
    353
    +
    354 /**
    +
    355 * Lists all named persistent MQs currently persisting, invoking the given handler synchronously on each one.
    +
    356 *
    +
    357 * Note that, in a sanely set-up OS install, all existing pools will be listed by this function;
    +
    358 * but permissions/ownership may forbid certain operations the user may typically want to invoke on
    +
    359 * a given listed name -- for example remove_persistent(). This function does *not* filter-out any
    +
    360 * potentially inaccessible items.
    +
    361 *
    +
    362 * @tparam Handle_name_func
    +
    363 * Function object matching signature `void F(const Shared_name&)`.
    +
    364 * @param handle_name_func
    +
    365 * `handle_name_func()` shall be invoked for each (matching, if applicable) item. See `Handle_name_func`.
    +
    366 */
    +
    367 template<typename Handle_name_func>
    +
    368 static void for_each_persistent(const Handle_name_func& handle_name_func);
    +
    369
    +
    370 /**
    +
    371 * Non-blocking send: pushes copy of message to queue and returns `true`; if queue is full then no-op and returns
    +
    372 * `false`. A null blob (`blob.size() == 0`) is allowed.
    +
    373 *
    +
    374 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    375 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    +
    376 * documented below, is emitted; this is not fatal to `*this`.
    +
    377 *
    +
    378 * @param blob
    +
    379 * Buffer to copy into MQ; if empty then an empty message is pushed.
    +
    380 * @param err_code
    +
    381 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    382 * various. Would-block shall not be emitted.
    +
    383 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    +
    384 * max_msg_size()).
    +
    385 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    +
    386 * between would-block and fatal error.
    +
    387 */
    +
    388 bool try_send(const util::Blob_const& blob, Error_code* err_code = 0);
    +
    389
    +
    390 /**
    +
    391 * Blocking send: pushes copy of message to queue; if queue is full blocks until it is not.
    +
    392 * A null blob (`blob.size() == 0`) is allowed.
    +
    393 *
    +
    394 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    395 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    +
    396 * documented below, is emitted; this is not fatal to `*this`. Exception to this: interrupt_sends()
    +
    397 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    +
    398 *
    +
    399 * @param blob
    +
    400 * See try_send().
    +
    401 * @param err_code
    +
    402 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    403 * various. Would-block shall not be emitted.
    +
    404 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    +
    405 * max_msg_size()).
    +
    406 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    +
    407 */
    +
    408 void send(const util::Blob_const& blob, Error_code* err_code = 0);
    +
    409
    +
    410 /**
    +
    411 * Blocking timed send: pushes copy of message to queue; if queue is full blocks until it is not, or the
    +
    412 * specified time passes, whichever happens first. Returns `true` on success; `false` on timeout or error.
    +
    413 * A null blob (`blob.size() == 0`) is allowed.
    +
    414 *
    +
    415 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    416 * Exception to this: If `blob.size()` exceeds message size limit (if any), a particular error, which shall be
    +
    417 * documented below, is emitted; this is not fatal to `*this`. Exception to this: interrupt_sends()
    +
    418 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    +
    419 *
    +
    420 * @warning The user must not count on precision/stability -- unlike with, say, boost.asio timers -- here.
    +
    421 * If timing precision is required, the user will have to add an async layer with more precise timing
    +
    422 * and not rely on this. For example, informally, suggest: Use timed_send() with 250msec increments
    +
    423 * to model an interruptible indefinitely-blocking send(). In a parallel thread, if it's time to
    +
    424 * interrupt the modeled endless send(), set some flag that'll cause the 250msec-long attempts to cease.
    +
    425 * The last one (that straddles the interruption point) can just be ignored.
    +
    426 *
    +
    427 * @param blob
    +
    428 * See try_send().
    +
    429 * @param timeout_from_now
    +
    430 * Now + (this long) = the timeout time point.
    +
    431 * @param err_code
    +
    432 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    433 * various. Would-block shall not be emitted. Timeout shall not be emitted.
    +
    434 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (excessive-size error: buffer exceeds
    +
    435 * max_msg_size()).
    +
    436 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    +
    437 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    +
    438 * between timeout and fatal error.
    +
    439 */
    +
    440 bool timed_send(const util::Blob_const& blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    441
    +
    442 /**
    +
    443 * Equivalent to try_send() except stops short of writing anything, with `true` result indicating that
    +
    444 * try_send() *would* work at that moment.
    +
    445 *
    +
    446 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    447 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    +
    448 * below; this is not fatal to `*this.
    +
    449 *
    +
    450 * @param err_code
    +
    451 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    452 * various. Would-block shall not be emitted.
    +
    453 * error::Code::S_INTERRUPTED (preempted by interrupt_sends()).
    +
    454 * @return `true` if transmissible; `false` if not, or on error.
    +
    455 */
    +
    456 bool is_sendable(Error_code* err_code = 0);
    +
    457
    +
    458 /**
    +
    459 * Equivalent to send() except stops short of writing anything, with non-error return indicating that
    +
    460 * try_send() *would* work at that moment. It shall block indefinitely until fatal error, or
    +
    461 * error::Code::S_INTERRUPTED, or transmissibility.
    +
    462 *
    +
    463 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    464 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    +
    465 * below; this is not fatal to `*this.
    +
    466 *
    +
    467 * @param err_code
    +
    468 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    469 * various. Would-block shall not be emitted.
    +
    470 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    +
    471 */
    +
    472 void wait_sendable(Error_code* err_code = 0);
    +
    473
    +
    474 /**
    +
    475 * Equivalent to timed_send() except stops short of writing anything, with `true` result indicating that
    +
    476 * try_send() *would* work at that moment. It shall block until fatal error, or
    +
    477 * error::Code::S_INTERRUPTED, or timeout, or transmissibility.
    +
    478 *
    +
    479 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    480 * Exception to this: interrupt_sends() leads to the emission of a particular error which shall be documented
    +
    481 * below; this is not fatal to `*this.
    +
    482 *
    +
    483 * @param timeout_from_now
    +
    484 * See timed_send().
    +
    485 * @param err_code
    +
    486 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    487 * various. Would-block shall not be emitted.
    +
    488 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_sends()).
    +
    489 * @return `true` if transmissible; `false` if not, or on error or timeout; in the latter case `*err_code`
    +
    490 * distinguishes between timeout and fatal error.
    +
    491 */
    +
    492 bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    493
    +
    494 /**
    +
    495 * Non-blocking receive: pops copy of message from queue into buffer and returns `true`; if queue is empty then no-op
    +
    496 * and returns `false`. On `true` `blob->size()` is modified to store the # of bytes received.
    +
    497 * A null blob (`blob->size() == 0` post-condition) is possible.
    +
    498 *
    +
    499 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    500 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    +
    501 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    +
    502 *
    +
    503 * @param blob
    +
    504 * Buffer into which to copy into MQ and whose `->size()` to update to the # of bytes received;
    +
    505 * if message empty it is set to zero. Original `->size()` value indicates capacity of buffer;
    +
    506 * if this is insufficient based on either the popped message size or an upper limit (if any), it is an error.
    +
    507 * @param err_code
    +
    508 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    509 * various. Would-block shall not be emitted.
    +
    510 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    +
    511 * max_msg_size()).
    +
    512 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    +
    513 * between would-block and fatal error.
    +
    514 */
    +
    515 bool try_receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    +
    516
    +
    517 /**
    +
    518 * Blocking receive: pops copy of message from queue into buffer; if queue is empty blocks until it is not.
    +
    519 * On `true` `blob->size()` is modified to store the # of bytes received.
    +
    520 * A null blob (`blob->size() == 0` post-condition) is possible.
    +
    521 *
    +
    522 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    523 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    +
    524 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    +
    525 * Exception to this: interrupt_receives()
    +
    526 * leads to the emission of a particular error which shall be documented below; this is not fatal to `*this.
    +
    527 *
    +
    528 * @param blob
    +
    529 * See try_receive().
    +
    530 * @param err_code
    +
    531 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    532 * various. Would-block shall not be emitted.
    +
    533 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    +
    534 * max_msg_size()).
    +
    535 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    +
    536 */
    +
    537 void receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    +
    538
    +
    539 /**
    +
    540 * Blocking timed receive: pops copy of message from queue into buffer; if queue is empty blocks until it is not, or
    +
    541 * the specified time passes, whichever happens first. Returns `true` on success; `false` on timeout or error.
    +
    542 * On `true` `blob->size()` is modified to store the # of bytes received.
    +
    543 * A null blob (`blob->size() == 0` post-condition) is possible.
    +
    544 *
    +
    545 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    546 * Exception to this: If `blob->size()` is less than the required message size (or upper limit on this, if any),
    +
    547 * a particular error, which shall be documented below, is emitted; this is not fatal to `*this`.
    +
    548 *
    +
    549 * @warning Read the warning on timed_send() about the accuracy of the timeout. Same applies here.
    +
    550 *
    +
    551 * @param blob
    +
    552 * See try_receive().
    +
    553 * @param timeout_from_now
    +
    554 * Now + (this long) = the timeout time point.
    +
    555 * @param err_code
    +
    556 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    557 * various. Would-block shall not be emitted. Timeout shall not be emitted.
    +
    558 * error::Code::S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW (size-underflow error: buffer is smaller than
    +
    559 * max_msg_size()).
    +
    560 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    +
    561 * @return `true` on success; `false` on failure; in the latter case `*err_code` distinguishes
    +
    562 * between timeout and fatal error.
    +
    563 */
    +
    564 bool timed_receive(util::Blob_mutable* blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    565
    +
    566 /**
    +
    567 * Equivalent to try_receive() except stops short of reading anything, with `true` result indicating that
    +
    568 * try_receive() *would* work at that moment.
    +
    569 *
    +
    570 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    571 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    +
    572 * below; this is not fatal to `*this.
    +
    573 *
    +
    574 * @param err_code
    +
    575 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    576 * various. Would-block shall not be emitted.
    +
    577 * error::Code::S_INTERRUPTED (preempted by interrupt_receives()).
    +
    578 * @return `true` if transmissible; `false` if not, or on error.
    +
    579 */
    +
    580 bool is_receivable(Error_code* err_code = 0);
    +
    581
    +
    582 /**
    +
    583 * Equivalent to receive() except stops short of reading anything, with non-error return indicating that
    +
    584 * try_receive() *would* work at that moment. It shall block indefinitely until fatal error, or
    +
    585 * error::Code::S_INTERRUPTED, or transmissibility.
    +
    586 *
    +
    587 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    588 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    +
    589 * below; this is not fatal to `*this.
    +
    590 *
    +
    591 * @param err_code
    +
    592 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    593 * various. Would-block shall not be emitted.
    +
    594 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    +
    595 */
    +
    596 void wait_receivable(Error_code* err_code = 0);
    +
    597
    +
    598 /**
    +
    599 * Equivalent to timed_receive() except stops short of reading anything, with `true` result indicating that
    +
    600 * try_receive() *would* work at that moment. It shall block until fatal error, or
    +
    601 * error::Code::S_INTERRUPTED, or timeout, or transmissibility.
    +
    602 *
    +
    603 * If error is emitted, `*this` shall be considered hosed: Behavior is undefined except dtor or move-assignment.
    +
    604 * Exception to this: interrupt_receives() leads to the emission of a particular error which shall be documented
    +
    605 * below; this is not fatal to `*this.
    +
    606 *
    +
    607 * @param timeout_from_now
    +
    608 * See timed_receive().
    +
    609 * @param err_code
    +
    610 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
    +
    611 * various. Would-block shall not be emitted.
    +
    612 * error::Code::S_INTERRUPTED (preempted or interrupted by interrupt_receives()).
    +
    613 * @return `true` if transmissible; `false` if not, or on error or timeout; in the latter case `*err_code`
    +
    614 * distinguishes between timeout and fatal error.
    +
    615 */
    +
    616 bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    617
    +
    618 /**
    +
    619 * Enables sends-interrupted mode: is_sendable() (future calls), send() (future or concurrent calls),
    +
    620 * timed_send() (ditto), wait_sendable() (ditto), timed_wait_sendable() (ditto) shall emit
    +
    621 * error::Code::S_INTERRUPTED as soon as possible.
    +
    622 *
    +
    623 * @return `true` on success; `false` is already enabled.
    +
    624 */
    + +
    626
    +
    627 /**
    +
    628 * Disables mode enabled by interrupt_sends().
    +
    629 *
    +
    630 * @return `true` on success; `false` if already disabled.
    +
    631 */
    + +
    633
    +
    634 /**
    +
    635 * Enables receives-interrupted mode: is_receivable() (future calls), receive() (future or concurrent calls),
    +
    636 * timed_receive() (ditto), wait_receivable() (ditto), timed_wait_receivable() (ditto) shall emit
    +
    637 * error::Code::S_INTERRUPTED as soon as possible.
    +
    638 *
    +
    639 * @return `true` on success; `false` is already enabled.
    +
    640 */
    + +
    642
    +
    643 /**
    +
    644 * Disables mode enabled by interrupt_receives().
    +
    645 *
    +
    646 * @return `true` on success; `false` if already disabled.
    +
    647 */
    + +
    649
    +
    650 /**
    +
    651 * Returns name equal to `absolute_name` passed to ctor.
    +
    652 * @return See above.
    +
    653 */
    + +
    655
    +
    656 /**
    +
    657 * Returns the max message size of the underlying queue. This should at least approximately equal
    +
    658 * what was passed to ctor when creating the MQ; however the underlying transport may tweak it, such as rounding
    +
    659 * to page size.
    +
    660 *
    +
    661 * @return See above.
    +
    662 */
    +
    663 size_t max_msg_size() const;
    +
    664
    +
    665 /**
    +
    666 * Returns the max message count of the underlying queue. This should at least approximately equal
    +
    667 * what was passed to ctor when creating the MQ; however the underlying transport may tweak it if it desires.
    +
    668 *
    +
    669 * @return See above.
    +
    670 */
    +
    671 size_t max_n_msgs() const;
    +
    672
    +
    673 /**
    +
    674 * Available if and only if #S_HAS_NATIVE_HANDLE is `true`: Returns the stored native MQ handle; null means a
    +
    675 * constructor failed, or `*this` has been moved-from, hence the handle is to not-a-queue.
    +
    676 * See class doc header for important background discussion w/r/t the rationale behind this method.
    +
    677 *
    +
    678 * Medium-length story short: this is (in Linux impl of POSIX MQ) really an FD and as such can
    +
    679 * be wrapped via `boost::asio::posix::descriptor` and hence participate
    +
    680 * in a `Task_engine` event loop which internally will use `epoll()` together with all the other waited-on
    +
    681 * resources; or simply be `poll()`ed (etc.). E.g., boost.asio `async_wait()` for readability;
    +
    682 * then invoke `this->try_receive()` once it is readable.
    +
    683 *
    +
    684 * Behavior is undefined if you operate on this value, such as sending or receiving, concurrently to any
    +
    685 * transmission APIs acting on `*this`.
    +
    686 *
    +
    687 * @note It is possible to get away with not using this by using the `*_sendable()` and `*_receivable()`
    +
    688 * methods. However the blocking and timed variations cannot be straightforwardly interrupted.
    +
    689 *
    +
    690 * @return See above.
    +
    691 */
    + +
    693}; // class Persistent_mq_handle
    +
    694
    +
    695// Free functions.
    +
    696
    +
    697/**
    +
    698 * Swaps two objects. Constant-time. Suitable for standard ADL-swap pattern `using std::swap; swap(val1, val2);`.
    +
    699 *
    +
    700 * @relatesalso Persistent_mq_handle
    +
    701 *
    +
    702 * @param val1
    +
    703 * Object.
    +
    704 * @param val2
    +
    705 * Object.
    +
    706 */
    + +
    708
    +
    709} // namespace ipc::transport
    +
    A documentation-only concept defining the behavior of an object representing a light-weight handle to...
    ~Persistent_mq_handle()
    Destroys this handle (or no-op if no handle was successfully constructed, or if it's a moved-from or ...
    bool interrupt_receives()
    Enables receives-interrupted mode: is_receivable() (future calls), receive() (future or concurrent ca...
    size_t max_n_msgs() const
    Returns the max message count of the underlying queue.
    @@ -799,10 +800,10 @@
    bool timed_send(const util::Blob_const &blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Blocking timed send: pushes copy of message to queue; if queue is full blocks until it is not,...
    bool is_sendable(Error_code *err_code=0)
    Equivalent to try_send() except stops short of writing anything, with true result indicating that try...
    static void for_each_persistent(const Handle_name_func &handle_name_func)
    Lists all named persistent MQs currently persisting, invoking the given handler synchronously on each...
    -
    static constexpr bool S_HAS_NATIVE_HANDLE
    true if and only if native_handle() method exists, and the returned value may be waited-on by poll()/...
    +
    static constexpr bool S_HAS_NATIVE_HANDLE
    true if and only if native_handle() method exists, and the returned value may be waited-on by poll()/...
    bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Equivalent to timed_receive() except stops short of reading anything, with true result indicating tha...
    bool is_receivable(Error_code *err_code=0)
    Equivalent to try_receive() except stops short of reading anything, with true result indicating that ...
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type.
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type.
    bool try_send(const util::Blob_const &blob, Error_code *err_code=0)
    Non-blocking send: pushes copy of message to queue and returns true; if queue is full then no-op and ...
    void receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Blocking receive: pops copy of message from queue into buffer; if queue is empty blocks until it is n...
    size_t max_msg_size() const
    Returns the max message size of the underlying queue.
    @@ -814,20 +815,20 @@
    Persistent_mq_handle(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, util::Open_only mode_tag, Error_code *err_code=0)
    Construct handle to existing named MQ.
    bool interrupt_sends()
    Enables sends-interrupted mode: is_sendable() (future calls), send() (future or concurrent calls),...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/pool__arena_8cpp.html b/doc/ipc_doc/generated/html_full/pool__arena_8cpp.html index c859d7ed6..3cab8fea4 100644 --- a/doc/ipc_doc/generated/html_full/pool__arena_8cpp.html +++ b/doc/ipc_doc/generated/html_full/pool__arena_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,7 +102,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/pool__arena_8cpp_source.html b/doc/ipc_doc/generated/html_full/pool__arena_8cpp_source.html index dbcc01973..a8fe072cf 100644 --- a/doc/ipc_doc/generated/html_full/pool__arena_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/pool__arena_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -261,23 +261,23 @@
    @ S_SHM_BIPC_MISC_LIBRARY_ERROR
    Low-level boost.ipc.shm: boost.interprocess emitted miscellaneous library exception sans a system cod...
    ipc::shm sub-module with the SHM-classic SHM-provider. See ipc::shm doc header for introduction.
    Definition: classic_fwd.hpp:26
    std::ostream & operator<<(std::ostream &os, const Pool_arena &val)
    Prints string representation of the given Pool_arena to the given ostream.
    Definition: pool_arena.cpp:171
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    void remove_persistent_shm_pool(flow::log::Logger *logger_ptr, const Shared_name &pool_name, Error_code *err_code)
    Equivalent to shm::classic::Pool_arena::remove_persistent().
    Definition: util.cpp:119
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    const Open_or_create OPEN_OR_CREATE
    Tag value indicating an open-if-exists-else-create operation.
    Definition: util.cpp:30
    const Open_only OPEN_ONLY
    Tag value indicating an atomic open-if-exists-else-fail operation.
    Definition: util.cpp:31
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    void op_with_possible_bipc_exception(flow::log::Logger *logger_ptr, Error_code *err_code, const Error_code &misc_bipc_lib_error, String_view context, const Func &func)
    Internal (to ipc) utility that invokes the given function that invokes a boost.interprocess operation...
    Definition: util.hpp:34
    const Create_only CREATE_ONLY
    Tag value indicating an atomic create-unless-exists-else-fail operation.
    Definition: util.cpp:32
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/pool__arena_8hpp.html b/doc/ipc_doc/generated/html_full/pool__arena_8hpp.html index 0082ef210..3c3b7fed3 100644 --- a/doc/ipc_doc/generated/html_full/pool__arena_8hpp.html +++ b/doc/ipc_doc/generated/html_full/pool__arena_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -106,7 +106,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/pool__arena_8hpp_source.html b/doc/ipc_doc/generated/html_full/pool__arena_8hpp_source.html index 52ff260b0..5622346bf 100644 --- a/doc/ipc_doc/generated/html_full/pool__arena_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/pool__arena_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -868,13 +868,13 @@
    RAII-style class operating a stack-like notion of a the given thread's currently active SHM-aware Are...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    ipc::shm sub-module with the SHM-classic SHM-provider. See ipc::shm doc header for introduction.
    Definition: classic_fwd.hpp:26
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    -
    void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
    Equivalent to shm::classic::Pool_arena::for_each_persistent().
    Definition: util.hpp:130
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    +
    void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
    Equivalent to shm::classic::Pool_arena::for_each_persistent().
    Definition: util.hpp:131
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    The data structure stored in SHM corresponding to an original construct()-returned Handle; exactly on...
    Definition: pool_arena.hpp:515
    @@ -885,7 +885,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp.html b/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp.html index 3fac9b38d..15ef13e6c 100644 --- a/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -103,7 +103,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp_source.html b/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp_source.html index ea527b793..3a2a3dd00 100644 --- a/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/posix__mq__handle_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -1458,26 +1458,26 @@
    1386} // namespace (anon)
    1387
    1388} // namespace ipc::transport
    -
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    +
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    bool allow_sends()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-sends an...
    bool interrupt_receives()
    Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-receives ...
    bool interrupt_sends()
    Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-sends and...
    -
    util::Pipe_reader Pipe_reader
    Short-hand for anonymous pipe read end.
    +
    util::Pipe_reader Pipe_reader
    Short-hand for anonymous pipe read end.
    void wait_receivable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like receive() but without the actual popping of a message.
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    bool handle_mq_api_result(int result, Error_code *err_code, util::String_view context) const
    Helper that handles the result of an mq_*() call by logging WARNING(s) on error; setting *err_code on...
    -
    Pipe_reader m_interrupt_detector_snd
    A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl(...
    -
    Native_handle m_epoll_hndl_snd
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    +
    Pipe_reader m_interrupt_detector_snd
    A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl(...
    +
    Native_handle m_epoll_hndl_snd
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    bool is_receivable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like try_receive() but without the actual popping of a message.
    bool allow_receives()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-receives...
    bool is_sendable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.
    size_t max_msg_size() const
    Implements Persistent_mq_handle API: Returns the max message size of the underlying queue.
    -
    Pipe_reader m_interrupt_detector_rcv
    Other-direction counterpart to m_interrupt_detector_snd.
    +
    Pipe_reader m_interrupt_detector_rcv
    Other-direction counterpart to m_interrupt_detector_snd.
    Error_code epoll_setup()
    Ctor helper that sets up m_epoll_hndl_snd and m_epoll_hndl_rcv.
    -
    util::Pipe_writer Pipe_writer
    Short-hand for anonymous pipe write end.
    +
    util::Pipe_writer Pipe_writer
    Short-hand for anonymous pipe write end.
    size_t max_n_msgs() const
    Implements Persistent_mq_handle API: Returns the max message count of the underlying queue.
    bool try_send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns t...
    -
    Pipe_writer m_interrupter_rcv
    Other-direction counterpart to m_interrupter_snd.
    +
    Pipe_writer m_interrupter_rcv
    Other-direction counterpart to m_interrupter_snd.
    Native_handle native_handle() const
    Implements Persistent_mq_handle API: Returns the stored native MQ handle; null if not open.
    bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message...
    bool wait_impl(util::Fine_duration timeout_from_now_or_none, bool snd_else_rcv, Error_code *err_code)
    Impl body for *_sendable() and *_receivable().
    @@ -1486,24 +1486,24 @@
    void receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; i...
    void send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking send: pushes copy of message to queue; if queue is full...
    Posix_mq_handle()
    Implements Persistent_mq_handle API: Construct null handle.
    -
    bool m_interrupting_snd
    Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); acts as a guar...
    +
    bool m_interrupting_snd
    Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); acts as a guar...
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    -
    Native_handle m_epoll_hndl_rcv
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    +
    Native_handle m_epoll_hndl_rcv
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    bool allow_impl()
    Impl body for allow_*().
    bool interrupt_impl()
    Impl body for interrupt_*().
    bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like timed_send() but without the actual pushing of a message.
    bool timed_receive(util::Blob_mutable *blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buf...
    ~Posix_mq_handle()
    Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully con...
    bool set_non_blocking(bool nb, Error_code *err_code)
    Sets m_mq to blocking or non-blocking and returns true on success and clears *err_code; otherwise ret...
    -
    Shared_name m_absolute_name
    See absolute_name().
    +
    Shared_name m_absolute_name
    See absolute_name().
    bool timed_send(const util::Blob_const &blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue i...
    bool try_receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffe...
    Error_code pipe_setup()
    Ctor helper that sets up m_interrupt* pipe items.
    void wait_sendable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like send() but without the actual pushing of a message.
    -
    bool m_interrupting_rcv
    Other-direction counterpart to m_interrupting_snd.
    -
    Pipe_writer m_interrupter_snd
    A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl...
    -
    Native_handle m_mq
    Underlying MQ handle.
    -
    flow::util::Task_engine m_nb_task_engine
    Never used for .run() or .async() – just so we can construct Pipe_reader, Pipe_writer.
    +
    bool m_interrupting_rcv
    Other-direction counterpart to m_interrupting_snd.
    +
    Pipe_writer m_interrupter_snd
    A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl...
    +
    Native_handle m_mq
    Underlying MQ handle.
    +
    flow::util::Task_engine m_nb_task_engine
    Never used for .run() or .async() – just so we can construct Pipe_reader, Pipe_writer.
    Posix_mq_handle & operator=(Posix_mq_handle &&src)
    Implements Persistent_mq_handle API: Replaces handle with the source handle while making the latter i...
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    static Shared_name ct(const Source &src)
    Copy-constructs from a char-sequence container (including string, util::String_view,...
    @@ -1512,40 +1512,40 @@
    @ S_INTERRUPTED
    A blocking operation was intentionally interrupted or preemptively canceled.
    @ S_MQ_MESSAGE_SIZE_OVER_OR_UNDERFLOW
    Low-level message queue send-op buffer overflow (> max size) or receive-op buffer underflow (< max si...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    util::Shared_name Shared_name
    Convenience alias for the commonly used type util::Shared_name.
    -
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    +
    std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
    Prints string representation of the given Bipc_mq_handle to the given ostream.
    void swap(Posix_mq_handle &val1, Posix_mq_handle &val2)
    Implements Persistent_mq_handle related concept: Swaps two objects.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    void swap(Bipc_mq_handle &val1, Bipc_mq_handle &val2)
    Implements Persistent_mq_handle related concept: Swaps two objects.
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:156
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    const uint8_t * blob_data(const Blob_const &blob)
    Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
    Definition: util.cpp:158
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
    Writes a byte to the given pipe writer.
    Definition: util.cpp:67
    const Open_or_create OPEN_OR_CREATE
    Tag value indicating an open-if-exists-else-create operation.
    Definition: util.cpp:30
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
    Reads a byte via the given pipe reader.
    Definition: util.cpp:96
    boost::asio::writable_pipe Pipe_writer
    Short-hand for anonymous pipe write end.
    Definition: util_fwd.hpp:32
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    -
    flow::Fine_time_pt Fine_time_pt
    Short-hand for Flow's Fine_time_pt.
    Definition: util_fwd.hpp:113
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    +
    flow::Fine_time_pt Fine_time_pt
    Short-hand for Flow's Fine_time_pt.
    Definition: util_fwd.hpp:119
    boost::asio::readable_pipe Pipe_reader
    Short-hand for anonymous pipe read end.
    Definition: util_fwd.hpp:35
    void set_resource_permissions(flow::log::Logger *logger_ptr, const fs::path &path, const Permissions &perms, Error_code *err_code)
    Utility that sets the permissions of the given resource (at the supplied file system path) to specifi...
    Definition: util.cpp:46
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    const Create_only CREATE_ONLY
    Tag value indicating an atomic create-unless-exists-else-fail operation.
    Definition: util.cpp:32
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    -
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    -
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    bool null() const
    Returns true if and only if m_native_handle equals S_NULL_HANDLE.
    +
    handle_t m_native_handle
    The native handle (possibly equal to S_NULL_HANDLE), the exact payload of this Native_handle.
    diff --git a/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp.html index 17b1f9161..601c2b86f 100644 --- a/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -102,7 +102,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp_source.html b/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp_source.html index 0070f1d79..0d286f2f9 100644 --- a/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/posix__mq__handle_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -105,683 +105,684 @@
    33// Types.
    34
    35#ifndef FLOW_OS_LINUX
    -
    36# error "Posix_mq_handle relies on Linux semantics and has not been tested in other Unix; cannot exist in Windows."
    -
    37#endif
    -
    38
    -
    39/**
    -
    40 * Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see `man mq_overview`).
    -
    41 *
    -
    42 * @see Persistent_mq_handle: implemented concept.
    -
    43 *
    -
    44 * Reminder: This is available publicly in case it is useful; but it is more likely one would use a
    -
    45 * Blob_stream_mq_sender or Blob_stream_mq_receiver which provides a far more convenient boost.asio-like async-capable
    -
    46 * API. It uses class(es) like this one in its impl.
    -
    47 *
    -
    48 * native_handle() returns the underlying MQ descriptor; in Linux (the only OS supported as of this writing)
    -
    49 * this happens to be an FD; and as an FD it can (according to `man mq_overview`) participate in `epoll/poll/select()`.
    -
    50 * It is simple to wrap this descriptor in a boost.asio `posix::descriptor`. Having done that, one can
    -
    51 * `async_wait()` on it, awaiting writability and readability in async fashion not supported by the
    -
    52 * Persistent_mq_handle concept. Accordingly Posix_mq_handle::S_HAS_NATIVE_HANDLE is `true`.
    -
    53 *
    -
    54 * @internal
    -
    55 * ### Implementation ###
    -
    56 * I (ygoldfel) wrote this immediately after Bipc_mq_handle. Notably the thing that thinly wraps,
    -
    57 * `bipc::message_queue`, appears to be heavily influenced by the POSIX MQ API in terms of its API and functionality.
    -
    58 * So the implementation here is conceptually similar.
    -
    59 */
    -
    60class Posix_mq_handle : // Note: movable but not copyable.
    -
    61 public flow::log::Log_context
    -
    62{
    -
    63public:
    -
    64 // Constants.
    -
    65
    -
    66 /// Implements concept API.
    - -
    68
    -
    69 /// Implements concept API. Contrast this value with Bipc_mq_handle::S_HAS_NATIVE_HANDLE.
    -
    70 static constexpr bool S_HAS_NATIVE_HANDLE = true;
    -
    71
    -
    72 // Constructors/destructor.
    -
    73
    -
    74 /// Implements Persistent_mq_handle API: Construct null handle.
    - -
    76
    -
    77 /**
    -
    78 * Implements Persistent_mq_handle API: Construct handle to non-existing named MQ, creating it first. If it already
    -
    79 * exists, it is an error.
    -
    80 *
    -
    81 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    -
    82 *
    -
    83 * `max_n_msg` and `max_msg_sz` are subject to certain OS limits, according to `man mq_overview`. Watch out for
    -
    84 * those: we have no control over them here. The `man` page should give you the necessary information.
    -
    85 *
    -
    86 * @param logger_ptr
    -
    87 * See above.
    -
    88 * @param absolute_name
    -
    89 * See above.
    -
    90 * @param mode_tag
    -
    91 * See above.
    -
    92 * @param perms
    -
    93 * See above.
    -
    94 * Reminder: Suggest the use of util::shared_resource_permissions() to translate
    -
    95 * from one of a small handful of levels of access; these apply almost always in practice.
    -
    96 * @param max_n_msg
    -
    97 * See above.
    -
    98 * @param max_msg_sz
    -
    99 * See above.
    -
    100 * @param err_code
    -
    101 * See above.
    -
    102 */
    -
    103 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    104 util::Create_only mode_tag, size_t max_n_msg, size_t max_msg_sz,
    -
    105 const util::Permissions& perms = util::Permissions(),
    -
    106 Error_code* err_code = 0);
    -
    107 /**
    -
    108 * Implements Persistent_mq_handle API: Construct handle to existing named MQ, or else if it does not exist creates
    -
    109 * it first and opens it (atomically).
    -
    110 *
    -
    111 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    -
    112 *
    -
    113 * @param logger_ptr
    -
    114 * See above.
    -
    115 * @param absolute_name
    -
    116 * See above.
    -
    117 * @param mode_tag
    -
    118 * See above.
    -
    119 * @param perms_on_create
    -
    120 * See above.
    -
    121 * Reminder: Suggest the use of util::shared_resource_permissions() to translate
    -
    122 * from one of a small handful of levels of access; these apply almost always in practice.
    -
    123 * @param max_n_msg_on_create
    -
    124 * See above.
    -
    125 * @param max_msg_sz_on_create
    -
    126 * See above.
    -
    127 * @param err_code
    -
    128 * See above.
    -
    129 */
    -
    130 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    131 util::Open_or_create mode_tag, size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    -
    132 const util::Permissions& perms_on_create = util::Permissions(),
    -
    133 Error_code* err_code = 0);
    -
    134 /**
    -
    135 * Implements Persistent_mq_handle API: Construct handle to existing named MQ. If it does not exist, it is an error.
    -
    136 *
    -
    137 * @param logger_ptr
    -
    138 * See above.
    -
    139 * @param absolute_name
    -
    140 * See above.
    -
    141 * @param mode_tag
    -
    142 * See above.
    -
    143 * @param err_code
    -
    144 * See above.
    -
    145 */
    -
    146 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    147 util::Open_only mode_tag, Error_code* err_code = 0);
    -
    148
    -
    149 /**
    -
    150 * Implements Persistent_mq_handle API: Constructs handle from the source handle while making the latter as-if
    -
    151 * default-cted. Reminder, informally: This is a light-weight op.
    -
    152 *
    -
    153 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    -
    154 *
    -
    155 * @param src
    -
    156 * See above.
    -
    157 */
    - -
    159
    -
    160 /// Copying of handles is prohibited, per Persistent_mq_handle concept.
    - -
    162
    -
    163 /**
    -
    164 * Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully constructed, or
    -
    165 * if it's a moved-from or default-cted handle). Reminder: The underlying MQ (if any) is *not* destroyed and can
    -
    166 * be attached-to by another handle.
    -
    167 *
    -
    168 * @see Persistent_mq_handle::~Persistent_mq_handle(): implemented concept.
    -
    169 */
    - -
    171
    -
    172 // Methods.
    -
    173
    -
    174 /**
    -
    175 * Implements Persistent_mq_handle API: Replaces handle with the source handle while making the latter invalid as-if
    -
    176 * default-cted. Reminder, informally: this is a light-weight op.
    -
    177 *
    -
    178 * @param src
    -
    179 * See above.
    -
    180 * @return `*this`.
    -
    181 */
    - -
    183
    -
    184 /// Copying of handles is prohibited, per Persistent_mq_handle concept.
    - -
    186
    -
    187 /**
    -
    188 * Implements Persistent_mq_handle API: Removes the named persistent MQ. Reminder: name is removed immediately
    -
    189 * (if present -- otherwise error), but underlying MQ continues to exist until all system-wide handles to it
    -
    190 * are closed.
    -
    191 *
    -
    192 * @see Persistent_mq_handle::remove_persistent(): implemented concept.
    -
    193 *
    -
    194 * @see Reminder: see also `util::remove_each_persistent_*()`.
    -
    195 *
    -
    196 * @param logger_ptr
    -
    197 * See above.
    -
    198 * @param name
    -
    199 * See above.
    -
    200 * @param err_code
    -
    201 * See above.
    -
    202 */
    -
    203 static void remove_persistent(flow::log::Logger* logger_ptr, const Shared_name& name, Error_code* err_code = 0);
    -
    204
    -
    205 /**
    -
    206 * Implements Persistent_mq_handle API. Impl note for exposition: we use the fact that, e.g., in Linux
    -
    207 * the POSIX MQ devices are listed in flat fashion in /dev/mqueue.
    -
    208 *
    -
    209 * @see Persistent_mq_handle::for_each_persistent(): implemented concept.
    -
    210 *
    -
    211 * @tparam Handle_name_func
    -
    212 * See above.
    -
    213 * @param handle_name_func
    -
    214 * See above.
    -
    215 */
    -
    216 template<typename Handle_name_func>
    -
    217 static void for_each_persistent(const Handle_name_func& handle_name_func);
    -
    218
    -
    219 /**
    -
    220 * Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns `true`;
    -
    221 * if queue is full then no-op and returns `false`.
    -
    222 *
    -
    223 * @see Persistent_mq_handle::try_send(): implemented concept.
    -
    224 *
    -
    225 * ### INFO+ logging ###
    -
    226 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    -
    227 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    228 *
    -
    229 * @param blob
    -
    230 * See above.
    -
    231 * @param err_code
    -
    232 * See above.
    -
    233 * @return See above.
    -
    234 */
    -
    235 bool try_send(const util::Blob_const& blob, Error_code* err_code = 0);
    -
    236
    -
    237 /**
    -
    238 * Implements Persistent_mq_handle API: Blocking send: pushes copy of message to queue; if queue is full blocks
    -
    239 * until it is not.
    -
    240 *
    -
    241 * @see Persistent_mq_handle::send(): implemented concept.
    -
    242 *
    -
    243 * ### INFO+ logging ###
    -
    244 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()`
    -
    245 * to temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    246 *
    -
    247 * @param blob
    -
    248 * See above.
    -
    249 * @param err_code
    -
    250 * See above.
    -
    251 */
    -
    252 void send(const util::Blob_const& blob, Error_code* err_code = 0);
    -
    253
    -
    254 /**
    -
    255 * Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue is full
    -
    256 * blocks until it is not, or the specified time passes, whichever happens first.
    -
    257 *
    -
    258 * @see Persistent_mq_handle::timed_send(): implemented concept.
    -
    259 *
    -
    260 * ### INFO+ logging ###
    -
    261 * WARNING on error or timed out.
    -
    262 * (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    -
    263 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    264 *
    -
    265 * @param blob
    -
    266 * See above.
    -
    267 * @param timeout_from_now
    -
    268 * See above.
    -
    269 * @param err_code
    -
    270 * See above.
    -
    271 * @return See above.
    -
    272 */
    -
    273 bool timed_send(const util::Blob_const& blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    274
    -
    275 /**
    -
    276 * Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.
    -
    277 *
    -
    278 * @see Persistent_mq_handle::is_sendable(): implemented concept.
    -
    279 *
    -
    280 * ### INFO+ logging ###
    -
    281 * WARNING on error.
    -
    282 *
    -
    283 * @param err_code
    -
    284 * See above.
    -
    285 * @return See above.
    -
    286 */
    -
    287 bool is_sendable(Error_code* err_code = 0);
    -
    288
    -
    289 /**
    -
    290 * Implements Persistent_mq_handle API: Like send() but without the actual pushing of a message.
    -
    291 *
    -
    292 * @see Persistent_mq_handle::wait_sendable(): implemented concept.
    -
    293 *
    -
    294 * ### INFO+ logging ###
    -
    295 * WARNING on error.
    -
    296 *
    -
    297 * @param err_code
    -
    298 * See above.
    -
    299 */
    -
    300 void wait_sendable(Error_code* err_code = 0);
    -
    301
    -
    302 /**
    -
    303 * Implements Persistent_mq_handle API: Like timed_send() but without the actual pushing of a message.
    -
    304 *
    -
    305 * @see Persistent_mq_handle::timed_wait_sendable(): implemented concept.
    -
    306 *
    -
    307 * ### INFO+ logging ###
    -
    308 * WARNING on error.
    -
    309 *
    -
    310 * @param err_code
    -
    311 * See above.
    -
    312 * @param timeout_from_now
    -
    313 * See above.
    -
    314 * @return See above.
    -
    315 */
    -
    316 bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    317
    -
    318 /**
    -
    319 * Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffer and
    -
    320 * returns `true`; if queue is empty then no-op and returns `false`.
    -
    321 *
    -
    322 * @see Persistent_mq_handle::try_receive(): implemented concept.
    -
    323 *
    -
    324 * ### INFO+ logging ###
    -
    325 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    -
    326 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    327 *
    -
    328 * @param blob
    -
    329 * See above.
    -
    330 * @param err_code
    -
    331 * See above.
    -
    332 * @return See above.
    -
    333 */
    -
    334 bool try_receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    -
    335
    -
    336 /**
    -
    337 * Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; if queue
    -
    338 * is empty blocks until it is not.
    -
    339 *
    -
    340 * @see Persistent_mq_handle::receive(): implemented concept.
    -
    341 *
    -
    342 * ### INFO+ logging ###
    -
    343 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    -
    344 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    345 *
    -
    346 * @param blob
    -
    347 * See above.
    -
    348 * @param err_code
    -
    349 * See above.
    -
    350 */
    -
    351 void receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    -
    352
    -
    353 /**
    -
    354 * Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buffer;
    -
    355 * if queue is empty blocks until it is not, or the specified time passes, whichever happens first.
    -
    356 *
    -
    357 * @see Persistent_mq_handle::timed_receive(): implemented concept.
    -
    358 *
    -
    359 * ### INFO+ logging ###
    -
    360 * WARNING on error or timed out. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    -
    361 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    -
    362 *
    -
    363 * @param blob
    -
    364 * See above.
    -
    365 * @param timeout_from_now
    -
    366 * See above.
    -
    367 * @param err_code
    -
    368 * See above.
    -
    369 * @return See above.
    -
    370 */
    -
    371 bool timed_receive(util::Blob_mutable* blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    372
    -
    373 /**
    -
    374 * Implements Persistent_mq_handle API: Like try_receive() but without the actual popping of a message.
    -
    375 *
    -
    376 * @see Persistent_mq_handle::is_receivable(): implemented concept.
    -
    377 *
    -
    378 * ### INFO+ logging ###
    -
    379 * WARNING on error.
    -
    380 *
    -
    381 * @param err_code
    -
    382 * See above.
    -
    383 * @return See above.
    -
    384 */
    -
    385 bool is_receivable(Error_code* err_code = 0);
    -
    386
    -
    387 /**
    -
    388 * Implements Persistent_mq_handle API: Like receive() but without the actual popping of a message.
    -
    389 *
    -
    390 * @see Persistent_mq_handle::wait_receivable(): implemented concept.
    -
    391 *
    -
    392 * ### INFO+ logging ###
    -
    393 * WARNING on error.
    -
    394 *
    -
    395 * @param err_code
    -
    396 * See above.
    -
    397 */
    -
    398 void wait_receivable(Error_code* err_code = 0);
    -
    399
    -
    400 /**
    -
    401 * Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message.
    -
    402 *
    -
    403 * @see Persistent_mq_handle::timed_wait_receivable(): implemented concept.
    -
    404 *
    -
    405 * ### INFO+ logging ###
    -
    406 * WARNING on error.
    -
    407 *
    -
    408 * @param err_code
    -
    409 * See above.
    -
    410 * @param timeout_from_now
    -
    411 * See above.
    -
    412 * @return See above.
    -
    413 */
    -
    414 bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    -
    415
    -
    416 /**
    -
    417 * Implements Persistent_mq_handle API:
    -
    418 * Turn on preemptive/concurrent interruption of blocking-sends and sendable-waits/polls.
    -
    419 *
    -
    420 * @see Persistent_mq_handle::interrupt_sends(): implemented concept.
    -
    421 *
    -
    422 * ### INFO+ logging ###
    -
    423 * WARNING on duplicate use, INFO otherwise.
    -
    424 *
    -
    425 * @return See above.
    -
    426 */
    -
    427 bool interrupt_sends();
    -
    428
    -
    429 /**
    -
    430 * Implements Persistent_mq_handle API:
    -
    431 * Turn off preemptive/concurrent interruption of blocking-sends and sendable-waits/polls.
    -
    432 *
    -
    433 * @see Persistent_mq_handle::allow_sends(): implemented concept.
    -
    434 *
    -
    435 * ### INFO+ logging ###
    -
    436 * WARNING on duplicate use, INFO otherwise.
    -
    437 *
    -
    438 * @return See above.
    -
    439 */
    -
    440 bool allow_sends();
    -
    441
    -
    442 /**
    -
    443 * Implements Persistent_mq_handle API:
    -
    444 * Turn on preemptive/concurrent interruption of blocking-receives and receivable-waits/polls.
    -
    445 *
    -
    446 * @see Persistent_mq_handle::interrupt_receives(): implemented concept.
    -
    447 *
    -
    448 * ### INFO+ logging ###
    -
    449 * WARNING on duplicate use, INFO otherwise.
    -
    450 *
    -
    451 * @return See above.
    -
    452 */
    -
    453 bool interrupt_receives();
    -
    454
    -
    455 /**
    -
    456 * Implements Persistent_mq_handle API:
    -
    457 * Turn off preemptive/concurrent interruption of blocking-receives and receivable-waits/polls.
    -
    458 *
    -
    459 * @see Persistent_mq_handle::allow_receives(): implemented concept.
    -
    460 *
    -
    461 * ### INFO+ logging ###
    -
    462 * WARNING on duplicate use, INFO otherwise.
    -
    463 *
    -
    464 * @return See above.
    -
    465 */
    -
    466 bool allow_receives();
    -
    467
    -
    468 /**
    -
    469 * Implements Persistent_mq_handle API: Returns name equal to `absolute_name` passed to ctor.
    -
    470 * @return See above.
    -
    471 * @see Persistent_mq_handle::absolute_name(): implemented concept.
    -
    472 */
    -
    473 const Shared_name& absolute_name() const;
    -
    474
    -
    475 /**
    -
    476 * Implements Persistent_mq_handle API: Returns the max message size of the underlying queue. Reminder:
    -
    477 * This is not required to match was was passed to `Create_only` or `Open_or_create` ctor.
    -
    478 *
    -
    479 * @return See above.
    -
    480 * @see Persistent_mq_handle::max_msg_size(): implemented concept.
    -
    481 */
    -
    482 size_t max_msg_size() const;
    -
    483
    -
    484 /**
    -
    485 * Implements Persistent_mq_handle API: Returns the max message count of the underlying queue. Reminder:
    -
    486 * This is not required to match was was passed to `Create_only` or `Open_or_create` ctor.
    -
    487 *
    -
    488 * @return See above.
    -
    489 * @see Persistent_mq_handle::max_n_msgs(): implemented concept.
    -
    490 */
    -
    491 size_t max_n_msgs() const;
    -
    492
    -
    493 /**
    -
    494 * Implements Persistent_mq_handle API: Returns the stored native MQ handle; null if not open.
    -
    495 *
    -
    496 * @return See above.
    -
    497 * @see Persistent_mq_handle::native_handle(): implemented concept.
    -
    498 */
    - -
    500
    -
    501private:
    -
    502 // Types.
    -
    503
    -
    504 /// Short-hand for anonymous pipe write end.
    - -
    506
    -
    507 /// Short-hand for anonymous pipe read end.
    - -
    509
    -
    510 // Friends.
    -
    511
    -
    512 // Friend of Posix_mq_handle.
    -
    513 friend void swap(Posix_mq_handle& val1, Posix_mq_handle& val2);
    -
    514
    -
    515 // Constructors/destructor.
    -
    516
    -
    517 /**
    -
    518 * Helper ctor delegated by the 2 `public` ctors that take `Open_or_create` or `Create_only` mode.
    -
    519 *
    -
    520 * @tparam Mode_tag
    -
    521 * Either util::Open_or_create or util::Create_only.
    -
    522 * @param logger_ptr
    -
    523 * See `public` ctors.
    -
    524 * @param absolute_name
    -
    525 * See `public` ctors.
    -
    526 * @param mode_tag
    -
    527 * See `public` ctors.
    -
    528 * @param max_n_msg_on_create
    -
    529 * See `public` ctors.
    -
    530 * @param max_msg_sz_on_create
    -
    531 * See `public` ctors.
    -
    532 * @param perms_on_create
    -
    533 * See `public` ctors.
    -
    534 * @param err_code
    -
    535 * See `public` ctors.
    -
    536 */
    -
    537 template<typename Mode_tag>
    -
    538 explicit Posix_mq_handle(Mode_tag mode_tag, flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    -
    539 size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    -
    540 const util::Permissions& perms_on_create,
    -
    541 Error_code* err_code);
    -
    542
    -
    543 // Methods.
    -
    544
    -
    545 /**
    -
    546 * Ctor helper that sets up `m_interrupt*` pipe items. If it fails it returns truthy code
    -
    547 * and cleans up what it did. It ignores everything else like #m_mq.
    -
    548 *
    -
    549 * @return See above.
    -
    550 */
    - -
    552
    -
    553 /**
    -
    554 * Ctor helper that sets up #m_epoll_hndl_snd and #m_epoll_hndl_rcv. If it fails it returns truthy code
    -
    555 * and puts everything back to as-if-ctor-failed state, including #m_mq being null.
    -
    556 *
    -
    557 * @return See above.
    -
    558 */
    - -
    560
    -
    561 /**
    -
    562 * Sets #m_mq to blocking or non-blocking and returns `true` on success and clears `*err_code`; otherwise returns
    -
    563 * `false` and sets truthy `*err_code`.
    -
    564 *
    -
    565 * @param err_code
    -
    566 * To set. If null behavior is undefined (assertion may trip).
    -
    567 * @param nb
    -
    568 * Non-blocking if `true`, else blocking.
    -
    569 * @return `true` <=> success.
    -
    570 */
    -
    571 bool set_non_blocking(bool nb, Error_code* err_code);
    -
    572
    -
    573 /**
    -
    574 * Helper that handles the result of an `mq_*()` call by logging WARNING(s) on error; setting `*err_code` on error;
    -
    575 * clearing it on success. `errno` is presumably set by the native API on error going into this.
    -
    576 *
    -
    577 * @param result
    -
    578 * What the native API returned.
    -
    579 * @param err_code
    -
    580 * To set. If null behavior is undefined (assertion may trip).
    -
    581 * @param context
    -
    582 * See Bipc_mq_handle::op_with_possible_bipc_mq_exception().
    -
    583 * @return `true` if `*err_code` was set to success (falsy); else `false` (it was set to truthy).
    -
    584 */
    -
    585 bool handle_mq_api_result(int result, Error_code* err_code, util::String_view context) const;
    -
    586
    -
    587 /**
    -
    588 * Impl body for `interrupt_*()`.
    -
    589 *
    -
    590 * @tparam SND_ELSE_RCV
    -
    591 * True for `*_sends()`, else `*_receives()`.
    -
    592 * @return See callers.
    -
    593 */
    -
    594 template<bool SND_ELSE_RCV>
    -
    595 bool interrupt_impl();
    -
    596
    -
    597 /**
    -
    598 * Impl body for `allow_*()`.
    -
    599 *
    -
    600 * @tparam SND_ELSE_RCV
    -
    601 * True for `*_sends()`, else `*_receives()`.
    -
    602 * @return See callers.
    -
    603 */
    -
    604 template<bool SND_ELSE_RCV>
    -
    605 bool allow_impl();
    -
    606
    -
    607 /**
    -
    608 * Impl body for `*_sendable()` and `*_receivable()`.
    -
    609 *
    -
    610 * @param timeout_from_now_or_none
    -
    611 * `timeout_from_now`; or 0 for `is_*()`, or `Fine_duration::max()` for non-timed-blocking variant.
    -
    612 * @param snd_else_rcv
    -
    613 * True for `*_sendable()`, else `*_receivable()`.
    -
    614 * @param err_code
    -
    615 * See callers.
    -
    616 * @return See callers.
    -
    617 */
    -
    618 bool wait_impl(util::Fine_duration timeout_from_now_or_none, bool snd_else_rcv, Error_code* err_code);
    -
    619
    -
    620 // Data.
    -
    621
    -
    622 /**
    -
    623 * Underlying MQ handle. We are a thin wrapper around this really. `.null()` if creation
    -
    624 * fails in ctor, or if `*this` was moved-from. This is very light-weight; probably `int`.
    -
    625 */
    - -
    627
    -
    628 /// See absolute_name().
    - -
    630
    -
    631 /**
    -
    632 * `epoll_*()` handle (`.null()` if and only if #m_mq is null) that is level-triggered to be active
    -
    633 * (with only 1 event registered) if and only if #m_mq is currently capable of sending at least 1 message
    -
    634 * (we could push 1+ messages right now). Used by wait_impl() and its various public `*_sendable()` forms.
    -
    635 */
    - -
    637
    -
    638 /**
    -
    639 * `epoll_*()` handle (`.null()` if and only if #m_mq is null) that is level-triggered to be active
    -
    640 * (with only 1 event registered) if and only if #m_mq is currently storing at least 1 message
    -
    641 * (we could pop 1+ messages right now). Used by wait_impl() and its various public `*_receivable()` forms.
    -
    642 */
    - -
    644
    -
    645 /**
    -
    646 * Starting at `false`, this is made `true` via interrupt_sends(), and back by allow_sends(); acts as a guard
    -
    647 * against doing it when already in effect. Note that that is its only purpose; as wait_impl() never checks it;
    -
    648 * instead it relies on `epoll_wait()` detecting a readable #m_interrupt_detector_rcv.
    -
    649 */
    - -
    651
    -
    652 /// Other-direction counterpart to #m_interrupting_snd.
    - -
    654
    -
    655 /// Never used for `.run()` or `.async()` -- just so we can construct #Pipe_reader, #Pipe_writer.
    -
    656 flow::util::Task_engine m_nb_task_engine;
    -
    657
    -
    658 /**
    -
    659 * A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl()
    -
    660 * indicating that #m_interrupting_snd mode is on.
    -
    661 */
    - -
    663
    -
    664 /**
    -
    665 * A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl()
    -
    666 * indicating that #m_interrupting_snd mode is off; and wait_impl() poll-waits on this along with
    -
    667 * #m_mq -- if it is readable, then the mode is on.
    -
    668 */
    - -
    670
    -
    671 /// Other-direction counterpart to #m_interrupter_snd.
    - -
    673
    -
    674 /// Other-direction counterpart to #m_interrupt_detector_snd.
    - -
    676}; // class Posix_mq_handle
    -
    677
    -
    678// Free functions: in *_fwd.hpp.
    -
    679
    -
    680// Template implementations.
    -
    681
    -
    682template<typename Handle_name_func>
    -
    683void Posix_mq_handle::for_each_persistent(const Handle_name_func& handle_name_func) // Static.
    -
    684{
    -
    685#ifndef FLOW_OS_LINUX
    -
    686# error "This method relies on/has been tested only with Linux /dev/mqueue semantics."
    -
    687#endif
    -
    688 util::for_each_persistent_impl("/dev/mqueue", handle_name_func);
    -
    689}
    -
    690
    -
    691} // namespace ipc::transport
    -
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    +
    36static_assert(false, "Posix_mq_handle relies on Linux semantics and has not been tested in other POSIX OS; "
    +
    37 "likely does not exist in Windows.");
    +
    38#endif
    +
    39
    +
    40/**
    +
    41 * Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see `man mq_overview`).
    +
    42 *
    +
    43 * @see Persistent_mq_handle: implemented concept.
    +
    44 *
    +
    45 * Reminder: This is available publicly in case it is useful; but it is more likely one would use a
    +
    46 * Blob_stream_mq_sender or Blob_stream_mq_receiver which provides a far more convenient boost.asio-like async-capable
    +
    47 * API. It uses class(es) like this one in its impl.
    +
    48 *
    +
    49 * native_handle() returns the underlying MQ descriptor; in Linux (the only OS supported as of this writing)
    +
    50 * this happens to be an FD; and as an FD it can (according to `man mq_overview`) participate in `epoll/poll/select()`.
    +
    51 * It is simple to wrap this descriptor in a boost.asio `posix::descriptor`. Having done that, one can
    +
    52 * `async_wait()` on it, awaiting writability and readability in async fashion not supported by the
    +
    53 * Persistent_mq_handle concept. Accordingly Posix_mq_handle::S_HAS_NATIVE_HANDLE is `true`.
    +
    54 *
    +
    55 * @internal
    +
    56 * ### Implementation ###
    +
    57 * I (ygoldfel) wrote this immediately after Bipc_mq_handle. Notably the thing that thinly wraps,
    +
    58 * `bipc::message_queue`, appears to be heavily influenced by the POSIX MQ API in terms of its API and functionality.
    +
    59 * So the implementation here is conceptually similar.
    +
    60 */
    +
    61class Posix_mq_handle : // Note: movable but not copyable.
    +
    62 public flow::log::Log_context
    +
    63{
    +
    64public:
    +
    65 // Constants.
    +
    66
    +
    67 /// Implements concept API.
    + +
    69
    +
    70 /// Implements concept API. Contrast this value with Bipc_mq_handle::S_HAS_NATIVE_HANDLE.
    +
    71 static constexpr bool S_HAS_NATIVE_HANDLE = true;
    +
    72
    +
    73 // Constructors/destructor.
    +
    74
    +
    75 /// Implements Persistent_mq_handle API: Construct null handle.
    + +
    77
    +
    78 /**
    +
    79 * Implements Persistent_mq_handle API: Construct handle to non-existing named MQ, creating it first. If it already
    +
    80 * exists, it is an error.
    +
    81 *
    +
    82 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    +
    83 *
    +
    84 * `max_n_msg` and `max_msg_sz` are subject to certain OS limits, according to `man mq_overview`. Watch out for
    +
    85 * those: we have no control over them here. The `man` page should give you the necessary information.
    +
    86 *
    +
    87 * @param logger_ptr
    +
    88 * See above.
    +
    89 * @param absolute_name
    +
    90 * See above.
    +
    91 * @param mode_tag
    +
    92 * See above.
    +
    93 * @param perms
    +
    94 * See above.
    +
    95 * Reminder: Suggest the use of util::shared_resource_permissions() to translate
    +
    96 * from one of a small handful of levels of access; these apply almost always in practice.
    +
    97 * @param max_n_msg
    +
    98 * See above.
    +
    99 * @param max_msg_sz
    +
    100 * See above.
    +
    101 * @param err_code
    +
    102 * See above.
    +
    103 */
    +
    104 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    105 util::Create_only mode_tag, size_t max_n_msg, size_t max_msg_sz,
    +
    106 const util::Permissions& perms = util::Permissions(),
    +
    107 Error_code* err_code = 0);
    +
    108 /**
    +
    109 * Implements Persistent_mq_handle API: Construct handle to existing named MQ, or else if it does not exist creates
    +
    110 * it first and opens it (atomically).
    +
    111 *
    +
    112 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    +
    113 *
    +
    114 * @param logger_ptr
    +
    115 * See above.
    +
    116 * @param absolute_name
    +
    117 * See above.
    +
    118 * @param mode_tag
    +
    119 * See above.
    +
    120 * @param perms_on_create
    +
    121 * See above.
    +
    122 * Reminder: Suggest the use of util::shared_resource_permissions() to translate
    +
    123 * from one of a small handful of levels of access; these apply almost always in practice.
    +
    124 * @param max_n_msg_on_create
    +
    125 * See above.
    +
    126 * @param max_msg_sz_on_create
    +
    127 * See above.
    +
    128 * @param err_code
    +
    129 * See above.
    +
    130 */
    +
    131 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    132 util::Open_or_create mode_tag, size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    +
    133 const util::Permissions& perms_on_create = util::Permissions(),
    +
    134 Error_code* err_code = 0);
    +
    135 /**
    +
    136 * Implements Persistent_mq_handle API: Construct handle to existing named MQ. If it does not exist, it is an error.
    +
    137 *
    +
    138 * @param logger_ptr
    +
    139 * See above.
    +
    140 * @param absolute_name
    +
    141 * See above.
    +
    142 * @param mode_tag
    +
    143 * See above.
    +
    144 * @param err_code
    +
    145 * See above.
    +
    146 */
    +
    147 explicit Posix_mq_handle(flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    148 util::Open_only mode_tag, Error_code* err_code = 0);
    +
    149
    +
    150 /**
    +
    151 * Implements Persistent_mq_handle API: Constructs handle from the source handle while making the latter as-if
    +
    152 * default-cted. Reminder, informally: This is a light-weight op.
    +
    153 *
    +
    154 * @see Persistent_mq_handle::Persistent_mq_handle(): implemented concept.
    +
    155 *
    +
    156 * @param src
    +
    157 * See above.
    +
    158 */
    + +
    160
    +
    161 /// Copying of handles is prohibited, per Persistent_mq_handle concept.
    + +
    163
    +
    164 /**
    +
    165 * Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully constructed, or
    +
    166 * if it's a moved-from or default-cted handle). Reminder: The underlying MQ (if any) is *not* destroyed and can
    +
    167 * be attached-to by another handle.
    +
    168 *
    +
    169 * @see Persistent_mq_handle::~Persistent_mq_handle(): implemented concept.
    +
    170 */
    + +
    172
    +
    173 // Methods.
    +
    174
    +
    175 /**
    +
    176 * Implements Persistent_mq_handle API: Replaces handle with the source handle while making the latter invalid as-if
    +
    177 * default-cted. Reminder, informally: this is a light-weight op.
    +
    178 *
    +
    179 * @param src
    +
    180 * See above.
    +
    181 * @return `*this`.
    +
    182 */
    + +
    184
    +
    185 /// Copying of handles is prohibited, per Persistent_mq_handle concept.
    + +
    187
    +
    188 /**
    +
    189 * Implements Persistent_mq_handle API: Removes the named persistent MQ. Reminder: name is removed immediately
    +
    190 * (if present -- otherwise error), but underlying MQ continues to exist until all system-wide handles to it
    +
    191 * are closed.
    +
    192 *
    +
    193 * @see Persistent_mq_handle::remove_persistent(): implemented concept.
    +
    194 *
    +
    195 * @see Reminder: see also `util::remove_each_persistent_*()`.
    +
    196 *
    +
    197 * @param logger_ptr
    +
    198 * See above.
    +
    199 * @param name
    +
    200 * See above.
    +
    201 * @param err_code
    +
    202 * See above.
    +
    203 */
    +
    204 static void remove_persistent(flow::log::Logger* logger_ptr, const Shared_name& name, Error_code* err_code = 0);
    +
    205
    +
    206 /**
    +
    207 * Implements Persistent_mq_handle API. Impl note for exposition: we use the fact that, e.g., in Linux
    +
    208 * the POSIX MQ devices are listed in flat fashion in /dev/mqueue.
    +
    209 *
    +
    210 * @see Persistent_mq_handle::for_each_persistent(): implemented concept.
    +
    211 *
    +
    212 * @tparam Handle_name_func
    +
    213 * See above.
    +
    214 * @param handle_name_func
    +
    215 * See above.
    +
    216 */
    +
    217 template<typename Handle_name_func>
    +
    218 static void for_each_persistent(const Handle_name_func& handle_name_func);
    +
    219
    +
    220 /**
    +
    221 * Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns `true`;
    +
    222 * if queue is full then no-op and returns `false`.
    +
    223 *
    +
    224 * @see Persistent_mq_handle::try_send(): implemented concept.
    +
    225 *
    +
    226 * ### INFO+ logging ###
    +
    227 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    +
    228 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    229 *
    +
    230 * @param blob
    +
    231 * See above.
    +
    232 * @param err_code
    +
    233 * See above.
    +
    234 * @return See above.
    +
    235 */
    +
    236 bool try_send(const util::Blob_const& blob, Error_code* err_code = 0);
    +
    237
    +
    238 /**
    +
    239 * Implements Persistent_mq_handle API: Blocking send: pushes copy of message to queue; if queue is full blocks
    +
    240 * until it is not.
    +
    241 *
    +
    242 * @see Persistent_mq_handle::send(): implemented concept.
    +
    243 *
    +
    244 * ### INFO+ logging ###
    +
    245 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()`
    +
    246 * to temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    247 *
    +
    248 * @param blob
    +
    249 * See above.
    +
    250 * @param err_code
    +
    251 * See above.
    +
    252 */
    +
    253 void send(const util::Blob_const& blob, Error_code* err_code = 0);
    +
    254
    +
    255 /**
    +
    256 * Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue is full
    +
    257 * blocks until it is not, or the specified time passes, whichever happens first.
    +
    258 *
    +
    259 * @see Persistent_mq_handle::timed_send(): implemented concept.
    +
    260 *
    +
    261 * ### INFO+ logging ###
    +
    262 * WARNING on error or timed out.
    +
    263 * (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    +
    264 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    265 *
    +
    266 * @param blob
    +
    267 * See above.
    +
    268 * @param timeout_from_now
    +
    269 * See above.
    +
    270 * @param err_code
    +
    271 * See above.
    +
    272 * @return See above.
    +
    273 */
    +
    274 bool timed_send(const util::Blob_const& blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    275
    +
    276 /**
    +
    277 * Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.
    +
    278 *
    +
    279 * @see Persistent_mq_handle::is_sendable(): implemented concept.
    +
    280 *
    +
    281 * ### INFO+ logging ###
    +
    282 * WARNING on error.
    +
    283 *
    +
    284 * @param err_code
    +
    285 * See above.
    +
    286 * @return See above.
    +
    287 */
    +
    288 bool is_sendable(Error_code* err_code = 0);
    +
    289
    +
    290 /**
    +
    291 * Implements Persistent_mq_handle API: Like send() but without the actual pushing of a message.
    +
    292 *
    +
    293 * @see Persistent_mq_handle::wait_sendable(): implemented concept.
    +
    294 *
    +
    295 * ### INFO+ logging ###
    +
    296 * WARNING on error.
    +
    297 *
    +
    298 * @param err_code
    +
    299 * See above.
    +
    300 */
    +
    301 void wait_sendable(Error_code* err_code = 0);
    +
    302
    +
    303 /**
    +
    304 * Implements Persistent_mq_handle API: Like timed_send() but without the actual pushing of a message.
    +
    305 *
    +
    306 * @see Persistent_mq_handle::timed_wait_sendable(): implemented concept.
    +
    307 *
    +
    308 * ### INFO+ logging ###
    +
    309 * WARNING on error.
    +
    310 *
    +
    311 * @param err_code
    +
    312 * See above.
    +
    313 * @param timeout_from_now
    +
    314 * See above.
    +
    315 * @return See above.
    +
    316 */
    +
    317 bool timed_wait_sendable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    318
    +
    319 /**
    +
    320 * Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffer and
    +
    321 * returns `true`; if queue is empty then no-op and returns `false`.
    +
    322 *
    +
    323 * @see Persistent_mq_handle::try_receive(): implemented concept.
    +
    324 *
    +
    325 * ### INFO+ logging ###
    +
    326 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    +
    327 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    328 *
    +
    329 * @param blob
    +
    330 * See above.
    +
    331 * @param err_code
    +
    332 * See above.
    +
    333 * @return See above.
    +
    334 */
    +
    335 bool try_receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    +
    336
    +
    337 /**
    +
    338 * Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; if queue
    +
    339 * is empty blocks until it is not.
    +
    340 *
    +
    341 * @see Persistent_mq_handle::receive(): implemented concept.
    +
    342 *
    +
    343 * ### INFO+ logging ###
    +
    344 * WARNING on error. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    +
    345 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    346 *
    +
    347 * @param blob
    +
    348 * See above.
    +
    349 * @param err_code
    +
    350 * See above.
    +
    351 */
    +
    352 void receive(util::Blob_mutable* blob, Error_code* err_code = 0);
    +
    353
    +
    354 /**
    +
    355 * Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buffer;
    +
    356 * if queue is empty blocks until it is not, or the specified time passes, whichever happens first.
    +
    357 *
    +
    358 * @see Persistent_mq_handle::timed_receive(): implemented concept.
    +
    359 *
    +
    360 * ### INFO+ logging ###
    +
    361 * WARNING on error or timed out. (You may use the `flow::log::Config::this_thread_verbosity_override_auto()` to
    +
    362 * temporarily, in that thread only, disable/reduce logging. This is quite easy and performant.)
    +
    363 *
    +
    364 * @param blob
    +
    365 * See above.
    +
    366 * @param timeout_from_now
    +
    367 * See above.
    +
    368 * @param err_code
    +
    369 * See above.
    +
    370 * @return See above.
    +
    371 */
    +
    372 bool timed_receive(util::Blob_mutable* blob, util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    373
    +
    374 /**
    +
    375 * Implements Persistent_mq_handle API: Like try_receive() but without the actual popping of a message.
    +
    376 *
    +
    377 * @see Persistent_mq_handle::is_receivable(): implemented concept.
    +
    378 *
    +
    379 * ### INFO+ logging ###
    +
    380 * WARNING on error.
    +
    381 *
    +
    382 * @param err_code
    +
    383 * See above.
    +
    384 * @return See above.
    +
    385 */
    +
    386 bool is_receivable(Error_code* err_code = 0);
    +
    387
    +
    388 /**
    +
    389 * Implements Persistent_mq_handle API: Like receive() but without the actual popping of a message.
    +
    390 *
    +
    391 * @see Persistent_mq_handle::wait_receivable(): implemented concept.
    +
    392 *
    +
    393 * ### INFO+ logging ###
    +
    394 * WARNING on error.
    +
    395 *
    +
    396 * @param err_code
    +
    397 * See above.
    +
    398 */
    +
    399 void wait_receivable(Error_code* err_code = 0);
    +
    400
    +
    401 /**
    +
    402 * Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message.
    +
    403 *
    +
    404 * @see Persistent_mq_handle::timed_wait_receivable(): implemented concept.
    +
    405 *
    +
    406 * ### INFO+ logging ###
    +
    407 * WARNING on error.
    +
    408 *
    +
    409 * @param err_code
    +
    410 * See above.
    +
    411 * @param timeout_from_now
    +
    412 * See above.
    +
    413 * @return See above.
    +
    414 */
    +
    415 bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code* err_code = 0);
    +
    416
    +
    417 /**
    +
    418 * Implements Persistent_mq_handle API:
    +
    419 * Turn on preemptive/concurrent interruption of blocking-sends and sendable-waits/polls.
    +
    420 *
    +
    421 * @see Persistent_mq_handle::interrupt_sends(): implemented concept.
    +
    422 *
    +
    423 * ### INFO+ logging ###
    +
    424 * WARNING on duplicate use, INFO otherwise.
    +
    425 *
    +
    426 * @return See above.
    +
    427 */
    +
    428 bool interrupt_sends();
    +
    429
    +
    430 /**
    +
    431 * Implements Persistent_mq_handle API:
    +
    432 * Turn off preemptive/concurrent interruption of blocking-sends and sendable-waits/polls.
    +
    433 *
    +
    434 * @see Persistent_mq_handle::allow_sends(): implemented concept.
    +
    435 *
    +
    436 * ### INFO+ logging ###
    +
    437 * WARNING on duplicate use, INFO otherwise.
    +
    438 *
    +
    439 * @return See above.
    +
    440 */
    +
    441 bool allow_sends();
    +
    442
    +
    443 /**
    +
    444 * Implements Persistent_mq_handle API:
    +
    445 * Turn on preemptive/concurrent interruption of blocking-receives and receivable-waits/polls.
    +
    446 *
    +
    447 * @see Persistent_mq_handle::interrupt_receives(): implemented concept.
    +
    448 *
    +
    449 * ### INFO+ logging ###
    +
    450 * WARNING on duplicate use, INFO otherwise.
    +
    451 *
    +
    452 * @return See above.
    +
    453 */
    +
    454 bool interrupt_receives();
    +
    455
    +
    456 /**
    +
    457 * Implements Persistent_mq_handle API:
    +
    458 * Turn off preemptive/concurrent interruption of blocking-receives and receivable-waits/polls.
    +
    459 *
    +
    460 * @see Persistent_mq_handle::allow_receives(): implemented concept.
    +
    461 *
    +
    462 * ### INFO+ logging ###
    +
    463 * WARNING on duplicate use, INFO otherwise.
    +
    464 *
    +
    465 * @return See above.
    +
    466 */
    +
    467 bool allow_receives();
    +
    468
    +
    469 /**
    +
    470 * Implements Persistent_mq_handle API: Returns name equal to `absolute_name` passed to ctor.
    +
    471 * @return See above.
    +
    472 * @see Persistent_mq_handle::absolute_name(): implemented concept.
    +
    473 */
    +
    474 const Shared_name& absolute_name() const;
    +
    475
    +
    476 /**
    +
    477 * Implements Persistent_mq_handle API: Returns the max message size of the underlying queue. Reminder:
    +
    478 * This is not required to match was was passed to `Create_only` or `Open_or_create` ctor.
    +
    479 *
    +
    480 * @return See above.
    +
    481 * @see Persistent_mq_handle::max_msg_size(): implemented concept.
    +
    482 */
    +
    483 size_t max_msg_size() const;
    +
    484
    +
    485 /**
    +
    486 * Implements Persistent_mq_handle API: Returns the max message count of the underlying queue. Reminder:
    +
    487 * This is not required to match was was passed to `Create_only` or `Open_or_create` ctor.
    +
    488 *
    +
    489 * @return See above.
    +
    490 * @see Persistent_mq_handle::max_n_msgs(): implemented concept.
    +
    491 */
    +
    492 size_t max_n_msgs() const;
    +
    493
    +
    494 /**
    +
    495 * Implements Persistent_mq_handle API: Returns the stored native MQ handle; null if not open.
    +
    496 *
    +
    497 * @return See above.
    +
    498 * @see Persistent_mq_handle::native_handle(): implemented concept.
    +
    499 */
    + +
    501
    +
    502private:
    +
    503 // Types.
    +
    504
    +
    505 /// Short-hand for anonymous pipe write end.
    + +
    507
    +
    508 /// Short-hand for anonymous pipe read end.
    + +
    510
    +
    511 // Friends.
    +
    512
    +
    513 // Friend of Posix_mq_handle.
    +
    514 friend void swap(Posix_mq_handle& val1, Posix_mq_handle& val2);
    +
    515
    +
    516 // Constructors/destructor.
    +
    517
    +
    518 /**
    +
    519 * Helper ctor delegated by the 2 `public` ctors that take `Open_or_create` or `Create_only` mode.
    +
    520 *
    +
    521 * @tparam Mode_tag
    +
    522 * Either util::Open_or_create or util::Create_only.
    +
    523 * @param logger_ptr
    +
    524 * See `public` ctors.
    +
    525 * @param absolute_name
    +
    526 * See `public` ctors.
    +
    527 * @param mode_tag
    +
    528 * See `public` ctors.
    +
    529 * @param max_n_msg_on_create
    +
    530 * See `public` ctors.
    +
    531 * @param max_msg_sz_on_create
    +
    532 * See `public` ctors.
    +
    533 * @param perms_on_create
    +
    534 * See `public` ctors.
    +
    535 * @param err_code
    +
    536 * See `public` ctors.
    +
    537 */
    +
    538 template<typename Mode_tag>
    +
    539 explicit Posix_mq_handle(Mode_tag mode_tag, flow::log::Logger* logger_ptr, const Shared_name& absolute_name,
    +
    540 size_t max_n_msg_on_create, size_t max_msg_sz_on_create,
    +
    541 const util::Permissions& perms_on_create,
    +
    542 Error_code* err_code);
    +
    543
    +
    544 // Methods.
    +
    545
    +
    546 /**
    +
    547 * Ctor helper that sets up `m_interrupt*` pipe items. If it fails it returns truthy code
    +
    548 * and cleans up what it did. It ignores everything else like #m_mq.
    +
    549 *
    +
    550 * @return See above.
    +
    551 */
    + +
    553
    +
    554 /**
    +
    555 * Ctor helper that sets up #m_epoll_hndl_snd and #m_epoll_hndl_rcv. If it fails it returns truthy code
    +
    556 * and puts everything back to as-if-ctor-failed state, including #m_mq being null.
    +
    557 *
    +
    558 * @return See above.
    +
    559 */
    + +
    561
    +
    562 /**
    +
    563 * Sets #m_mq to blocking or non-blocking and returns `true` on success and clears `*err_code`; otherwise returns
    +
    564 * `false` and sets truthy `*err_code`.
    +
    565 *
    +
    566 * @param err_code
    +
    567 * To set. If null behavior is undefined (assertion may trip).
    +
    568 * @param nb
    +
    569 * Non-blocking if `true`, else blocking.
    +
    570 * @return `true` <=> success.
    +
    571 */
    +
    572 bool set_non_blocking(bool nb, Error_code* err_code);
    +
    573
    +
    574 /**
    +
    575 * Helper that handles the result of an `mq_*()` call by logging WARNING(s) on error; setting `*err_code` on error;
    +
    576 * clearing it on success. `errno` is presumably set by the native API on error going into this.
    +
    577 *
    +
    578 * @param result
    +
    579 * What the native API returned.
    +
    580 * @param err_code
    +
    581 * To set. If null behavior is undefined (assertion may trip).
    +
    582 * @param context
    +
    583 * See Bipc_mq_handle::op_with_possible_bipc_mq_exception().
    +
    584 * @return `true` if `*err_code` was set to success (falsy); else `false` (it was set to truthy).
    +
    585 */
    +
    586 bool handle_mq_api_result(int result, Error_code* err_code, util::String_view context) const;
    +
    587
    +
    588 /**
    +
    589 * Impl body for `interrupt_*()`.
    +
    590 *
    +
    591 * @tparam SND_ELSE_RCV
    +
    592 * True for `*_sends()`, else `*_receives()`.
    +
    593 * @return See callers.
    +
    594 */
    +
    595 template<bool SND_ELSE_RCV>
    +
    596 bool interrupt_impl();
    +
    597
    +
    598 /**
    +
    599 * Impl body for `allow_*()`.
    +
    600 *
    +
    601 * @tparam SND_ELSE_RCV
    +
    602 * True for `*_sends()`, else `*_receives()`.
    +
    603 * @return See callers.
    +
    604 */
    +
    605 template<bool SND_ELSE_RCV>
    +
    606 bool allow_impl();
    +
    607
    +
    608 /**
    +
    609 * Impl body for `*_sendable()` and `*_receivable()`.
    +
    610 *
    +
    611 * @param timeout_from_now_or_none
    +
    612 * `timeout_from_now`; or 0 for `is_*()`, or `Fine_duration::max()` for non-timed-blocking variant.
    +
    613 * @param snd_else_rcv
    +
    614 * True for `*_sendable()`, else `*_receivable()`.
    +
    615 * @param err_code
    +
    616 * See callers.
    +
    617 * @return See callers.
    +
    618 */
    +
    619 bool wait_impl(util::Fine_duration timeout_from_now_or_none, bool snd_else_rcv, Error_code* err_code);
    +
    620
    +
    621 // Data.
    +
    622
    +
    623 /**
    +
    624 * Underlying MQ handle. We are a thin wrapper around this really. `.null()` if creation
    +
    625 * fails in ctor, or if `*this` was moved-from. This is very light-weight; probably `int`.
    +
    626 */
    + +
    628
    +
    629 /// See absolute_name().
    + +
    631
    +
    632 /**
    +
    633 * `epoll_*()` handle (`.null()` if and only if #m_mq is null) that is level-triggered to be active
    +
    634 * (with only 1 event registered) if and only if #m_mq is currently capable of sending at least 1 message
    +
    635 * (we could push 1+ messages right now). Used by wait_impl() and its various public `*_sendable()` forms.
    +
    636 */
    + +
    638
    +
    639 /**
    +
    640 * `epoll_*()` handle (`.null()` if and only if #m_mq is null) that is level-triggered to be active
    +
    641 * (with only 1 event registered) if and only if #m_mq is currently storing at least 1 message
    +
    642 * (we could pop 1+ messages right now). Used by wait_impl() and its various public `*_receivable()` forms.
    +
    643 */
    + +
    645
    +
    646 /**
    +
    647 * Starting at `false`, this is made `true` via interrupt_sends(), and back by allow_sends(); acts as a guard
    +
    648 * against doing it when already in effect. Note that that is its only purpose; as wait_impl() never checks it;
    +
    649 * instead it relies on `epoll_wait()` detecting a readable #m_interrupt_detector_rcv.
    +
    650 */
    + +
    652
    +
    653 /// Other-direction counterpart to #m_interrupting_snd.
    + +
    655
    +
    656 /// Never used for `.run()` or `.async()` -- just so we can construct #Pipe_reader, #Pipe_writer.
    +
    657 flow::util::Task_engine m_nb_task_engine;
    +
    658
    +
    659 /**
    +
    660 * A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl()
    +
    661 * indicating that #m_interrupting_snd mode is on.
    +
    662 */
    + +
    664
    +
    665 /**
    +
    666 * A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl()
    +
    667 * indicating that #m_interrupting_snd mode is off; and wait_impl() poll-waits on this along with
    +
    668 * #m_mq -- if it is readable, then the mode is on.
    +
    669 */
    + +
    671
    +
    672 /// Other-direction counterpart to #m_interrupter_snd.
    + +
    674
    +
    675 /// Other-direction counterpart to #m_interrupt_detector_snd.
    + +
    677}; // class Posix_mq_handle
    +
    678
    +
    679// Free functions: in *_fwd.hpp.
    +
    680
    +
    681// Template implementations.
    +
    682
    +
    683template<typename Handle_name_func>
    +
    684void Posix_mq_handle::for_each_persistent(const Handle_name_func& handle_name_func) // Static.
    +
    685{
    +
    686#ifndef FLOW_OS_LINUX
    +
    687 static_assert(false, "This method relies on/has been tested only with Linux /dev/mqueue semantics.");
    +
    688#endif
    +
    689 util::for_each_persistent_impl("/dev/mqueue", handle_name_func);
    +
    690}
    +
    691
    +
    692} // namespace ipc::transport
    +
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    bool allow_sends()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-sends an...
    bool interrupt_receives()
    Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-receives ...
    bool interrupt_sends()
    Implements Persistent_mq_handle API: Turn on preemptive/concurrent interruption of blocking-sends and...
    -
    util::Pipe_reader Pipe_reader
    Short-hand for anonymous pipe read end.
    +
    util::Pipe_reader Pipe_reader
    Short-hand for anonymous pipe read end.
    void wait_receivable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like receive() but without the actual popping of a message.
    -
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    -
    static void for_each_persistent(const Handle_name_func &handle_name_func)
    Implements Persistent_mq_handle API.
    +
    static const Shared_name S_RESOURCE_TYPE_ID
    Implements concept API.
    +
    static void for_each_persistent(const Handle_name_func &handle_name_func)
    Implements Persistent_mq_handle API.
    bool handle_mq_api_result(int result, Error_code *err_code, util::String_view context) const
    Helper that handles the result of an mq_*() call by logging WARNING(s) on error; setting *err_code on...
    -
    Pipe_reader m_interrupt_detector_snd
    A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl(...
    -
    Native_handle m_epoll_hndl_snd
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    +
    Pipe_reader m_interrupt_detector_snd
    A byte is read from this end by allow_sends() to make it not-readable for the poll-wait in wait_impl(...
    +
    Native_handle m_epoll_hndl_snd
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    bool is_receivable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like try_receive() but without the actual popping of a message.
    bool allow_receives()
    Implements Persistent_mq_handle API: Turn off preemptive/concurrent interruption of blocking-receives...
    bool is_sendable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like try_send() but without the actual pushing of a message.
    size_t max_msg_size() const
    Implements Persistent_mq_handle API: Returns the max message size of the underlying queue.
    -
    Pipe_reader m_interrupt_detector_rcv
    Other-direction counterpart to m_interrupt_detector_snd.
    +
    Pipe_reader m_interrupt_detector_rcv
    Other-direction counterpart to m_interrupt_detector_snd.
    Error_code epoll_setup()
    Ctor helper that sets up m_epoll_hndl_snd and m_epoll_hndl_rcv.
    -
    util::Pipe_writer Pipe_writer
    Short-hand for anonymous pipe write end.
    +
    util::Pipe_writer Pipe_writer
    Short-hand for anonymous pipe write end.
    size_t max_n_msgs() const
    Implements Persistent_mq_handle API: Returns the max message count of the underlying queue.
    bool try_send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking send: pushes copy of message to queue and returns t...
    -
    Pipe_writer m_interrupter_rcv
    Other-direction counterpart to m_interrupter_snd.
    +
    Pipe_writer m_interrupter_rcv
    Other-direction counterpart to m_interrupter_snd.
    Native_handle native_handle() const
    Implements Persistent_mq_handle API: Returns the stored native MQ handle; null if not open.
    bool timed_wait_receivable(util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like timed_receive() but without the actual popping of a message...
    bool wait_impl(util::Fine_duration timeout_from_now_or_none, bool snd_else_rcv, Error_code *err_code)
    Impl body for *_sendable() and *_receivable().
    @@ -790,10 +791,10 @@
    void receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking receive: pops copy of message from queue into buffer; i...
    void send(const util::Blob_const &blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking send: pushes copy of message to queue; if queue is full...
    Posix_mq_handle()
    Implements Persistent_mq_handle API: Construct null handle.
    -
    bool m_interrupting_snd
    Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); acts as a guar...
    +
    bool m_interrupting_snd
    Starting at false, this is made true via interrupt_sends(), and back by allow_sends(); acts as a guar...
    Posix_mq_handle(const Posix_mq_handle &)=delete
    Copying of handles is prohibited, per Persistent_mq_handle concept.
    const Shared_name & absolute_name() const
    Implements Persistent_mq_handle API: Returns name equal to absolute_name passed to ctor.
    -
    Native_handle m_epoll_hndl_rcv
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    +
    Native_handle m_epoll_hndl_rcv
    epoll_*() handle (.null() if and only if m_mq is null) that is level-triggered to be active (with onl...
    Posix_mq_handle & operator=(const Posix_mq_handle &)=delete
    Copying of handles is prohibited, per Persistent_mq_handle concept.
    bool allow_impl()
    Impl body for allow_*().
    bool interrupt_impl()
    Impl body for interrupt_*().
    @@ -801,41 +802,41 @@
    bool timed_receive(util::Blob_mutable *blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed receive: pops copy of message from queue into buf...
    ~Posix_mq_handle()
    Implements Persistent_mq_handle API: Destroys this handle (or no-op if no handle was successfully con...
    bool set_non_blocking(bool nb, Error_code *err_code)
    Sets m_mq to blocking or non-blocking and returns true on success and clears *err_code; otherwise ret...
    -
    Shared_name m_absolute_name
    See absolute_name().
    +
    Shared_name m_absolute_name
    See absolute_name().
    bool timed_send(const util::Blob_const &blob, util::Fine_duration timeout_from_now, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Blocking timed send: pushes copy of message to queue; if queue i...
    bool try_receive(util::Blob_mutable *blob, Error_code *err_code=0)
    Implements Persistent_mq_handle API: Non-blocking receive: pops copy of message from queue into buffe...
    Error_code pipe_setup()
    Ctor helper that sets up m_interrupt* pipe items.
    void wait_sendable(Error_code *err_code=0)
    Implements Persistent_mq_handle API: Like send() but without the actual pushing of a message.
    -
    bool m_interrupting_rcv
    Other-direction counterpart to m_interrupting_snd.
    -
    Pipe_writer m_interrupter_snd
    A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl...
    -
    Native_handle m_mq
    Underlying MQ handle.
    -
    flow::util::Task_engine m_nb_task_engine
    Never used for .run() or .async() – just so we can construct Pipe_reader, Pipe_writer.
    +
    bool m_interrupting_rcv
    Other-direction counterpart to m_interrupting_snd.
    +
    Pipe_writer m_interrupter_snd
    A byte is written to this end by interrupt_sends() to make it readable for the poll-wait in wait_impl...
    +
    Native_handle m_mq
    Underlying MQ handle.
    +
    flow::util::Task_engine m_nb_task_engine
    Never used for .run() or .async() – just so we can construct Pipe_reader, Pipe_writer.
    Posix_mq_handle & operator=(Posix_mq_handle &&src)
    Implements Persistent_mq_handle API: Replaces handle with the source handle while making the latter i...
    -
    static constexpr bool S_HAS_NATIVE_HANDLE
    Implements concept API. Contrast this value with Bipc_mq_handle::S_HAS_NATIVE_HANDLE.
    +
    static constexpr bool S_HAS_NATIVE_HANDLE
    Implements concept API. Contrast this value with Bipc_mq_handle::S_HAS_NATIVE_HANDLE.
    String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:155
    -
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:149
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    bipc::permissions Permissions
    Short-hand for Unix (POSIX) permissions class.
    Definition: util_fwd.hpp:161
    +
    bipc::open_only_t Open_only
    Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
    Definition: util_fwd.hpp:155
    void for_each_persistent_impl(const fs::path &persistent_obj_dev_dir_path, const Handle_name_func &handle_name_func)
    Implementation of Persistent_object::for_each_persistent(); for example see shm::classic::Pool_arena:...
    Definition: util.hpp:90
    -
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:134
    +
    boost::asio::mutable_buffer Blob_mutable
    Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
    Definition: util_fwd.hpp:140
    boost::asio::writable_pipe Pipe_writer
    Short-hand for anonymous pipe write end.
    Definition: util_fwd.hpp:32
    -
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:146
    -
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:152
    +
    bipc::open_or_create_t Open_or_create
    Tag type indicating an atomic open-if-exists-else-create operation.
    Definition: util_fwd.hpp:152
    +
    bipc::create_only_t Create_only
    Tag type indicating a create-unless-exists-else-fail operation.
    Definition: util_fwd.hpp:158
    boost::asio::readable_pipe Pipe_reader
    Short-hand for anonymous pipe read end.
    Definition: util_fwd.hpp:35
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:128
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    boost::asio::const_buffer Blob_const
    Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
    Definition: util_fwd.hpp:134
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/process__credentials_8cpp.html b/doc/ipc_doc/generated/html_full/process__credentials_8cpp.html index c6ad4d969..59b2ee5a1 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials_8cpp.html +++ b/doc/ipc_doc/generated/html_full/process__credentials_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -103,7 +103,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/process__credentials_8cpp_source.html b/doc/ipc_doc/generated/html_full/process__credentials_8cpp_source.html index c3d77dbe3..96984fe27 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/process__credentials_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -145,7 +145,7 @@
    73 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
    74
    75#ifndef FLOW_OS_LINUX
    -
    76# error "process_invoked_as() depends on Linux /proc semantics."
    +
    76 static_assert(false, "process_invoked_as() depends on Linux /proc semantics.");
    77#endif
    78
    79 path cmd_line_path("/proc");
    @@ -245,18 +245,18 @@
    std::string process_invoked_as(Error_code *err_code=0) const
    Obtains, from the OS, information as to the binary name via which process process_id() was started,...
    group_id_t group_id() const
    The group user ID (GID).
    Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
    -
    ::pid_t process_id_t
    Syntactic-sugary type for POSIX process ID (integer).
    Definition: util_fwd.hpp:137
    -
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    -
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:143
    -
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:140
    -
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    -
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    ::pid_t process_id_t
    Syntactic-sugary type for POSIX process ID (integer).
    Definition: util_fwd.hpp:143
    +
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    +
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:149
    +
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:146
    +
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    +
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/process__credentials_8hpp.html b/doc/ipc_doc/generated/html_full/process__credentials_8hpp.html index 2241b4b6b..d70ace15c 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials_8hpp.html +++ b/doc/ipc_doc/generated/html_full/process__credentials_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -114,7 +114,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/process__credentials_8hpp_source.html b/doc/ipc_doc/generated/html_full/process__credentials_8hpp_source.html index 1fc7ee438..db268e2d7 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/process__credentials_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -256,16 +256,16 @@
    std::string process_invoked_as(Error_code *err_code=0) const
    Obtains, from the OS, information as to the binary name via which process process_id() was started,...
    group_id_t group_id() const
    The group user ID (GID).
    Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
    -
    ::pid_t process_id_t
    Syntactic-sugary type for POSIX process ID (integer).
    Definition: util_fwd.hpp:137
    -
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:143
    -
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:140
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    ::pid_t process_id_t
    Syntactic-sugary type for POSIX process ID (integer).
    Definition: util_fwd.hpp:143
    +
    ::gid_t group_id_t
    Syntactic-sugary type for POSIX group ID (integer).
    Definition: util_fwd.hpp:149
    +
    ::uid_t user_id_t
    Syntactic-sugary type for POSIX user ID (integer).
    Definition: util_fwd.hpp:146
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    diff --git a/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp.html index 522e21954..09eecee7c 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -101,7 +101,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp_source.html index 20f3f5e1f..22245d010 100644 --- a/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/process__credentials__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -147,13 +147,13 @@
    75
    76} // namespace ipc::util
    Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
    -
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    -
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    -
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    +
    std::ostream & operator<<(std::ostream &os, const Native_handle &val)
    Prints string representation of the given Native_handle to the given ostream.
    +
    bool operator!=(Native_handle val1, Native_handle val2)
    Negation of similar ==.
    +
    bool operator==(Native_handle val1, Native_handle val2)
    Returns true if and only if the two Native_handle objects are the same underlying handle.
    diff --git a/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp.html b/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp.html index 6db1c338a..50b407ffc 100644 --- a/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp.html +++ b/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -90,7 +90,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp_source.html b/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp_source.html index 26ed67000..b848edb92 100644 --- a/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/protocol__negotiator_8cpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -232,15 +232,15 @@
    @ S_PROTOCOL_NEGOTIATION_OPPOSING_VER_INVALID
    In protocol negotiation, opposing side sent invalid version value (not positive, not a number,...
    @ S_PROTOCOL_NEGOTIATION_OPPOSING_VER_TOO_OLD
    In protocol negotiation, opposing side reported its newest protocol version is even older than the mo...
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp.html b/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp.html index 57e7f42a2..b343bbb3e 100644 --- a/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp.html +++ b/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -97,7 +97,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp_source.html b/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp_source.html index 39c5724ee..e255cdbdd 100644 --- a/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/protocol__negotiator_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -448,14 +448,14 @@
    Protocol_negotiator & operator=(const Protocol_negotiator &src)
    Copy-assigns *this to be equal to src.
    Protocol_negotiator(const Protocol_negotiator &src)
    Copy-constructs *this to be equal to src object.
    -
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    diff --git a/doc/ipc_doc/generated/html_full/safety_perms.html b/doc/ipc_doc/generated/html_full/safety_perms.html index 5e1ca37be..04ca6adb5 100644 --- a/doc/ipc_doc/generated/html_full/safety_perms.html +++ b/doc/ipc_doc/generated/html_full/safety_perms.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -147,7 +147,7 @@

    Permissions level: GROUP_ACCESS

    diff --git a/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp.html b/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp.html index 8381bdaca..5041deadb 100644 --- a/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -106,7 +106,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp_source.html b/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp_source.html index 5f8bf4513..bb0c33fc4 100644 --- a/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/server__session__adapter_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -310,7 +310,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp.html b/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp.html index e2f0c1020..ae6e7eb40 100644 --- a/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -142,7 +142,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp_source.html b/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp_source.html index 424b8d3ad..7969d5382 100644 --- a/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/server__session__dtl_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -243,7 +243,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html index fba6d2c6f..03a1d20a5 100644 --- a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -120,7 +120,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html index 60544e66c..5946ce920 100644 --- a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -178,7 +178,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp.html index 0dc2aa299..a80d92874 100644 --- a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -117,7 +117,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp_source.html index 5cdf22d6c..07cf035a1 100644 --- a/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2detail_2shm_2classic_2classic__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -173,7 +173,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html index b648902b3..f45dfe711 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -101,7 +101,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html index 002aa9059..8419c1af2 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -125,7 +125,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html index aaf5c74dc..6f9f2d348 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -122,7 +122,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html index 017ccc3d0..9925bf3e9 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -256,7 +256,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp.html index 56ab2a0c0..f3a6c54f2 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -100,7 +100,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp_source.html index 6d7414124..c36777576 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -118,7 +118,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp.html index 603ac2571..2d8bc9385 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -119,7 +119,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp_source.html index 3a03cab86..a8f3c5494 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2classic_2classic__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -235,7 +235,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp.html index d2a303736..8a566c4a0 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -105,7 +105,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp_source.html index 20b91aa34..30662b800 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2shm_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -133,7 +133,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp.html index decf9c067..463409318 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -90,7 +90,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp_source.html index be6c78500..cc7e691e9 100644 --- a/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session_2shm_2shm__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -234,7 +234,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session__adapter_8hpp.html b/doc/ipc_doc/generated/html_full/session__adapter_8hpp.html index d5bab6c39..eefa2248e 100644 --- a/doc/ipc_doc/generated/html_full/session__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__adapter_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -104,7 +104,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session__adapter_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__adapter_8hpp_source.html index baee72ebc..2a4cbaa77 100644 --- a/doc/ipc_doc/generated/html_full/session__adapter_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__adapter_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -852,13 +852,13 @@
    sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::session.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
    In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122
    void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
    Writes a byte to the given pipe writer.
    Definition: util.cpp:67
    void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
    Reads a byte via the given pipe reader.
    Definition: util.cpp:96
    boost::asio::writable_pipe Pipe_writer
    Short-hand for anonymous pipe write end.
    Definition: util_fwd.hpp:32
    boost::asio::readable_pipe Pipe_reader
    Short-hand for anonymous pipe read end.
    Definition: util_fwd.hpp:35
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:301
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:302
    An App that is used as a client in at least one client-server IPC split.
    Definition: app.hpp:185
    An App that is used as a server in at least one client-server IPC split.
    Definition: app.hpp:206
    @@ -866,12 +866,12 @@
    Channel_obj m_channel
    Result 1/2 given about to be given to m_on_channel_func_or_empty.
    Mdt_reader_ptr m_mdt_reader_ptr
    Result 2/2 given about to be given to m_on_channel_func_or_empty.
    boost::movelib::unique_ptr< Channel_open_result > Ptr
    Short-hand for pointer wrapper around a *this.
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/session__base_8hpp.html b/doc/ipc_doc/generated/html_full/session__base_8hpp.html index 3e0f16b25..0ab0834df 100644 --- a/doc/ipc_doc/generated/html_full/session__base_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__base_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -153,7 +153,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/session__base_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__base_8hpp_source.html index e090f2063..ceaa1dd42 100644 --- a/doc/ipc_doc/generated/html_full/session__base_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__base_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -1297,7 +1297,7 @@
    A Channel with a blobs pipe consisting of 2 MQs of type Persistent_mq_handle (template arg); and a ha...
    Definition: channel.hpp:1278
    static const Shared_name & S_RESOURCE_TYPE_ID
    Shared_name relative-folder fragment (no separators) identifying this resource type.
    Dummy type for use as a template param to Channel when either the blobs pipe or handles pipe is disab...
    Definition: channel.hpp:1000
    -
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    +
    Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
    A Channel with a blobs pipe only (no handles pipe) that uses a Unix domain socket connection as the u...
    Definition: channel.hpp:1097
    A Channel with a handles pipe only (no blobs pipe) that uses a Unix domain socket connection as the u...
    Definition: channel.hpp:1029
    Owning and wrapping a pre-connected transport::Channel peer (an endpoint of an established channel ov...
    Definition: channel.hpp:589
    @@ -1317,10 +1317,10 @@
    Builder< ipc::shm::classic::Pool_arena > Builder
    Convenience alias: transport::struc::shm::Builder that works with boost.ipc.shm pools from ipc::shm::...
    Definition: classic_fwd.hpp:36
    Reader< ipc::shm::classic::Pool_arena > Reader
    Convenience alias: transport::struc::shm::Reader that works with boost.ipc.shm pools from ipc::shm::c...
    Definition: classic_fwd.hpp:39
    const fs::path IPC_KERNEL_PERSISTENT_RUN_DIR
    Absolute path to the directory (without trailing separator) in the file system where kernel-persisten...
    Definition: util.cpp:63
    -
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:111
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:301
    +
    flow::Fine_duration Fine_duration
    Short-hand for Flow's Fine_duration.
    Definition: util_fwd.hpp:117
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:302
    #define TEMPLATE_SESSION_BASE
    Internally used macro; public API users should disregard (same deal as in struc/channel....
    @@ -1332,7 +1332,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/session__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/session__fwd_8hpp.html index 174477b0b..182bfc0b0 100644 --- a/doc/ipc_doc/generated/html_full/session__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__fwd_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -160,7 +160,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__fwd_8hpp_source.html index 4f3c6fd47..9aca2209d 100644 --- a/doc/ipc_doc/generated/html_full/session__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -616,19 +616,19 @@
    util::Shared_name Shared_name
    Convenience alias for the commonly used type util::Shared_name.
    transport::struc::Session_token Session_token
    Convenience alias for the commonly used type transport::struc::Session_token.
    boost::uuids::uuid Session_token
    A type used by struc::Channel for internal safety/security/auth needs.
    Definition: struc_fwd.hpp:113
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    A description of an application in this ipc::session inter-process communication universe.
    Definition: app.hpp:78
    An App that is used as a client in at least one client-server IPC split.
    Definition: app.hpp:185
    An App that is used as a server in at least one client-server IPC split.
    Definition: app.hpp:206
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp.html b/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp.html index e195e139e..7d1c4dbcd 100644 --- a/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -106,7 +106,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp_source.html index 0a29b1160..5c39b6382 100644 --- a/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__server__adapter_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -568,18 +568,18 @@
    std::ostream & operator<<(std::ostream &os, const Server_session_adapter< Session > &val)
    Prints string representation of the given Server_session_adapter to the given ostream.
    util::Native_handle Native_handle
    Convenience alias for the commonly used type util::Native_handle.
    Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
    In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122
    void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
    Writes a byte to the given pipe writer.
    Definition: util.cpp:67
    void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
    Reads a byte via the given pipe reader.
    Definition: util.cpp:96
    boost::asio::writable_pipe Pipe_writer
    Short-hand for anonymous pipe write end.
    Definition: util_fwd.hpp:32
    boost::asio::readable_pipe Pipe_reader
    Short-hand for anonymous pipe read end.
    Definition: util_fwd.hpp:35
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    -
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    +
    A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
    diff --git a/doc/ipc_doc/generated/html_full/session__server__impl_8hpp.html b/doc/ipc_doc/generated/html_full/session__server__impl_8hpp.html index 28d2d0d23..618bbbe86 100644 --- a/doc/ipc_doc/generated/html_full/session__server__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__server__impl_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -163,7 +163,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/session__server__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__server__impl_8hpp_source.html index 751660647..9ec56c2c2 100644 --- a/doc/ipc_doc/generated/html_full/session__server__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__server__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -1117,16 +1117,16 @@
    Shared_name build_conventional_shared_name_prefix(const Shared_name &resource_type, const Shared_name &srv_app_name)
    Return the prefix common to all calls to either build_conventional_shared_name() overload with the ar...
    std::ostream & operator<<(std::ostream &os, const App &val)
    Prints string representation of the given App to the given ostream.
    Definition: app.cpp:124
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    -
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:116
    +
    flow::async::Task Task
    Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
    Definition: util_fwd.hpp:122
    const Open_or_create OPEN_OR_CREATE
    Tag value indicating an open-if-exists-else-create operation.
    Definition: util.cpp:30
    const boost::array< Permissions, size_t(Permissions_level::S_END_SENTINEL)> PRODUCER_CONSUMER_RESOURCE_PERMISSIONS_LVL_MAP
    Maps general Permissions_level specifier to low-level Permissions value, when the underlying resource...
    Definition: util.cpp:42
    void set_resource_permissions(flow::log::Logger *logger_ptr, const fs::path &path, const Permissions &perms, Error_code *err_code)
    Utility that sets the permissions of the given resource (at the supplied file system path) to specifi...
    Definition: util.cpp:46
    void op_with_possible_bipc_exception(flow::log::Logger *logger_ptr, Error_code *err_code, const Error_code &misc_bipc_lib_error, String_view context, const Func &func)
    Internal (to ipc) utility that invokes the given function that invokes a boost.interprocess operation...
    Definition: util.hpp:34
    Permissions shared_resource_permissions(Permissions_level permissions_lvl)
    Maps general Permissions_level specifier to low-level Permissions value, when the underlying resource...
    Definition: util.cpp:37
    -
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:109
    -
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:322
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    -
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:301
    +
    flow::util::String_view String_view
    Short-hand for Flow's String_view.
    Definition: util_fwd.hpp:115
    +
    Log_component
    The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
    Definition: common.hpp:323
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298
    +
    flow::Function< Signature > Function
    Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
    Definition: common.hpp:302
    #define TEMPLATE_SESSION_SERVER_IMPL
    Internally used macro; public API users should disregard (same deal as in struc/channel....
    @@ -1148,7 +1148,7 @@

    diff --git a/doc/ipc_doc/generated/html_full/session__shared__name_8hpp.html b/doc/ipc_doc/generated/html_full/session__shared__name_8hpp.html index 67b22e0c2..136a1c659 100644 --- a/doc/ipc_doc/generated/html_full/session__shared__name_8hpp.html +++ b/doc/ipc_doc/generated/html_full/session__shared__name_8hpp.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -108,7 +108,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session__shared__name_8hpp_source.html b/doc/ipc_doc/generated/html_full/session__shared__name_8hpp_source.html index 5f3fa1930..e3cfa9e30 100644 --- a/doc/ipc_doc/generated/html_full/session__shared__name_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/session__shared__name_8hpp_source.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -276,7 +276,7 @@
    diff --git a/doc/ipc_doc/generated/html_full/session_app_org.html b/doc/ipc_doc/generated/html_full/session_app_org.html index ae58c7099..3b521ed6b 100644 --- a/doc/ipc_doc/generated/html_full/session_app_org.html +++ b/doc/ipc_doc/generated/html_full/session_app_org.html @@ -21,7 +21,7 @@ -
    Flow-IPC 1.0.1 +
    Flow-IPC 1.0.2
    Flow-IPC project: Full implementation reference.
    @@ -262,7 +262,7 @@

    Organizing application code around sessions

    }; // class Process
    This is to vanilla Session_server what shm::classic::Server_session is to vanilla Server_session: it ...
    @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
    Async completion handler is being called prematurely, because underlying object is shutting down,...
    -
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:297
    +
    flow::Error_code Error_code
    Short-hand for flow::Error_code which is very common.
    Definition: common.hpp:298

    To summarize: There are concurrent algorithms in play here, executing in interleaved async fashion via thread U (m_worker):

    • First, initialize IPC universe description; and start Session_server m_session_srv. Then begin loop:
    • Algorithm 1 (one running throughout): Ask m_session_srv to accept the next session in the background. Once ready, give it to algorithm 2; and repeat.
        @@ -438,7 +438,7 @@

        Organizing application code around sessions

        m_worker->post([this]() { m_on_session_closed_func(); });
        }
        };
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122

        Simple, really. So what's the big deal? Answer: Mainly the big deal is: the per-session objects (where it says ATTENTION!) are encapsulated cleanly at the same level as the Session: they are thus destroyed/nullified at the same time (in fact, the latter before the former).

        So now all that's left is to hook this up to the rest of Process, in each application: process_session(). That's where things are somewhat different – since the session is open almost-but-not-quite, and the API somewhat differs between the two. Client first:

        // In session-client app Bp.
        @@ -536,7 +536,7 @@

        What did we miss?

        diff --git a/doc/ipc_doc/generated/html_full/session_setup.html b/doc/ipc_doc/generated/html_full/session_setup.html index 648803562..ba6077d94 100644 --- a/doc/ipc_doc/generated/html_full/session_setup.html +++ b/doc/ipc_doc/generated/html_full/session_setup.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -168,7 +168,7 @@

        Client_session setup

        // By the way... for all future mentions of Error_code:
        Implements the SHM-related API common to shm::classic::Server_session and shm::classic::Client_sessio...
        Definition: session.hpp:44
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        Next let's decide on the values for those 3 template parameters. The first two determine the concrete type of ipc::transport::Channel that shall be opened in this session. The last template parameter is used for certain advanced purposes around channel-opening. We'll talk about all of those topics in Sessions: Opening Channels. For now we'll forego the advanced-metadata stuff (leave that arg at default), and we'll choose a sufficiently powerful and performant setting for the former 2 params. Thus, again, we strongly recommend to define the concrete type in an alias, so that the details need not be repeated subsequently.

        // Each channel shall contain (only) a (bidirectional) Unix domain stream socket, capable of transmitting data and native handles.
        // This is sufficient for all purposes in terms of what it can transmit; and can only be potentially improved upon -- likely marginally
        @@ -280,7 +280,7 @@

        Client_session setup

        diff --git a/doc/ipc_doc/generated/html_full/setup.html b/doc/ipc_doc/generated/html_full/setup.html index fab074e3e..beebac69e 100644 --- a/doc/ipc_doc/generated/html_full/setup.html +++ b/doc/ipc_doc/generated/html_full/setup.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -70,7 +70,7 @@

        Here we discuss the environmental requirements for using Flow-IPC as well as quality-of-life setup basics including logging. (Or go back to preceding page: API Overview / Synopses.)

        OS and build environment

        Note
        In the short term (as of October 2023) this may become an open-source library with potentially wide distribution. Some of the below items may change in that case; for example it may become a header-only library or have that mode, and it may support additional OS rather than Linux. We would also include specific information on building it from source as befits a wide-release project. Until then we leave out specific instructions on building the library itself as outside the scope of the present document; while listing the environmental requirements/recommendations as follows. It is vaguely informational; until this is a wide-release library we stay away from rigorous build instructions here. Even once it becomes a wide-release product, possibly such instructions shall live outside this manual. Looking outside the src/ directory you'll certainly find the relevant build scripts which cover all that.
        -

        This is a Linux library (actually set of libraries, but in this Manual we treat Flow-IPC as a monolithic whole for simplicity). As of this writing it is to be built in 64-bit mode (x86-64 a/k/a AMD64). (Most code by far is not OS/architecture-specific, but at least certain aspects of the optionally-used SHM-jemalloc component are.) It is intended for use at least in a deployed server setting. As of this writing it relies on some Linux-specific techniques such as /proc/...pid.../ and /dev/shm/ semantics. In the future it is quite realistic it would be extended to other OS and architectures – possibly even Windows, but definitely MacOS/Darwin and FreeBSD and orthogonally perhaps ARM64 and so on.

        +

        This is a Linux library (actually set of libraries, but in this Manual we treat Flow-IPC as a monolithic whole for simplicity). As of this writing it is to be built in 64-bit mode (x86-64 a/k/a AMD64). (Most code by far is not OS/architecture-specific, but at least certain aspects of the optionally-used SHM-jemalloc component are.) It is intended for use at least in a deployed server setting. As of this writing it relies on some Linux-specific techniques such as /proc/...pid.../ and /dev/shm/ semantics. In the future it is quite realistic it would be extended to other OS and architectures – possibly even Windows, but definitely macOS/Darwin/similar and orthogonally perhaps ARM64 and so on.

        It is a linked library (libraries) that must be built in C++17 compiler mode, as must any of its #includers (translation units). It has been specifically tested (as of this writing) on a range of gcc and clang compilers/linkers. We omit details in this text, since this is likely to evolve over time. Generally such topics are well covered outside of src/ directories; start with the top-level README.md for an overview; it will point you to CMake scripts and so on – if there is interest.

        Regarding the briefly-mentioned-above testing: As of this writing there is an automated CI/CD test suite which checks the various combinations of compiler and build-type (debug, release, various sanitizers, etc.) – both building and functionality. Again we omit details here; but as of this writing you can see the details at the official open-source project (GitHub organization "Flow-IPC," as I write this). You'll likely find a few files like .github/..., conanfile.py, and sanitizer-specific .cfg files which control this stuff. This is well outside our scope in this Manual, but we wanted you to be aware of such things.

        Regarding test code itself: We do not talk about it in this Manual or Reference (again: out of scope); but it is in the same repo (repos). Some test code (of the unit-test variety) is in test/ subdirs at various levels near production code; other test code is outside src/ entirely – whether the unit test driver program(s) or the various integration-tests.

        @@ -122,7 +122,7 @@

        Logging verbosity setting

        diff --git a/doc/ipc_doc/generated/html_full/shared__name_8cpp.html b/doc/ipc_doc/generated/html_full/shared__name_8cpp.html index 9c13292ce..9a4bc2d69 100644 --- a/doc/ipc_doc/generated/html_full/shared__name_8cpp.html +++ b/doc/ipc_doc/generated/html_full/shared__name_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -148,7 +148,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shared__name_8cpp_source.html b/doc/ipc_doc/generated/html_full/shared__name_8cpp_source.html index 16a3c6c95..31e22d310 100644 --- a/doc/ipc_doc/generated/html_full/shared__name_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/shared__name_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -522,23 +522,23 @@
        static const size_t S_MAX_LENGTH
        Max value of size() such that, if str() used to name a supported shared resource, sys call safely won...
        util::Shared_name Shared_name
        Convenience alias for the commonly used type util::Shared_name.
        Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
        -
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        -
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        +
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        +
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        Shared_name build_conventional_non_session_based_shared_name(const Shared_name &resource_type)
        Builds an absolute name according to the path convention explained in Shared_name class doc header; t...
        bool operator==(util::String_view val1, const Shared_name &val2)
        Returns true if and only if string(val1) == val2.str().
        void swap(Shared_name &val1, Shared_name &val2)
        Swaps two objects.
        Shared_name operator/(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) /= raw_src2.
        -
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        -
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        +
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        +
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        std::istream & operator>>(std::istream &is, Shared_name &val)
        Reads Shared_name from the given istream; equivalent to reading string into Shared_name::str().
        -
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        +
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        Shared_name operator+(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) += raw_src2.
        Definition: shared_name.cpp:97
        diff --git a/doc/ipc_doc/generated/html_full/shared__name_8hpp.html b/doc/ipc_doc/generated/html_full/shared__name_8hpp.html index 484646b17..2a1f18ccc 100644 --- a/doc/ipc_doc/generated/html_full/shared__name_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shared__name_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -124,7 +124,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shared__name_8hpp_source.html b/doc/ipc_doc/generated/html_full/shared__name_8hpp_source.html index 50bc916b0..5d3115552 100644 --- a/doc/ipc_doc/generated/html_full/shared__name_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shared__name_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -895,14 +895,14 @@
        unsigned int remove_each_persistent_if(flow::log::Logger *logger_ptr, const Filter_func &filter_func)
        Utility that invokes Persistent_object::for_each_persistent(name_prefix_or_empty) and synchronously i...
        Shared_name operator/(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) /= raw_src2.
        unsigned int remove_each_persistent_with_name_prefix(flow::log::Logger *logger_ptr, const Shared_name &name_prefix_or_empty)
        Utility that invokes remove_each_persistent_if() with the filter that returns true (yes,...
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        Shared_name operator+(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) += raw_src2.
        Definition: shared_name.cpp:97
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        diff --git a/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp.html index b3cd10a35..beeab9c8a 100644 --- a/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -167,7 +167,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp_source.html index 89a98ae4d..92311bbf0 100644 --- a/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shared__name__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -440,22 +440,22 @@
        util::Shared_name Shared_name
        Convenience alias for the commonly used type util::Shared_name.
        Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
        unsigned int remove_each_persistent_if(flow::log::Logger *logger_ptr, const Filter_func &filter_func)
        Utility that invokes Persistent_object::for_each_persistent(name_prefix_or_empty) and synchronously i...
        -
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        -
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        +
        std::ostream & operator<<(std::ostream &os, const Native_handle &val)
        Prints string representation of the given Native_handle to the given ostream.
        +
        bool operator<(Native_handle val1, Native_handle val2)
        Returns a less-than comparison of two Native_handle objects, with the usual total ordering guarantees...
        void swap(Shared_name &val1, Shared_name &val2)
        Swaps two objects.
        Shared_name operator/(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) /= raw_src2.
        -
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        -
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        +
        bool operator!=(Native_handle val1, Native_handle val2)
        Negation of similar ==.
        +
        size_t hash_value(Native_handle val)
        Hasher of Native_handle for boost.unordered et al.
        unsigned int remove_each_persistent_with_name_prefix(flow::log::Logger *logger_ptr, const Shared_name &name_prefix_or_empty)
        Utility that invokes remove_each_persistent_if() with the filter that returns true (yes,...
        std::istream & operator>>(std::istream &is, Shared_name &val)
        Reads Shared_name from the given istream; equivalent to reading string into Shared_name::str().
        -
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        +
        bool operator==(Native_handle val1, Native_handle val2)
        Returns true if and only if the two Native_handle objects are the same underlying handle.
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        Shared_name operator+(const Shared_name &src1, const char *raw_src2)
        Returns new object equal to Shared_name(src1) += raw_src2.
        Definition: shared_name.cpp:97
        diff --git a/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp.html index ccf8568ce..afb77aea0 100644 --- a/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -97,7 +97,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp_source.html b/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp_source.html index 3f96ee0de..510d5e3aa 100644 --- a/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shm_2classic_2classic_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -115,7 +115,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp.html index ddab9efda..b2ac6b67f 100644 --- a/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -113,7 +113,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp_source.html index 903bddafd..9e4f607d1 100644 --- a/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shm_2classic_2classic__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -147,7 +147,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2shm_8hpp.html b/doc/ipc_doc/generated/html_full/shm_2shm_8hpp.html index 873a9d7af..b73e94ec1 100644 --- a/doc/ipc_doc/generated/html_full/shm_2shm_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shm_2shm_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -102,7 +102,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2shm_8hpp_source.html b/doc/ipc_doc/generated/html_full/shm_2shm_8hpp_source.html index f443ac42d..7f858321f 100644 --- a/doc/ipc_doc/generated/html_full/shm_2shm_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shm_2shm_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -136,7 +136,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp.html index b7e651af4..5dcfb1a25 100644 --- a/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -87,7 +87,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp_source.html index abb4826e0..b85a30318 100644 --- a/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/shm_2shm__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -222,7 +222,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp.html b/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp.html index c5c526e84..eb4352524 100644 --- a/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -160,7 +160,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp_source.html index f045b407d..0085ec736 100644 --- a/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/src_2ipc_2session_2detail_2shm_2classic_2session__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -521,7 +521,7 @@
        Owning and wrapping a pre-connected transport::Channel peer (an endpoint of an established channel ov...
        Definition: channel.hpp:589
        Support for SHM-backed ipc::session sessions and session-servers with the SHM-classic (ipc::shm::clas...
        Definition: classic_fwd.hpp:24
        std::ostream & operator<<(std::ostream &os, const Session_impl< Session_impl_t > &val)
        Prints string representation of the given Session_impl to the given ostream.
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        @@ -534,7 +534,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp.html b/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp.html index 498d28ff8..41f474888 100644 --- a/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp.html +++ b/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -110,7 +110,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp_source.html b/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp_source.html index 10b9d9634..90d5f747d 100644 --- a/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/stateless__allocator_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -352,7 +352,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/stl__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/stl__fwd_8hpp.html index 753578dd9..cb0ca7c7e 100644 --- a/doc/ipc_doc/generated/html_full/stl__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/stl__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -102,7 +102,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/stl__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/stl__fwd_8hpp_source.html index 0369b819b..59578168d 100644 --- a/doc/ipc_doc/generated/html_full/stl__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/stl__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -302,7 +302,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/struc__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/struc__fwd_8hpp.html index b8cabdcbd..c3d5fa39b 100644 --- a/doc/ipc_doc/generated/html_full/struc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/struc__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -145,7 +145,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/struc__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/struc__fwd_8hpp_source.html index c3def04e1..5c481087a 100644 --- a/doc/ipc_doc/generated/html_full/struc__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/struc__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -390,7 +390,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html index 9117f0b70..b14e9dad8 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html index 13bd4a125..882e8e165 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -129,7 +129,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html index 79bb9440c..7b9522ac0 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html index 43e236c78..92bd84647 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -129,7 +129,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html index 073d4b17e..5fa3a2317 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html index 0adb36839..b33846f1f 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -129,7 +129,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html index 1f3454215..41f3e8b6a 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html index 2269f0045..818e47521 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -129,7 +129,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html index c8b57f18c..701dbee08 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html index d15450647..befa1a559 100644 --- a/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_full/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -129,7 +129,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App-members.html index 8bb386365..1dd51f7e2 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -82,7 +82,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App.html index e114d9975..efc97e184 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1App.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -350,7 +350,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app-members.html index a2b827122..85c95ffb2 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -84,7 +84,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app.html index 4206992d6..4e9b41766 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__app.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -233,7 +233,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req-members.html index 6f492700a..1e54e0652 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -78,7 +78,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req.html index 61ab524f1..9b2ed2577 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Client__session__impl_1_1Master__channel__req.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -157,7 +157,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app-members.html index ec022acfa..95593847b 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -87,7 +87,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app.html index a9dbeb1c6..d972a78d1 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__app.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -323,7 +323,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req-members.html index 29bf3dd47..f2431e8e8 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req.html index c23eac840..696d7c939 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Server__session__impl_1_1Open__channel__req.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -170,7 +170,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State-members.html index 651de051e..ce94e6d9c 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -81,7 +81,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State.html index 331e17e9c..cede87cdc 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1Session__server__impl_1_1State.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -228,7 +228,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html index 0074f187c..2a5e83cb3 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html index 6ff5013b2..fbecf4575 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -118,7 +118,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html index 4edd60ab1..fceb7f12f 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html index 07bfb6203..93cee8db6 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -114,7 +114,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html index 391c9b2d1..7addfba9f 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html index 4e1885c2f..f1af93969 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -114,7 +114,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result-members.html index 33460209d..b8aba5454 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result.html b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result.html index f78730356..bed25c51e 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1session_1_1sync__io_1_1Session__adapter_1_1Channel__open__result.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -172,7 +172,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html index e8ce215b2..aa3a85487 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html index 466063f91..853a4cdb7 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -118,7 +118,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html index e6a1da374..2342606ab 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html index ffdf1af80..3bffbd5c9 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -114,7 +114,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm-members.html index c475f5e8f..1d26c6b81 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm.html b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm.html index f610ad7eb..9b4402a07 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1shm_1_1classic_1_1Pool__arena_1_1Handle__in__shm.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -189,7 +189,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request-members.html index 4f6688496..3cc269ccb 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request.html index dd945520c..1d904c6ce 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1Native__socket__stream__acceptor_1_1User__request.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -166,7 +166,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state-members.html index b42eca6a7..48cd08ec1 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -80,7 +80,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state.html index 1a7c78fca..54dfaf27e 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -215,7 +215,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html index 4031ebde2..45517d00b 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -77,7 +77,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html index adbcfc5e3..3a642e702 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -123,7 +123,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html index cf86e064e..d0b0d762d 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -100,7 +100,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html index bae018db1..cef5deab4 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -102,7 +102,7 @@

        Relative benefits/limitations (versus SHM-based Serializa_via_*_shm diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html index 2d8f43d38..df7717074 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -95,7 +95,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html index 93fde605a..1a6bad834 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -81,7 +81,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html index c6dbe846d..e737da027 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -215,7 +215,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html index 82a86bf44..0a5fc9640 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html index 2d1168503..cba3f7db3 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -170,7 +170,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Null__session.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Null__session.html index 38801e568..e6c3977ad 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Null__session.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Null__session.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -86,7 +86,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html index 7aaa24e03..76d6c0c61 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -80,7 +80,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html index eed238880..dc8fffd39 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -111,7 +111,7 @@

        As you can see, there are not many requirements: this sub-concept is essentially meant to be (usually) an aggregation of what would normally be individual ctor args to Struct_builder, a few little scalars at that. It can however conceivably feature ctors and more advanced behavior (while retaining cheap copyability).

        While Config must default-ctible, Struct_builder may stipulate that such an as-if-default-cted Config being passed to Struct_builder ctor = undefined behavior or otherwise invalid.

        -

        Definition at line 221 of file serializer.hpp.

        +

        Definition at line 222 of file serializer.hpp.

        Member Typedef Documentation

        ◆ Builder

        @@ -127,7 +127,7 @@

        Struct_builder. Useful for generic programming.

        -

        Definition at line 227 of file serializer.hpp.

        +

        Definition at line 228 of file serializer.hpp.

        @@ -146,7 +146,7 @@

        Definition at line 235 of file serializer.hpp.

        +

        Definition at line 236 of file serializer.hpp.

        @@ -164,7 +164,7 @@

        Definition at line 238 of file serializer.hpp.

        +

        Definition at line 239 of file serializer.hpp.

        @@ -182,7 +182,7 @@

        Struct_builder will use.

        -

        Definition at line 232 of file serializer.hpp.

        +

        Definition at line 233 of file serializer.hpp.

        @@ -192,7 +192,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html index d3fa696c6..c065ffb3e 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -80,7 +80,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html index 7b28a0d97..9c5c44705 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -108,7 +108,7 @@

        Analogous to Struct_builder::Config but for deserialization.

        See also
        Struct_builder::Config
        -

        Definition at line 420 of file serializer.hpp.

        +

        Definition at line 421 of file serializer.hpp.

        Member Typedef Documentation

        ◆ Reader

        @@ -124,7 +124,7 @@

        Struct_reader. Useful for generic programming.

        -

        Definition at line 426 of file serializer.hpp.

        +

        Definition at line 427 of file serializer.hpp.

        @@ -143,7 +143,7 @@

        Definition at line 434 of file serializer.hpp.

        +

        Definition at line 435 of file serializer.hpp.

        @@ -161,7 +161,7 @@

        Struct_builder::Config counterpart.

        -

        Definition at line 437 of file serializer.hpp.

        +

        Definition at line 438 of file serializer.hpp.

        @@ -179,7 +179,7 @@

        Struct_reader will use.

        -

        Definition at line 431 of file serializer.hpp.

        +

        Definition at line 432 of file serializer.hpp.

        @@ -189,7 +189,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html index 4a0f4c738..4b35b4e36 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -81,7 +81,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html index b2aaaa986..5d6f35415 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -227,7 +227,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html index cb726eb8d..c088f51ff 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html index ed6976936..decdfecc8 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -175,7 +175,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response-members.html index edef1147f..c4237b037 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response.html index d9eb85018..36de57a9a 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Expecting__response.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -178,7 +178,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe-members.html index f508a0183..9a090d9a6 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -87,7 +87,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe.html index 54fa945e9..4d574dcb8 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1struc_1_1sync__io_1_1Channel_1_1Msg__in__pipe.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -403,7 +403,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request-members.html index b7c88a7f7..6b55b8985 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -80,7 +80,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request.html index 553d5e93d..742b0d6f3 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Async__adapter__receiver_1_1User__request.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -196,7 +196,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request-members.html index c2507bac8..7aa7d20fd 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -78,7 +78,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request.html index 5b44e9a88..f9b4a6ae7 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver__impl_1_1User__request.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -145,7 +145,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload-members.html index 8e34de3e4..37be9a7ba 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -78,7 +78,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload.html index 246f5c151..e1ea9479f 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender__impl_1_1Snd__low__lvl__payload.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -153,7 +153,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request-members.html index 9f8c11c88..4b2710d9a 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request.html index 35971594b..c12bcf91f 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Rcv__user__request.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -161,7 +161,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload-members.html index 22767a4af..7b344dca8 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -79,7 +79,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload.html b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload.html index cfae439d9..35419af8c 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_1_1Snd__low__lvl__payload.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -167,7 +167,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle-members.html b/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle-members.html index 4218af2bb..66b453123 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle-members.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle-members.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -90,7 +90,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle.html b/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle.html index ffb8d9836..682e575a5 100644 --- a/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle.html +++ b/doc/ipc_doc/generated/html_full/structipc_1_1util_1_1Native__handle.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -155,7 +155,7 @@

        Rationale

        Originally we tried to make it aggregate-initializable, like Native_handle hndl = {some_fd}; for example see standard array<>. This is reassuring perf-wise; and it involves less (i.e., no) code to boot. However, it really is just one light-weight scalar, and there's 0% chance explicit construction is any slower. So, perf isn't an issue. Still, why not make it aggregate-initializable though? I (ygoldfel) gave up, eventually, because I wanted some non-default-behavior constructors to be available, namely no-args (Native_handle() that makes an null() == true one) and move (Native_handle(Native_handle&&) that nullifies the source object). This isn't allowed in aggregate-initializable classes; so then I made some static "constructors" instead; but those aren't sufficient for containers... and on it went. This way, though verbose, just works out better for the API.

        -

        Definition at line 61 of file native_handle.hpp.

        +

        Definition at line 62 of file native_handle.hpp.

        Member Typedef Documentation

        ◆ handle_t

        @@ -171,7 +171,7 @@

        Definition at line 66 of file native_handle.hpp.

        +

        Definition at line 67 of file native_handle.hpp.

        @@ -200,7 +200,7 @@

        Definition at line 32 of file native_handle.cpp.

        +

        Definition at line 33 of file native_handle.cpp.

        @@ -230,9 +230,9 @@

        Rationale

        -

        Definition at line 38 of file native_handle.cpp.

        +

        Definition at line 39 of file native_handle.cpp.

        -

        References operator=().

        +

        References operator=().

        Here is the call graph for this function:
        @@ -295,11 +295,11 @@

        m_native_handle equals S_NULL_HANDLE.

        Returns
        See above.
        -

        Definition at line 60 of file native_handle.cpp.

        +

        Definition at line 61 of file native_handle.cpp.

        -

        References m_native_handle, and S_NULL_HANDLE.

        +

        References m_native_handle, and S_NULL_HANDLE.

        -

        Referenced by ipc::transport::Posix_mq_handle::allow_impl(), ipc::util::sync_io::Asio_waitable_native_handle::Asio_waitable_native_handle(), ipc::util::sync_io::Asio_waitable_native_handle::assign(), ipc::transport::asio_local_stream_socket::async_write_with_native_handle(), ipc::session::ensure_resource_owner_is_app(), ipc::transport::Posix_mq_handle::interrupt_impl(), ipc::transport::Posix_mq_handle::max_msg_size(), ipc::transport::Posix_mq_handle::max_n_msgs(), ipc::transport::Native_socket_stream_acceptor::on_next_peer_socket_or_error(), operator<<(), ipc::transport::Posix_mq_handle::Posix_mq_handle(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_async_read_lead_or_continuation_msg(), ipc::transport::sync_io::Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_continuation_msg(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_lead_msg(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_proto_neg_msg(), ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_handle_finalized(), ipc::transport::Posix_mq_handle::receive(), ipc::transport::Posix_mq_handle::send(), ipc::transport::sync_io::Native_socket_stream::Impl::send_native_handle(), ipc::util::set_resource_permissions(), ipc::transport::sync_io::Native_socket_stream::Impl::snd_nb_write_low_lvl_payload(), ipc::transport::sync_io::Native_socket_stream::Impl::snd_sync_write_or_q_payload(), ipc::transport::Posix_mq_handle::timed_receive(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::try_receive(), ipc::transport::Posix_mq_handle::try_send(), ipc::transport::Posix_mq_handle::wait_impl(), and ipc::transport::Posix_mq_handle::~Posix_mq_handle().

        +

        Referenced by ipc::transport::Posix_mq_handle::allow_impl(), ipc::util::sync_io::Asio_waitable_native_handle::Asio_waitable_native_handle(), ipc::util::sync_io::Asio_waitable_native_handle::assign(), ipc::transport::asio_local_stream_socket::async_write_with_native_handle(), ipc::session::ensure_resource_owner_is_app(), ipc::transport::Posix_mq_handle::interrupt_impl(), ipc::transport::Posix_mq_handle::max_msg_size(), ipc::transport::Posix_mq_handle::max_n_msgs(), ipc::transport::Native_socket_stream_acceptor::on_next_peer_socket_or_error(), operator<<(), ipc::transport::Posix_mq_handle::Posix_mq_handle(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_async_read_lead_or_continuation_msg(), ipc::transport::sync_io::Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_continuation_msg(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_lead_msg(), ipc::transport::struc::sync_io::Channel< Channel_obj, Message_body, Struct_builder_config, Struct_reader_config >::rcv_on_async_read_proto_neg_msg(), ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_handle_finalized(), ipc::transport::Posix_mq_handle::receive(), ipc::transport::Posix_mq_handle::send(), ipc::transport::sync_io::Native_socket_stream::Impl::send_native_handle(), ipc::util::set_resource_permissions(), ipc::transport::sync_io::Native_socket_stream::Impl::snd_nb_write_low_lvl_payload(), ipc::transport::sync_io::Native_socket_stream::Impl::snd_sync_write_or_q_payload(), ipc::transport::Posix_mq_handle::timed_receive(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::try_receive(), ipc::transport::Posix_mq_handle::try_send(), ipc::transport::Posix_mq_handle::wait_impl(), and ipc::transport::Posix_mq_handle::~Posix_mq_handle().

        Here is the caller graph for this function:
        @@ -369,11 +369,11 @@

        Returns
        *this.
        -

        Definition at line 46 of file native_handle.cpp.

        +

        Definition at line 47 of file native_handle.cpp.

        -

        References m_native_handle, S_NULL_HANDLE, ipc::transport::swap(), and ipc::util::swap().

        +

        References m_native_handle, S_NULL_HANDLE, ipc::transport::swap(), and ipc::util::swap().

        -

        Referenced by Native_handle().

        +

        Referenced by Native_handle().

        Here is the call graph for this function:
        @@ -423,9 +423,9 @@

        Returns
        See above.
        -

        Definition at line 89 of file native_handle.cpp.

        +

        Definition at line 90 of file native_handle.cpp.

        -

        References m_native_handle.

        +

        References m_native_handle.

        @@ -473,9 +473,9 @@

        Returns
        See above.
        -

        Definition at line 84 of file native_handle.cpp.

        +

        Definition at line 85 of file native_handle.cpp.

        -

        References ipc::util::operator==().

        +

        References ipc::util::operator==().

        Here is the call graph for this function:

        @@ -579,9 +579,9 @@

        Returns
        os.
        -

        Definition at line 65 of file native_handle.cpp.

        +

        Definition at line 66 of file native_handle.cpp.

        -

        References m_native_handle, and null().

        +

        References m_native_handle, and null().

        Here is the call graph for this function:
        @@ -635,9 +635,9 @@

        Returns
        See above.
        -

        Definition at line 79 of file native_handle.cpp.

        +

        Definition at line 80 of file native_handle.cpp.

        -

        References m_native_handle.

        +

        References m_native_handle.

        @@ -657,9 +657,9 @@

        S_NULL_HANDLE), the exact payload of this Native_handle.

        It can, of course, be assigned and accessed explicitly. The best way to initialize a new Native_handle is, therefore: Native_handle{some_native_handle}. You may also use the null() "constructor" to create a null() handle.

        -

        Definition at line 84 of file native_handle.hpp.

        +

        Definition at line 85 of file native_handle.hpp.

        -

        Referenced by ipc::util::sync_io::Asio_waitable_native_handle::assign(), ipc::session::ensure_resource_owner_is_app(), ipc::transport::Posix_mq_handle::epoll_setup(), hash_value(), ipc::transport::Posix_mq_handle::max_msg_size(), ipc::transport::Posix_mq_handle::max_n_msgs(), ipc::transport::asio_local_stream_socket::nb_write_some_with_native_handle(), null(), operator<(), operator<<(), operator=(), operator==(), ipc::transport::Posix_mq_handle::Posix_mq_handle(), ipc::transport::Posix_mq_handle::receive(), ipc::transport::sync_io::Blob_stream_mq_receiver_impl< Persistent_mq_handle >::replace_event_wait_handles(), ipc::transport::sync_io::Blob_stream_mq_sender_impl< Persistent_mq_handle >::replace_event_wait_handles(), ipc::transport::sync_io::Native_socket_stream::Impl::replace_event_wait_handles(), ipc::transport::Posix_mq_handle::send(), ipc::transport::Posix_mq_handle::set_non_blocking(), ipc::util::set_resource_permissions(), ipc::transport::Posix_mq_handle::timed_receive(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::try_receive(), ipc::transport::Posix_mq_handle::try_send(), ipc::transport::Posix_mq_handle::wait_impl(), and ipc::transport::Posix_mq_handle::~Posix_mq_handle().

        +

        Referenced by ipc::util::sync_io::Asio_waitable_native_handle::assign(), ipc::session::ensure_resource_owner_is_app(), ipc::transport::Posix_mq_handle::epoll_setup(), hash_value(), ipc::transport::Posix_mq_handle::max_msg_size(), ipc::transport::Posix_mq_handle::max_n_msgs(), ipc::transport::asio_local_stream_socket::nb_write_some_with_native_handle(), null(), operator<(), operator<<(), operator=(), operator==(), ipc::transport::Posix_mq_handle::Posix_mq_handle(), ipc::transport::Posix_mq_handle::receive(), ipc::transport::sync_io::Blob_stream_mq_receiver_impl< Persistent_mq_handle >::replace_event_wait_handles(), ipc::transport::sync_io::Blob_stream_mq_sender_impl< Persistent_mq_handle >::replace_event_wait_handles(), ipc::transport::sync_io::Native_socket_stream::Impl::replace_event_wait_handles(), ipc::transport::Posix_mq_handle::send(), ipc::transport::Posix_mq_handle::set_non_blocking(), ipc::util::set_resource_permissions(), ipc::transport::Posix_mq_handle::timed_receive(), ipc::transport::Posix_mq_handle::timed_send(), ipc::transport::Posix_mq_handle::try_receive(), ipc::transport::Posix_mq_handle::try_send(), ipc::transport::Posix_mq_handle::wait_impl(), and ipc::transport::Posix_mq_handle::~Posix_mq_handle().

        @@ -686,9 +686,9 @@

        m_native_handle such that null() == true; else it is false.

        No valid handle ever equals this.

        -

        Definition at line 74 of file native_handle.hpp.

        +

        Definition at line 75 of file native_handle.hpp.

        -

        Referenced by null(), and operator=().

        +

        Referenced by null(), and operator=().

        @@ -699,7 +699,7 @@

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp.html index 3fcd54424..d42262e85 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -109,7 +109,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp_source.html index 7811ca7d8..c2808c156 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__rcv_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -498,16 +498,16 @@
        static const Shared_name S_EMPTY
        A (default-cted) Shared_name. May be useful for functions returning const Shared_name&.
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        const std::string EMPTY_STRING
        A (default-cted) string. May be useful for functions returning const std::string&.
        Definition: util.cpp:33
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp.html index e0e05cd44..31f9422c9 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -109,7 +109,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp_source.html index 79b229ab3..0fad503f5 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__stream__mq__snd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -531,16 +531,16 @@
        static const Shared_name S_EMPTY
        A (default-cted) Shared_name. May be useful for functions returning const Shared_name&.
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        const std::string EMPTY_STRING
        A (default-cted) string. May be useful for functions returning const std::string&.
        Definition: util.cpp:33
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp.html index 6ec60104b..0b233f6d2 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -100,7 +100,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp_source.html index 8537e6792..62131e77a 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2blob__transport_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -91,339 +91,340 @@
        19
        20// Not compiled: for documentation only. Contains concept docs as of this writing.
        21#ifndef IPC_DOXYGEN_ONLY
        -
        22# error "As of this writing this is a documentation-only "header" (the "source" is for humans and Doxygen only)."
        -
        23#else // ifdef IPC_DOXYGEN_ONLY
        -
        24
        - -
        26{
        -
        27
        -
        28// Types.
        -
        29
        -
        30/**
        -
        31 * A documentation-only *concept*: what transport::Blob_sender is to transport::Native_handle_sender (namely a
        -
        32 * degenerate version thereof), this is to sync_io::Native_handle_sender.
        -
        33 *
        -
        34 * The concept is exactly identical to sync_io::Native_handle_sender except that in the latter each message consists
        -
        35 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
        -
        36 * each message contains 1 binary blob, whose length must be at least 1 byte.
        -
        37 *
        -
        38 * Therefore we keep the documentation very light, only pointing out the differences against
        -
        39 * sync_io::Native_handle_sender -- which are summarized in the preceding paragraph. All other notes from
        -
        40 * sync_io::Native_handle_sender apply here.
        -
        41 *
        -
        42 * @see sync_io::Native_handle_sender, an identical concept with 1 feature (native handle transmission) added.
        -
        43 */
        - -
        45{
        -
        46public:
        -
        47 // Constants.
        -
        48
        -
        49 /// Same notes as for transport::Blob_sender.
        - -
        51
        -
        52 // Constructors/destructor.
        -
        53
        -
        54 /**
        -
        55 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        -
        56 *
        -
        57 * All notes from sync_io::Native_handle_sender apply.
        -
        58 */
        - -
        60
        -
        61 /**
        -
        62 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        -
        63 * All notes from sync_io::Native_handle_sender apply.
        -
        64 *
        -
        65 * @param src
        -
        66 * See above.
        -
        67 */
        - -
        69
        -
        70 /// Disallow copying.
        -
        71 Blob_sender(const Blob_sender&) = delete;
        -
        72
        -
        73 /**
        -
        74 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        -
        75 * still active) and return resources to OS as applicable.
        -
        76 *
        -
        77 * All notes from sync_io::Native_handle_sender apply.
        -
        78 */
        - -
        80
        -
        81 // Methods.
        -
        82
        -
        83 /**
        -
        84 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        -
        85 * No-op if `&src == this`.
        -
        86 *
        -
        87 * All notes from sync_io::Native_handle_sender apply.
        -
        88 *
        -
        89 * @param src
        -
        90 * See above.
        -
        91 * @return `*this`.
        -
        92 */
        - -
        94 // Methods.
        -
        95
        -
        96 /// Disallow copying.
        - -
        98
        -
        99 // `sync_io`-pattern API.
        -
        100
        -
        101 /**
        -
        102 * Coincides with sync_io::Native_handle_sender concept counterpart. All notes apply.
        -
        103 *
        -
        104 * @tparam Create_ev_wait_hndl_func
        -
        105 * See above.
        -
        106 * @param create_ev_wait_hndl_func
        -
        107 * See above.
        -
        108 * @return See above.
        -
        109 */
        -
        110 template<typename Create_ev_wait_hndl_func>
        -
        111 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        -
        112
        -
        113 /**
        -
        114 * All notes from sync_io::Native_handle_sender::start_send_native_handle_ops() apply.
        -
        115 *
        -
        116 * @tparam Event_wait_func_t
        -
        117 * See above.
        -
        118 * @param ev_wait_func
        -
        119 * See above.
        -
        120 * @return See above.
        -
        121 */
        -
        122 template<typename Event_wait_func_t>
        -
        123 bool start_send_blob_ops(Event_wait_func_t&& ev_wait_func);
        -
        124
        -
        125 // General API (mirrors transport:: counterpart).
        -
        126
        -
        127 /**
        -
        128 * All notes from sync_io::Native_handle_sender apply.
        -
        129 *
        -
        130 * @return See above.
        -
        131 */
        -
        132 size_t send_blob_max_size() const;
        -
        133
        -
        134 /**
        -
        135 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably and in-order, to the opposing
        -
        136 * peer; the message consists of the provided binary blob (of length at least 1 byte). Providing a null blob
        -
        137 * results in undefined behavior (assertion may trip).
        -
        138 *
        -
        139 * Otherwise all notes from sync_io::Native_handle_sender::send_native_handle() apply.
        -
        140 *
        -
        141 * @param blob
        -
        142 * A binary blob to send; behavior undefined unless `blob.size() >= 1`.
        -
        143 * @param err_code
        -
        144 * See above.
        -
        145 * @return See above.
        -
        146 */
        -
        147 bool send_blob(const util::Blob_const& blob, Error_code* err_code = 0);
        -
        148
        -
        149 /**
        -
        150 * Equivalent to send_blob() but sends a graceful-close message instead of the usual payload.
        -
        151 * All notes from sync_io::Native_handle_sender apply.
        -
        152 *
        -
        153 * @tparam Task_err
        -
        154 * See above.
        -
        155 * @param sync_err_code
        -
        156 * See above.
        -
        157 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        -
        158 * would-block *will* make this throw.
        -
        159 * @param on_done_func
        -
        160 * See above.
        -
        161 * @return See above.
        -
        162 */
        -
        163 template<typename Task_err>
        -
        164 bool async_end_sending(Error_code* sync_err_code, Task_err&& on_done_func);
        -
        165
        -
        166 /**
        -
        167 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
        -
        168 *
        -
        169 * All notes from sync_io::Native_handle_sender apply.
        -
        170 *
        -
        171 * @return See above.
        -
        172 */
        - -
        174
        -
        175 /**
        -
        176 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
        -
        177 * are ignored except that they reset any opposing idle timer.
        -
        178 *
        -
        179 * All notes from sync_io::Native_handle_sender apply.
        -
        180 *
        -
        181 * @param period
        -
        182 * See above.
        -
        183 * @return See above.
        -
        184 */
        -
        185 bool auto_ping();
        -
        186}; // class Blob_sender
        -
        187
        -
        188/**
        -
        189 * A documentation-only *concept*: what transport::Blob_receiver is to transport::Native_handle_receiver (namely a
        -
        190 * degenerate version thereof), this is to sync_io::Native_handle_receiver.
        -
        191 *
        -
        192 * The concept is exactly identical to Native_handle_receiver except that in the latter each message consists
        -
        193 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
        -
        194 * each message contains 1 binary blob, whose length must be at least 1 byte.
        -
        195 *
        -
        196 * Therefore we keep the documentation very light, only pointing out the differences against
        -
        197 * sync_io::Native_handle_receiver -- which are summarized in the preceding paragraph. All other notes from
        -
        198 * sync_io::Native_handle_receiver apply here.
        -
        199 *
        -
        200 * @see sync_io::Native_handle_receiver, an identical concept with 1 feature (native handle transmission) added.
        -
        201 */
        - -
        203{
        -
        204public:
        -
        205 // Constants.
        -
        206
        -
        207 /// Same notes as for transport::Blob_receiver.
        - -
        209
        -
        210 /// Same notes as for transport::Blob_receiver.
        -
        211 static constexpr bool S_BLOB_UNDERFLOW_ALLOWED = value;
        -
        212
        -
        213 // Constructors/destructor.
        -
        214
        -
        215 /**
        -
        216 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        -
        217 *
        -
        218 * All notes from sync_io::Native_handle_receiver apply.
        -
        219 */
        - -
        221
        -
        222 /**
        -
        223 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        -
        224 * All notes from sync_io::Native_handle_receiver apply.
        -
        225 *
        -
        226 * @param src
        -
        227 * See above.
        -
        228 */
        - -
        230
        -
        231 /// Disallow copying.
        -
        232 Blob_receiver(const Blob_receiver&) = delete;
        -
        233
        -
        234 /**
        -
        235 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        -
        236 * still active) and return resources to OS as applicable.
        -
        237 *
        -
        238 * All notes from sync_io::Native_handle_receiver apply.
        -
        239 */
        - -
        241
        -
        242 // Methods.
        -
        243
        -
        244 /**
        -
        245 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        -
        246 * No-op if `&src == this`.
        -
        247 *
        -
        248 * All notes from sync_io::Native_handle_receiver apply.
        -
        249 *
        -
        250 * @param src
        -
        251 * See above.
        -
        252 * @return `*this`.
        -
        253 */
        - -
        255
        -
        256 /// Disallow copying.
        - -
        258
        -
        259 // `sync_io`-pattern API.
        -
        260
        -
        261 /**
        -
        262 * Coincides with sync_io::Native_handle_receiver concept counterpart. All notes apply.
        -
        263 *
        -
        264 * @tparam Create_ev_wait_hndl_func
        -
        265 * See above.
        -
        266 * @param create_ev_wait_hndl_func
        -
        267 * See above.
        -
        268 * @return See above.
        -
        269 */
        -
        270 template<typename Create_ev_wait_hndl_func>
        -
        271 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        -
        272
        -
        273 /**
        -
        274 * All notes from sync_io::Native_handle_receiver::start_receive_native_handle_ops() apply.
        -
        275 *
        -
        276 * @tparam Event_wait_func_t
        -
        277 * See above.
        -
        278 * @param ev_wait_func
        -
        279 * See above.
        -
        280 * @return See above.
        -
        281 */
        -
        282 template<typename Event_wait_func_t>
        -
        283 bool start_receive_blob_ops(Event_wait_func_t&& ev_wait_func);
        -
        284
        -
        285 // General API (mirrors transport:: counterpart).
        -
        286
        -
        287 /**
        -
        288 * All notes from sync_io::Native_handle_receiver::receive_meta_blob_max_size() apply.
        -
        289 *
        -
        290 * @return See above.
        -
        291 */
        -
        292 size_t receive_blob_max_size() const;
        -
        293
        -
        294 /**
        -
        295 * In PEER state: Possibly-asynchronously awaits one discrete message -- as sent by the opposing peer -- and
        -
        296 * receives it into the given target locations, reliably and in-order.
        -
        297 *
        -
        298 * Otherwise all notes from sync_io::Native_handle_receiver::async_receive_native_handle() apply.
        -
        299 *
        -
        300 * @tparam Task_err_sz
        -
        301 * See above.
        -
        302 * @param target_blob
        -
        303 * `target_blob.data()...` shall be written to before `on_done_func()` is executed with a falsy
        -
        304 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
        -
        305 * `target_blob.size()`. See "Error semantics" (there is an `Error_code` regarding
        -
        306 * overflowing the user's memory area).
        -
        307 * @param sync_err_code
        -
        308 * See above.
        -
        309 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        -
        310 * would-block *will* make this throw.
        -
        311 * @param sync_sz
        -
        312 * See above. If null behavior undefined (assertion may trip).
        -
        313 * @param on_done_func
        -
        314 * See above.
        -
        315 * @return See above.
        -
        316 */
        -
        317 template<typename Task_err_sz>
        -
        318 bool async_receive_blob(const util::Blob_mutable& target_blob,
        -
        319 Error_code* sync_err_code, size_t* sync_sz,
        -
        320 Task_err_sz&& on_done_func);
        -
        321
        -
        322 /**
        -
        323 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
        -
        324 * the specified time has passed since the last received low-level traffic (or this call, whichever most
        -
        325 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
        -
        326 *
        -
        327 * All notes from sync_io::Native_handle_receiver apply.
        -
        328 *
        -
        329 * @param timeout
        -
        330 * See above.
        -
        331 * @return See above.
        -
        332 */
        - -
        334}; // class Blob_receiver
        -
        335
        -
        336} // namespace ipc::transport::sync_io
        -
        A documentation-only concept: what transport::Blob_receiver is to transport::Native_handle_receiver (...
        +
        22static_assert(false, "As of this writing this is a documentation-only \"header\" "
        +
        23 "(the \"source\" is for humans and Doxygen only).");
        +
        24#else // ifdef IPC_DOXYGEN_ONLY
        +
        25
        + +
        27{
        +
        28
        +
        29// Types.
        +
        30
        +
        31/**
        +
        32 * A documentation-only *concept*: what transport::Blob_sender is to transport::Native_handle_sender (namely a
        +
        33 * degenerate version thereof), this is to sync_io::Native_handle_sender.
        +
        34 *
        +
        35 * The concept is exactly identical to sync_io::Native_handle_sender except that in the latter each message consists
        +
        36 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
        +
        37 * each message contains 1 binary blob, whose length must be at least 1 byte.
        +
        38 *
        +
        39 * Therefore we keep the documentation very light, only pointing out the differences against
        +
        40 * sync_io::Native_handle_sender -- which are summarized in the preceding paragraph. All other notes from
        +
        41 * sync_io::Native_handle_sender apply here.
        +
        42 *
        +
        43 * @see sync_io::Native_handle_sender, an identical concept with 1 feature (native handle transmission) added.
        +
        44 */
        + +
        46{
        +
        47public:
        +
        48 // Constants.
        +
        49
        +
        50 /// Same notes as for transport::Blob_sender.
        + +
        52
        +
        53 // Constructors/destructor.
        +
        54
        +
        55 /**
        +
        56 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        +
        57 *
        +
        58 * All notes from sync_io::Native_handle_sender apply.
        +
        59 */
        + +
        61
        +
        62 /**
        +
        63 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        +
        64 * All notes from sync_io::Native_handle_sender apply.
        +
        65 *
        +
        66 * @param src
        +
        67 * See above.
        +
        68 */
        + +
        70
        +
        71 /// Disallow copying.
        +
        72 Blob_sender(const Blob_sender&) = delete;
        +
        73
        +
        74 /**
        +
        75 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        +
        76 * still active) and return resources to OS as applicable.
        +
        77 *
        +
        78 * All notes from sync_io::Native_handle_sender apply.
        +
        79 */
        + +
        81
        +
        82 // Methods.
        +
        83
        +
        84 /**
        +
        85 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        +
        86 * No-op if `&src == this`.
        +
        87 *
        +
        88 * All notes from sync_io::Native_handle_sender apply.
        +
        89 *
        +
        90 * @param src
        +
        91 * See above.
        +
        92 * @return `*this`.
        +
        93 */
        + +
        95 // Methods.
        +
        96
        +
        97 /// Disallow copying.
        + +
        99
        +
        100 // `sync_io`-pattern API.
        +
        101
        +
        102 /**
        +
        103 * Coincides with sync_io::Native_handle_sender concept counterpart. All notes apply.
        +
        104 *
        +
        105 * @tparam Create_ev_wait_hndl_func
        +
        106 * See above.
        +
        107 * @param create_ev_wait_hndl_func
        +
        108 * See above.
        +
        109 * @return See above.
        +
        110 */
        +
        111 template<typename Create_ev_wait_hndl_func>
        +
        112 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        +
        113
        +
        114 /**
        +
        115 * All notes from sync_io::Native_handle_sender::start_send_native_handle_ops() apply.
        +
        116 *
        +
        117 * @tparam Event_wait_func_t
        +
        118 * See above.
        +
        119 * @param ev_wait_func
        +
        120 * See above.
        +
        121 * @return See above.
        +
        122 */
        +
        123 template<typename Event_wait_func_t>
        +
        124 bool start_send_blob_ops(Event_wait_func_t&& ev_wait_func);
        +
        125
        +
        126 // General API (mirrors transport:: counterpart).
        +
        127
        +
        128 /**
        +
        129 * All notes from sync_io::Native_handle_sender apply.
        +
        130 *
        +
        131 * @return See above.
        +
        132 */
        +
        133 size_t send_blob_max_size() const;
        +
        134
        +
        135 /**
        +
        136 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably and in-order, to the opposing
        +
        137 * peer; the message consists of the provided binary blob (of length at least 1 byte). Providing a null blob
        +
        138 * results in undefined behavior (assertion may trip).
        +
        139 *
        +
        140 * Otherwise all notes from sync_io::Native_handle_sender::send_native_handle() apply.
        +
        141 *
        +
        142 * @param blob
        +
        143 * A binary blob to send; behavior undefined unless `blob.size() >= 1`.
        +
        144 * @param err_code
        +
        145 * See above.
        +
        146 * @return See above.
        +
        147 */
        +
        148 bool send_blob(const util::Blob_const& blob, Error_code* err_code = 0);
        +
        149
        +
        150 /**
        +
        151 * Equivalent to send_blob() but sends a graceful-close message instead of the usual payload.
        +
        152 * All notes from sync_io::Native_handle_sender apply.
        +
        153 *
        +
        154 * @tparam Task_err
        +
        155 * See above.
        +
        156 * @param sync_err_code
        +
        157 * See above.
        +
        158 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        +
        159 * would-block *will* make this throw.
        +
        160 * @param on_done_func
        +
        161 * See above.
        +
        162 * @return See above.
        +
        163 */
        +
        164 template<typename Task_err>
        +
        165 bool async_end_sending(Error_code* sync_err_code, Task_err&& on_done_func);
        +
        166
        +
        167 /**
        +
        168 * Equivalent to `async_end_sending(F)` wherein `F()` does nothing.
        +
        169 *
        +
        170 * All notes from sync_io::Native_handle_sender apply.
        +
        171 *
        +
        172 * @return See above.
        +
        173 */
        + +
        175
        +
        176 /**
        +
        177 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
        +
        178 * are ignored except that they reset any opposing idle timer.
        +
        179 *
        +
        180 * All notes from sync_io::Native_handle_sender apply.
        +
        181 *
        +
        182 * @param period
        +
        183 * See above.
        +
        184 * @return See above.
        +
        185 */
        +
        186 bool auto_ping();
        +
        187}; // class Blob_sender
        +
        188
        +
        189/**
        +
        190 * A documentation-only *concept*: what transport::Blob_receiver is to transport::Native_handle_receiver (namely a
        +
        191 * degenerate version thereof), this is to sync_io::Native_handle_receiver.
        +
        192 *
        +
        193 * The concept is exactly identical to Native_handle_receiver except that in the latter each message consists
        +
        194 * of 0-1 native handles and 0-1 binary blobs; whereas here it is always exactly 1 of the latter. More precisely,
        +
        195 * each message contains 1 binary blob, whose length must be at least 1 byte.
        +
        196 *
        +
        197 * Therefore we keep the documentation very light, only pointing out the differences against
        +
        198 * sync_io::Native_handle_receiver -- which are summarized in the preceding paragraph. All other notes from
        +
        199 * sync_io::Native_handle_receiver apply here.
        +
        200 *
        +
        201 * @see sync_io::Native_handle_receiver, an identical concept with 1 feature (native handle transmission) added.
        +
        202 */
        + +
        204{
        +
        205public:
        +
        206 // Constants.
        +
        207
        +
        208 /// Same notes as for transport::Blob_receiver.
        + +
        210
        +
        211 /// Same notes as for transport::Blob_receiver.
        +
        212 static constexpr bool S_BLOB_UNDERFLOW_ALLOWED = value;
        +
        213
        +
        214 // Constructors/destructor.
        +
        215
        +
        216 /**
        +
        217 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        +
        218 *
        +
        219 * All notes from sync_io::Native_handle_receiver apply.
        +
        220 */
        + +
        222
        +
        223 /**
        +
        224 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        +
        225 * All notes from sync_io::Native_handle_receiver apply.
        +
        226 *
        +
        227 * @param src
        +
        228 * See above.
        +
        229 */
        + +
        231
        +
        232 /// Disallow copying.
        +
        233 Blob_receiver(const Blob_receiver&) = delete;
        +
        234
        +
        235 /**
        +
        236 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        +
        237 * still active) and return resources to OS as applicable.
        +
        238 *
        +
        239 * All notes from sync_io::Native_handle_receiver apply.
        +
        240 */
        + +
        242
        +
        243 // Methods.
        +
        244
        +
        245 /**
        +
        246 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        +
        247 * No-op if `&src == this`.
        +
        248 *
        +
        249 * All notes from sync_io::Native_handle_receiver apply.
        +
        250 *
        +
        251 * @param src
        +
        252 * See above.
        +
        253 * @return `*this`.
        +
        254 */
        + +
        256
        +
        257 /// Disallow copying.
        + +
        259
        +
        260 // `sync_io`-pattern API.
        +
        261
        +
        262 /**
        +
        263 * Coincides with sync_io::Native_handle_receiver concept counterpart. All notes apply.
        +
        264 *
        +
        265 * @tparam Create_ev_wait_hndl_func
        +
        266 * See above.
        +
        267 * @param create_ev_wait_hndl_func
        +
        268 * See above.
        +
        269 * @return See above.
        +
        270 */
        +
        271 template<typename Create_ev_wait_hndl_func>
        +
        272 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        +
        273
        +
        274 /**
        +
        275 * All notes from sync_io::Native_handle_receiver::start_receive_native_handle_ops() apply.
        +
        276 *
        +
        277 * @tparam Event_wait_func_t
        +
        278 * See above.
        +
        279 * @param ev_wait_func
        +
        280 * See above.
        +
        281 * @return See above.
        +
        282 */
        +
        283 template<typename Event_wait_func_t>
        +
        284 bool start_receive_blob_ops(Event_wait_func_t&& ev_wait_func);
        +
        285
        +
        286 // General API (mirrors transport:: counterpart).
        +
        287
        +
        288 /**
        +
        289 * All notes from sync_io::Native_handle_receiver::receive_meta_blob_max_size() apply.
        +
        290 *
        +
        291 * @return See above.
        +
        292 */
        +
        293 size_t receive_blob_max_size() const;
        +
        294
        +
        295 /**
        +
        296 * In PEER state: Possibly-asynchronously awaits one discrete message -- as sent by the opposing peer -- and
        +
        297 * receives it into the given target locations, reliably and in-order.
        +
        298 *
        +
        299 * Otherwise all notes from sync_io::Native_handle_receiver::async_receive_native_handle() apply.
        +
        300 *
        +
        301 * @tparam Task_err_sz
        +
        302 * See above.
        +
        303 * @param target_blob
        +
        304 * `target_blob.data()...` shall be written to before `on_done_func()` is executed with a falsy
        +
        305 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
        +
        306 * `target_blob.size()`. See "Error semantics" (there is an `Error_code` regarding
        +
        307 * overflowing the user's memory area).
        +
        308 * @param sync_err_code
        +
        309 * See above.
        +
        310 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        +
        311 * would-block *will* make this throw.
        +
        312 * @param sync_sz
        +
        313 * See above. If null behavior undefined (assertion may trip).
        +
        314 * @param on_done_func
        +
        315 * See above.
        +
        316 * @return See above.
        +
        317 */
        +
        318 template<typename Task_err_sz>
        +
        319 bool async_receive_blob(const util::Blob_mutable& target_blob,
        +
        320 Error_code* sync_err_code, size_t* sync_sz,
        +
        321 Task_err_sz&& on_done_func);
        +
        322
        +
        323 /**
        +
        324 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
        +
        325 * the specified time has passed since the last received low-level traffic (or this call, whichever most
        +
        326 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
        +
        327 *
        +
        328 * All notes from sync_io::Native_handle_receiver apply.
        +
        329 *
        +
        330 * @param timeout
        +
        331 * See above.
        +
        332 * @return See above.
        +
        333 */
        + +
        335}; // class Blob_receiver
        +
        336
        +
        337} // namespace ipc::transport::sync_io
        +
        A documentation-only concept: what transport::Blob_receiver is to transport::Native_handle_receiver (...
        Blob_receiver(Blob_receiver &&src)
        Move-constructs from src; src becomes as-if default-cted (therefore in NULL state).
        bool replace_event_wait_handles(const Create_ev_wait_hndl_func &create_ev_wait_hndl_func)
        Coincides with sync_io::Native_handle_receiver concept counterpart.
        -
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Blob_receiver.
        +
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Blob_receiver.
        ~Blob_receiver()
        Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
        bool idle_timer_run(util::Fine_duration timeout)
        In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is,...
        Blob_receiver()
        Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        Blob_receiver(const Blob_receiver &)=delete
        Disallow copying.
        -
        static constexpr bool S_BLOB_UNDERFLOW_ALLOWED
        Same notes as for transport::Blob_receiver.
        +
        static constexpr bool S_BLOB_UNDERFLOW_ALLOWED
        Same notes as for transport::Blob_receiver.
        size_t receive_blob_max_size() const
        All notes from sync_io::Native_handle_receiver::receive_meta_blob_max_size() apply.
        Blob_receiver & operator=(Blob_receiver &&src)
        Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
        Blob_receiver & operator=(const Blob_receiver &)=delete
        Disallow copying.
        bool async_receive_blob(const util::Blob_mutable &target_blob, Error_code *sync_err_code, size_t *sync_sz, Task_err_sz &&on_done_func)
        In PEER state: Possibly-asynchronously awaits one discrete message – as sent by the opposing peer – a...
        bool start_receive_blob_ops(Event_wait_func_t &&ev_wait_func)
        All notes from sync_io::Native_handle_receiver::start_receive_native_handle_ops() apply.
        -
        A documentation-only concept: what transport::Blob_sender is to transport::Native_handle_sender (name...
        +
        A documentation-only concept: what transport::Blob_sender is to transport::Native_handle_sender (name...
        bool replace_event_wait_handles(const Create_ev_wait_hndl_func &create_ev_wait_hndl_func)
        Coincides with sync_io::Native_handle_sender concept counterpart.
        Blob_sender & operator=(Blob_sender &&src)
        Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
        -
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Blob_sender.
        +
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Blob_sender.
        bool end_sending()
        Equivalent to async_end_sending(F) wherein F() does nothing.
        size_t send_blob_max_size() const
        All notes from sync_io::Native_handle_sender apply.
        ~Blob_sender()
        Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
        @@ -437,14 +438,14 @@
        Blob_sender(const Blob_sender &)=delete
        Disallow copying.
        String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp.html index 64d0ba1bb..f742d5df9 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -115,7 +115,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp_source.html index fcb9bee76..d642bde5a 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__rcv__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -1340,7 +1340,7 @@
        static Auto_closing_mq ensure_unique_peer(flow::log::Logger *logger_ptr, Mq &&mq, bool snd_else_rcv, Error_code *err_code)
        Internal helper for Blob_stream_mq_sender and Blob_stream_mq_receiver that operates both the start an...
        Persistent_mq_handle Mq
        Short-hand for template arg for underlying MQ handle type.
        boost::movelib::unique_ptr< Mq, Function< void(Mq *)> > Auto_closing_mq
        Persistent_mq_handle holder that takes a deleter lambda on construction, intended here to perform add...
        -
        A documentation-only concept defining the behavior of an object representing a light-weight handle to...
        +
        A documentation-only concept defining the behavior of an object representing a light-weight handle to...
        A simple state machine that, assuming the opposide side of a comm pathway uses an equivalent state ma...
        static constexpr proto_ver_t S_VER_UNKNOWN
        A proto_ver_t value, namely a negative one, which is a reserved value indicating "unknown version"; i...
        Internal, non-movable pImpl-lite implementation of sync_io::Blob_stream_mq_receiver class template.
        @@ -1394,27 +1394,27 @@
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        util::Native_handle Native_handle
        Convenience alias for the commonly used type util::Native_handle.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122
        void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
        Writes a byte to the given pipe writer.
        Definition: util.cpp:67
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
        Reads a byte via the given pipe reader.
        Definition: util.cpp:96
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:322
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:323
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        Identical to sync_io::Async_adapter_receiver::User_request, except we only keep at most 1 of these an...
        flow::async::Task_asio_err_sz m_on_done_func
        Same as in sync_io::Async_adapter_receiver::User_request.
        util::Blob_mutable m_target_blob
        Same as in sync_io::Async_adapter_receiver::User_request.
        -
        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.
        +
        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.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp.html index 9e2df70fe..66bdb0d01 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -119,7 +119,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp_source.html index bf685ef8d..5b38f3558 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2blob__stream__mq__snd__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -1789,7 +1789,7 @@
        static Auto_closing_mq ensure_unique_peer(flow::log::Logger *logger_ptr, Mq &&mq, bool snd_else_rcv, Error_code *err_code)
        Internal helper for Blob_stream_mq_sender and Blob_stream_mq_receiver that operates both the start an...
        Persistent_mq_handle Mq
        Short-hand for template arg for underlying MQ handle type.
        boost::movelib::unique_ptr< Mq, Function< void(Mq *)> > Auto_closing_mq
        Persistent_mq_handle holder that takes a deleter lambda on construction, intended here to perform add...
        -
        A documentation-only concept defining the behavior of an object representing a light-weight handle to...
        +
        A documentation-only concept defining the behavior of an object representing a light-weight handle to...
        A simple state machine that, assuming the opposide side of a comm pathway uses an equivalent state ma...
        static constexpr proto_ver_t S_VER_UNKNOWN
        A proto_ver_t value, namely a negative one, which is a reserved value indicating "unknown version"; i...
        Internal, non-movable pImpl-lite implementation of sync_io::Blob_stream_mq_sender class template.
        @@ -1845,27 +1845,27 @@
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        util::Native_handle Native_handle
        Convenience alias for the commonly used type util::Native_handle.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122
        void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
        Writes a byte to the given pipe writer.
        Definition: util.cpp:67
        void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
        Reads a byte via the given pipe reader.
        Definition: util.cpp:96
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:322
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:323
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        Data store representing a payload corresponding to exactly one attempted async write-op,...
        flow::util::Blob m_blob
        The buffer to transmit in the payload; possibly .empty().
        boost::movelib::unique_ptr< Snd_low_lvl_payload > Ptr
        Short-hand for unique_ptr to this.
        -
        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.
        +
        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.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp.html index fba6eb19e..a0ad0852b 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -101,7 +101,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp_source.html index 71a7e04c1..8ea8bd89b 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -385,329 +385,330 @@
        313 // Endpoint was fine; do the actual async connect attempt.
        314
        315#ifndef FLOW_OS_LINUX
        -
        316# error "Some below code, at least comments, has been verified with Linux only. Revisit before extending to other OS."
        -
        317#endif
        -
        318
        -
        319 /* Normally we'd do m_peer_socket->async_connect(F), but in the sync_io pattern we have to break it down into
        -
        320 * some non-blocking operation(s) with an async-wait delegated to the user via m_conn_ev_wait_func().
        -
        321 * (Internally that's what ->async_connect() does, but the wait is done by boost.asio.)
        -
        322 * Namely that's:
        -
        323 * -# Set socket to non-blocking mode: ->non_blocking(true).
        -
        324 * -# Synchronous ->connect().
        -
        325 * -# This might succeed -- or fail -- immediately, as it's a local socket. Done. Otherwise:
        -
        326 * -# It will yield would-block indicating connection in-progress.
        -
        327 * -# Wait for writability of socket.
        -
        328 * -# Once that's ready, done. (If it really failed, it'll be "writable" -- but as soon as they try using it,
        -
        329 * the true error shall be revealed.)
        -
        330 *
        -
        331 * We will do just that, for maximum resiliency in the face of who-knows-what. In reality (as tested in Linux)
        -
        332 * the situation is simultaneously simpler -- in practice -- and more complicated (the reasons for why it works
        -
        333 * that way). I explain... it's pretty messy. This is with boost.asio from Boost 1.81.
        -
        334 *
        -
        335 * The trickiness is in ->connect(). If the opposing acceptor is listen()ing, and there is sufficient backlog
        -
        336 * space, then it just immediately succeeds. If it is not listen()ing, then it just immediately fails.
        -
        337 * Now suppose it is listen()ing, but it ran out of backlog space. Then: Whether ->non_blocking(true) or not
        -
        338 * (but, like, yes, it's true for us), it internally does the following.
        -
        339 * -# ::connect(). If returns error.
        -
        340 * -# If that error is would-block (EWOULDBLOCK or EAGAIN or EINPROGRESS; but really-really EAGAIN is what happens
        -
        341 * in Linux with Unix domain sockets):
        -
        342 * -# ::poll(), awaiting (with infinite timeout) writability of socket.
        -
        343 * - Yes, it does this totally ignoring ->non_blocking(). That reads like a bug, and no comments explain
        -
        344 * it, but in practice it apparently is not a bug; at least it's not for Unix domain sockets in my
        -
        345 * (ygoldfel) testing.
        -
        346 * -# The ::poll() immediately returns 1 active FD, meaning it's writable.
        -
        347 * - I have no idea why, exactly. In point of fact in blocking mode the ::connect() will actually sit there
        -
        348 * and wait for the backlog to clear. It does make sense non-blocking ::connect() immediately yields
        -
        349 * EAGAIN. But then ::poll() reports immediate writability? That is rather strange. Why wouldn't
        -
        350 * the connect() just return an error then?
        -
        351 * -# The code then tries to get SO_ERROR through a ::getsockopt(). This might be a TCP-stack thing more;
        -
        352 * in any case it yields no error in practice with Unix domain socket. (I really traced through the code to
        -
        353 * confirm this; socket_ops.ipp is the file.)
        -
        354 * So, ostensibly the ->connect() succeeds in this situation. However, ->write_some() at that point just
        -
        355 * hilariously yields ENOTCONN. So all is well that ends... poorly? Point is, that's what happens; at least
        -
        356 * it doesn't just sit around blocking inside ->connect() despite non_blocking(true). Is it okay behavior
        -
        357 * given the situation (backlog full)? Firsly backlog really shouldn't be full given a properly
        -
        358 * operating opposing acceptor (by the way it defaults to like 4096). But if it is, I'd say this behavior is
        -
        359 * fine, and my standard is this: Even using a nice, civilized, normal m_peer_socket->async_connect(), the
        -
        360 * resulting behavior is *exactly* the same: The ->async_connect() quickly "succeeds"; then
        -
        361 * ->async_write() immediately ENOTCONNs. If we do equally well as a properly operated ->async_connect(),
        -
        362 * then what else can they ask for really?
        -
        363 *
        -
        364 * That said, again, out of a preponderance of caution and future-proofness (?) we don't rely on the above
        -
        365 * always happening; and in fact have a clause for getting would_block from ->connect() in which case
        -
        366 * we do the whole m_conn_ev_wait_func() thing. For now it won't be exercised is all.
        -
        367 *
        -
        368 * Update: As noted in "Connect-ops impl design" section of class doc header, when/if some form of `*this`
        -
        369 * becomes networked, then async_connect() will probably be public, and this code-path will come into
        -
        370 * play (and sync_connect() perhaps would become potentially-blocking in that setting). */
        -
        371
        -
        372 assert((!m_peer_socket->non_blocking()) && "New NULL-state socket should start as not non-blocking.");
        -
        373 m_peer_socket->non_blocking(true, sync_err_code);
        -
        374 if (!sync_err_code)
        -
        375 {
        -
        376 m_peer_socket->connect(remote_endpoint, sync_err_code);
        -
        377 /* Debug/test note: can force rare async code path here: `sync_err_code = boost::asio::error::would_block;`
        -
        378 * Don't commit that obviously. @todo Unit test. */
        -
        379 if (sync_err_code == boost::asio::error::would_block)
        -
        380 {
        -
        381 FLOW_LOG_INFO("Socket stream [" << *this << "]: boost::asio::connect() (non-blocking) got would-block; "
        -
        382 "while documented as possible this is actually rather surprising based on our testing "
        -
        383 "and understanding of internal boost.asio code. Proceeding to wait for writability.");
        -
        384 m_conn_ev_wait_func(&(m_conn_ev_wait_hndl_peer_socket.value()),
        -
        385 true, // Wait for write.
        -
        386 // Once writable do this.
        -
        387 boost::make_shared<Task>
        -
        388 ([this, on_done_func = std::move(on_done_func)]() mutable
        -
        389 {
        -
        390 conn_on_ev_peer_socket_writable(std::move(on_done_func));
        -
        391 }));
        -
        392
        - -
        394 return;
        -
        395 }
        -
        396 // else
        -
        397 if (sync_err_code)
        -
        398 {
        -
        399 FLOW_LOG_WARNING("Socket stream [" << *this << "]: boost::asio::connect() (non-blocking) completed "
        -
        400 "immediately but with error [" << sync_err_code << "] [" << sync_err_code.message() << "]. "
        -
        401 "Connect request failing. Will emit error via sync-args.");
        -
        402 }
        -
        403 // else { Success. Reminder: this and fatal error are both much likelier than would-block. }
        -
        404 } // if (!err_code) [m_peer_socket->non_blocking(true)] (but it may have become truthy inside)
        -
        405 else // if (err_code) [m_peer_socket->non_blocking(true)]
        -
        406 {
        -
        407 FLOW_LOG_WARNING("Socket stream [" << *this << "]: Trying to set non-blocking mode yielded error, "
        -
        408 "which is pretty crazy; details: [" << sync_err_code << "] "
        -
        409 "[" << sync_err_code.message() << "]. Connect request failing. "
        -
        410 "Will emit error via sync-args.");
        -
        411 }
        -
        412 } // if (!sync_err_code) [endpoint construction] (but it may have become truthy inside)
        -
        413 // else if (sync_err_code) [endpoint construction] { It logged. }
        -
        414
        -
        415 // If got here, sync_err_code indicates immediate success or failure of async_connect().
        -
        416 m_state = sync_err_code ? State::S_NULL : State::S_PEER;
        -
        417} // Native_socket_stream::Impl::async_connect()
        -
        418
        -
        419void Native_socket_stream::Impl::conn_on_ev_peer_socket_writable(flow::async::Task_asio_err&& on_done_func)
        -
        420{
        -
        421 assert((m_state == State::S_CONNECTING) && "Only we can get out of CONNECTING state in the first place.");
        -
        422
        -
        423 /* The wait indicates it's writable... or "writable," meaning in error state. While we could try some
        -
        424 * trick like ::getsockopt(SO_ERROR), it's all academic anyway: in Linux at least, as noted in long
        -
        425 * comment in async_connect(), ->connect() will either succeed or fail right away; and in the one
        -
        426 * case where one can force a connectable-but-not-immediately situation -- hitting a backlog-full acceptor --
        -
        427 * it'll still just succeed. Anyway, if it weren't academic, then even if we falsely assume PEER state here,
        -
        428 * when really m_peer_socket is hosed underneath, it'll just get exposed the moment we try to read or write.
        -
        429 * So just relax. */
        -
        430
        -
        431 FLOW_LOG_INFO("Socket stream [" << *this << "]: Writable-wait upon would-blocked connect attempt: done. "
        -
        432 "Entering PEER state. Will emit to completion handler.");
        -
        433 m_state = State::S_PEER;
        -
        434 on_done_func(Error_code());
        -
        435 FLOW_LOG_TRACE("Handler completed.");
        -
        436} // Native_socket_stream::Impl::conn_on_ev_peer_socket_writable()
        -
        437
        - -
        439 (const Function<util::sync_io::Asio_waitable_native_handle ()>& create_ev_wait_hndl_func)
        -
        440{
        -
        441 if ((!m_snd_ev_wait_func.empty()) || (!m_rcv_ev_wait_func.empty()))
        -
        442 {
        -
        443 FLOW_LOG_WARNING("Socket stream [" << *this << "]: Cannot replace event-wait handles after "
        -
        444 "a start-*-ops procedure has been executed. Ignoring.");
        -
        445 return false;
        -
        446 }
        -
        447 // else
        -
        448
        -
        449 FLOW_LOG_INFO("Socket stream [" << *this << "]: Replacing event-wait handles (probably to replace underlying "
        -
        450 "execution context without outside event loop's boost.asio Task_engine or similar).");
        -
        451
        -
        452 assert(m_ev_wait_hndl_peer_socket.is_open());
        -
        453 assert(m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.is_open());
        -
        454 assert(m_rcv_ev_wait_hndl_idle_timer_fired_peer.is_open());
        -
        455
        -
        456 Native_handle saved(m_ev_wait_hndl_peer_socket.release());
        -
        457 m_ev_wait_hndl_peer_socket = create_ev_wait_hndl_func();
        -
        458 m_ev_wait_hndl_peer_socket.assign(saved);
        -
        459
        -
        460 saved.m_native_handle = m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.release();
        -
        461 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer = create_ev_wait_hndl_func();
        -
        462 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.assign(saved);
        -
        463
        -
        464 saved.m_native_handle = m_rcv_ev_wait_hndl_idle_timer_fired_peer.release();
        -
        465 m_rcv_ev_wait_hndl_idle_timer_fired_peer = create_ev_wait_hndl_func();
        -
        466 m_rcv_ev_wait_hndl_idle_timer_fired_peer.assign(saved);
        -
        467
        -
        468 return true;
        -
        469} // Native_socket_stream::Impl::replace_event_wait_handles()
        -
        470
        - - -
        473{
        - - -
        476
        -
        477 FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(Process_credentials, Native_socket_stream::Impl::remote_peer_process_credentials,
        -
        478 _1);
        -
        479 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
        -
        480
        -
        481 if (!state_peer("remote_peer_process_credentials()"))
        -
        482 {
        -
        483 err_code->clear(); // As promised.
        -
        484 return Process_credentials();
        -
        485 }
        -
        486 // else
        -
        487
        -
        488 if (!m_peer_socket)
        -
        489 {
        - -
        491 return Process_credentials();
        -
        492 }
        -
        493 // else
        -
        494
        -
        495 Opt_peer_process_credentials sock_opt; // Contains default-cted Process_credentials.
        -
        496 m_peer_socket->get_option(sock_opt, *err_code);
        -
        497
        -
        498 return sock_opt;
        -
        499} // Native_socket_stream::Impl::remote_peer_process_credentials()
        -
        500
        -
        501const std::string& Native_socket_stream::Impl::nickname() const
        -
        502{
        -
        503 return m_nickname;
        -
        504}
        -
        505
        - -
        507{
        -
        508 if (m_state != State::S_PEER)
        -
        509 {
        -
        510 FLOW_LOG_WARNING("Socket stream [" << *this << "]: In context [" << context << "] we must be in PEER state, "
        -
        511 "but we are not. Probably a user bug, but it is not for us to judge.");
        -
        512 return false;
        -
        513 }
        -
        514 // else
        -
        515 return true;
        -
        516}
        -
        517
        -
        518std::ostream& operator<<(std::ostream& os, const Native_socket_stream::Impl& val)
        -
        519{
        -
        520 return os << "SIO[" << val.nickname() << "]@" << static_cast<const void*>(&val);
        -
        521}
        -
        522
        -
        523#if 0 // See the declaration in class { body }; explains why `if 0` yet still here.
        -
        524void Native_socket_stream::Impl::reset_sync_io_setup()
        -
        525{
        - -
        527
        -
        528 /* Please see our doc header first. That has important background. Back here again? Read on:
        -
        529 * - We're supposed to undo start_receive_*_ops(), if it has been called.
        -
        530 * - We're supposed to undo start_send_*_ops(), if it has been called.
        -
        531 * - However, do *not* undo its send of protocol-negotiation out-message. Well, that's impossible anyway.
        -
        532 * More accurately: do *not* undo m_protocol_negotiator.local_max_proto_ver_for_sending() (i.e., do not
        -
        533 * .reset()). The effect of leaving that alone => start_send_*_ops() will skip attempt to send it (again).
        -
        534 * - We're supposed to undo replace_event_wait_handles(), if it has been called.
        -
        535 * - We must leave *this in a coherent state (so one can use it, as-if it had just been cted in PEER state).
        -
        536 * - We can assume certain things that'll make the above (in aggregate) not hard. Namely, none of these have
        -
        537 * been called: async_receive_*(), send_*(), *end_sending(), auto_ping(), idle_timer_run().
        -
        538 * That's very helpful, because it means no async-waits are currently in progress; which means undoing
        -
        539 * the sync-op-pattern-init methods (start_*_ops() and/or replace_event_wait_handles()) doesn't lead to
        -
        540 * an incoherent *this.
        -
        541 * - It'd be nice to assert() on that wherever practical.
        -
        542 * - HOWEVER!!! A complicating factor is that, while no auto_ping() / send_*() / *end_sending() = helpful,
        -
        543 * nevertheless a send-op *will* have been invoked from start_send_*_ops(). As noted above, it would have
        -
        544 * sent the Protocol_negotiator out-message. Thankfully, in actual fact, this can have caused one of
        -
        545 * exactly 2 state change sets, firstly m_protocol_negotiator.local_max_proto_ver_for_sending() now returns
        -
        546 * UNKNOWN plus secondly either
        -
        547 * - (success -- likely) no other state change; or
        -
        548 * - (failure -- unlikely) m_snd_pending_err_code is made truthy; m_peer_socket is nullified.
        -
        549 * Undoing start_*_ops() and replace_event_wait_handles() does *not* conflict with any of these eventualities.
        -
        550 * That is *this remains coherent. To convince oneself of this, you only need to worry about the
        -
        551 * "(failure -- unlikely)" case, but in doing so you may have to go through other *this code to achieve it.
        -
        552 * Basically imagine *this after that scenario executes.
        -
        553 * - At first it's before any start_*_ops() or replace_event_wait_handles(), at which point essentially only
        -
        554 * those are callable. Are they safe? Yes:
        -
        555 * - start_*_ops(F): It'll just memorize move(F); and start_send_*_ops() will detect that Protocol_negotiator
        -
        556 * out-message was already sent and hence do nothing beyond memorizing move(F).
        -
        557 * - replace_event_wait_handles(): It does not access m_peer_socket or m_snd_pending_err_code at all.
        -
        558 * - Once they have been called: You can do other stuff, namely send_*(), async_receive_*(), and so on.
        -
        559 * Are they safe? Yes, of course: It's just the vanilla an-error-has-hosed-*this-in-PEER-state situation. */
        -
        560
        -
        561 // So first let's do our best to assert() the requirements.
        -
        562
        -
        563 assert((m_state == State::S_PEER) && "Must be in PEER state by contract.");
        -
        564
        -
        565 const bool hosed = !m_peer_socket;
        -
        566 assert((hosed == bool(m_snd_pending_err_code))
        -
        567 && "By contract we must not be in hosed state, unless due to internal initial-negotiation-send failing.");
        -
        568
        -
        569 FLOW_LOG_TRACE("Socket stream [" << *this << "]: Releasing idle-state object to new socket-stream core object. "
        -
        570 "To finish this: Undoing sync_io-pattern init steps to released core. "
        -
        571 "Is it hosed due to protocol-negotiation out-message send having failed? = [" << hosed << "].");
        -
        572
        -
        573 /* m_snd_pending_payloads_q being non-empty would mean there's an active async-wait; that'd be tough for us.
        -
        574 * Slight subtlety: the Protocol_negotiator out-message send ostensibly could encounter would-block and hence
        -
        575 * make this out-queue non-empty. Except, no, it can't: there's no way the send buffer gets filled up by 1 small
        -
        576 * message. So if it's non-empty, they must have send_*()ed stuff against contract. */
        -
        577 assert(m_snd_pending_payloads_q.empty()
        -
        578 && "Did you send_*() against contract? No way should initial-protocol-negotiation-send yield would-block.");
        -
        579
        -
        580 assert((!m_snd_finished) && "Did you *end_sending() against contract?");
        -
        581 assert(m_snd_pending_on_last_send_done_func_or_empty.empty() && "Did you *end_sending() against contract?");
        -
        582 assert((m_snd_auto_ping_period == util::Fine_duration::zero()) && "Did you auto_ping() against contract?");
        -
        583 assert((!m_rcv_user_request) && "Did you async_receive_*() against contract?");
        -
        584 assert((!m_rcv_pending_err_code)
        -
        585 && "Did you async_receive_*() or idle_timer_run() against contract?");
        -
        586 assert((m_rcv_idle_timeout == util::Fine_duration::zero()) && "Did you idle_timer_run() against contract?");
        -
        587 assert((m_protocol_negotiator.negotiated_proto_ver() == Protocol_negotiator::S_VER_UNKNOWN)
        -
        588 && "Did you async_receive_*() or idle_timer_run() against contract?");
        -
        589
        -
        590 // Time to undo stuff.
        -
        591
        -
        592 /* start_*_ops() (excluding the m_protocol_negotiator out-message thing), in PEER state =
        -
        593 * - Memorize a user-supplied func into m_snd_ev_wait_func.
        -
        594 * - Ditto m_rcv_ev_wait_func.
        -
        595 * Therefore just do this (possibly no-op): */
        -
        596 m_snd_ev_wait_func.clear();
        -
        597 m_rcv_ev_wait_func.clear();
        -
        598
        -
        599 /* replace_event_wait_handles(), in PEER state =
        -
        600 * For the 3 watchable FDs in *this -- m_ev_wait_hndl_peer_socket, m_snd_ev_wait_hndl_auto_ping_timer_fired_peer,
        -
        601 * and m_rcv_ev_wait_hndl_idle_timer_fired_peer -- do this (for each guy S of those):
        -
        602 * - Starting point: S contains a particular raw FD, associated with Task_engine m_ev_hndl_task_engine_unused.
        -
        603 * - Do: Replace associated Task_engine m_ev_hndl_task_engine_unused with <user-supplied one via functor thing>.
        -
        604 * So to undo it just do reverse it essentially (possibly no-op): */
        -
        605 m_ev_wait_hndl_peer_socket
        -
        606 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        -
        607 m_ev_wait_hndl_peer_socket.release());
        -
        608
        -
        609 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer
        -
        610 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        -
        611 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.release());
        -
        612
        -
        613 m_rcv_ev_wait_hndl_idle_timer_fired_peer
        -
        614 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        -
        615 m_rcv_ev_wait_hndl_idle_timer_fired_peer.release());
        -
        616} // Native_socket_stream::Impl::reset_sync_io_setup()
        -
        617#endif
        -
        618
        -
        619} // namespace ipc::transport::sync_io
        +
        316 static_assert(false, "Some below code, at least comments, has been verified with Linux only. "
        +
        317 "Revisit before extending to other OS.");
        +
        318#endif
        +
        319
        +
        320 /* Normally we'd do m_peer_socket->async_connect(F), but in the sync_io pattern we have to break it down into
        +
        321 * some non-blocking operation(s) with an async-wait delegated to the user via m_conn_ev_wait_func().
        +
        322 * (Internally that's what ->async_connect() does, but the wait is done by boost.asio.)
        +
        323 * Namely that's:
        +
        324 * -# Set socket to non-blocking mode: ->non_blocking(true).
        +
        325 * -# Synchronous ->connect().
        +
        326 * -# This might succeed -- or fail -- immediately, as it's a local socket. Done. Otherwise:
        +
        327 * -# It will yield would-block indicating connection in-progress.
        +
        328 * -# Wait for writability of socket.
        +
        329 * -# Once that's ready, done. (If it really failed, it'll be "writable" -- but as soon as they try using it,
        +
        330 * the true error shall be revealed.)
        +
        331 *
        +
        332 * We will do just that, for maximum resiliency in the face of who-knows-what. In reality (as tested in Linux)
        +
        333 * the situation is simultaneously simpler -- in practice -- and more complicated (the reasons for why it works
        +
        334 * that way). I explain... it's pretty messy. This is with boost.asio from Boost 1.81.
        +
        335 *
        +
        336 * The trickiness is in ->connect(). If the opposing acceptor is listen()ing, and there is sufficient backlog
        +
        337 * space, then it just immediately succeeds. If it is not listen()ing, then it just immediately fails.
        +
        338 * Now suppose it is listen()ing, but it ran out of backlog space. Then: Whether ->non_blocking(true) or not
        +
        339 * (but, like, yes, it's true for us), it internally does the following.
        +
        340 * -# ::connect(). If returns error.
        +
        341 * -# If that error is would-block (EWOULDBLOCK or EAGAIN or EINPROGRESS; but really-really EAGAIN is what happens
        +
        342 * in Linux with Unix domain sockets):
        +
        343 * -# ::poll(), awaiting (with infinite timeout) writability of socket.
        +
        344 * - Yes, it does this totally ignoring ->non_blocking(). That reads like a bug, and no comments explain
        +
        345 * it, but in practice it apparently is not a bug; at least it's not for Unix domain sockets in my
        +
        346 * (ygoldfel) testing.
        +
        347 * -# The ::poll() immediately returns 1 active FD, meaning it's writable.
        +
        348 * - I have no idea why, exactly. In point of fact in blocking mode the ::connect() will actually sit there
        +
        349 * and wait for the backlog to clear. It does make sense non-blocking ::connect() immediately yields
        +
        350 * EAGAIN. But then ::poll() reports immediate writability? That is rather strange. Why wouldn't
        +
        351 * the connect() just return an error then?
        +
        352 * -# The code then tries to get SO_ERROR through a ::getsockopt(). This might be a TCP-stack thing more;
        +
        353 * in any case it yields no error in practice with Unix domain socket. (I really traced through the code to
        +
        354 * confirm this; socket_ops.ipp is the file.)
        +
        355 * So, ostensibly the ->connect() succeeds in this situation. However, ->write_some() at that point just
        +
        356 * hilariously yields ENOTCONN. So all is well that ends... poorly? Point is, that's what happens; at least
        +
        357 * it doesn't just sit around blocking inside ->connect() despite non_blocking(true). Is it okay behavior
        +
        358 * given the situation (backlog full)? Firsly backlog really shouldn't be full given a properly
        +
        359 * operating opposing acceptor (by the way it defaults to like 4096). But if it is, I'd say this behavior is
        +
        360 * fine, and my standard is this: Even using a nice, civilized, normal m_peer_socket->async_connect(), the
        +
        361 * resulting behavior is *exactly* the same: The ->async_connect() quickly "succeeds"; then
        +
        362 * ->async_write() immediately ENOTCONNs. If we do equally well as a properly operated ->async_connect(),
        +
        363 * then what else can they ask for really?
        +
        364 *
        +
        365 * That said, again, out of a preponderance of caution and future-proofness (?) we don't rely on the above
        +
        366 * always happening; and in fact have a clause for getting would_block from ->connect() in which case
        +
        367 * we do the whole m_conn_ev_wait_func() thing. For now it won't be exercised is all.
        +
        368 *
        +
        369 * Update: As noted in "Connect-ops impl design" section of class doc header, when/if some form of `*this`
        +
        370 * becomes networked, then async_connect() will probably be public, and this code-path will come into
        +
        371 * play (and sync_connect() perhaps would become potentially-blocking in that setting). */
        +
        372
        +
        373 assert((!m_peer_socket->non_blocking()) && "New NULL-state socket should start as not non-blocking.");
        +
        374 m_peer_socket->non_blocking(true, sync_err_code);
        +
        375 if (!sync_err_code)
        +
        376 {
        +
        377 m_peer_socket->connect(remote_endpoint, sync_err_code);
        +
        378 /* Debug/test note: can force rare async code path here: `sync_err_code = boost::asio::error::would_block;`
        +
        379 * Don't commit that obviously. @todo Unit test. */
        +
        380 if (sync_err_code == boost::asio::error::would_block)
        +
        381 {
        +
        382 FLOW_LOG_INFO("Socket stream [" << *this << "]: boost::asio::connect() (non-blocking) got would-block; "
        +
        383 "while documented as possible this is actually rather surprising based on our testing "
        +
        384 "and understanding of internal boost.asio code. Proceeding to wait for writability.");
        +
        385 m_conn_ev_wait_func(&(m_conn_ev_wait_hndl_peer_socket.value()),
        +
        386 true, // Wait for write.
        +
        387 // Once writable do this.
        +
        388 boost::make_shared<Task>
        +
        389 ([this, on_done_func = std::move(on_done_func)]() mutable
        +
        390 {
        +
        391 conn_on_ev_peer_socket_writable(std::move(on_done_func));
        +
        392 }));
        +
        393
        + +
        395 return;
        +
        396 }
        +
        397 // else
        +
        398 if (sync_err_code)
        +
        399 {
        +
        400 FLOW_LOG_WARNING("Socket stream [" << *this << "]: boost::asio::connect() (non-blocking) completed "
        +
        401 "immediately but with error [" << sync_err_code << "] [" << sync_err_code.message() << "]. "
        +
        402 "Connect request failing. Will emit error via sync-args.");
        +
        403 }
        +
        404 // else { Success. Reminder: this and fatal error are both much likelier than would-block. }
        +
        405 } // if (!err_code) [m_peer_socket->non_blocking(true)] (but it may have become truthy inside)
        +
        406 else // if (err_code) [m_peer_socket->non_blocking(true)]
        +
        407 {
        +
        408 FLOW_LOG_WARNING("Socket stream [" << *this << "]: Trying to set non-blocking mode yielded error, "
        +
        409 "which is pretty crazy; details: [" << sync_err_code << "] "
        +
        410 "[" << sync_err_code.message() << "]. Connect request failing. "
        +
        411 "Will emit error via sync-args.");
        +
        412 }
        +
        413 } // if (!sync_err_code) [endpoint construction] (but it may have become truthy inside)
        +
        414 // else if (sync_err_code) [endpoint construction] { It logged. }
        +
        415
        +
        416 // If got here, sync_err_code indicates immediate success or failure of async_connect().
        +
        417 m_state = sync_err_code ? State::S_NULL : State::S_PEER;
        +
        418} // Native_socket_stream::Impl::async_connect()
        +
        419
        +
        420void Native_socket_stream::Impl::conn_on_ev_peer_socket_writable(flow::async::Task_asio_err&& on_done_func)
        +
        421{
        +
        422 assert((m_state == State::S_CONNECTING) && "Only we can get out of CONNECTING state in the first place.");
        +
        423
        +
        424 /* The wait indicates it's writable... or "writable," meaning in error state. While we could try some
        +
        425 * trick like ::getsockopt(SO_ERROR), it's all academic anyway: in Linux at least, as noted in long
        +
        426 * comment in async_connect(), ->connect() will either succeed or fail right away; and in the one
        +
        427 * case where one can force a connectable-but-not-immediately situation -- hitting a backlog-full acceptor --
        +
        428 * it'll still just succeed. Anyway, if it weren't academic, then even if we falsely assume PEER state here,
        +
        429 * when really m_peer_socket is hosed underneath, it'll just get exposed the moment we try to read or write.
        +
        430 * So just relax. */
        +
        431
        +
        432 FLOW_LOG_INFO("Socket stream [" << *this << "]: Writable-wait upon would-blocked connect attempt: done. "
        +
        433 "Entering PEER state. Will emit to completion handler.");
        +
        434 m_state = State::S_PEER;
        +
        435 on_done_func(Error_code());
        +
        436 FLOW_LOG_TRACE("Handler completed.");
        +
        437} // Native_socket_stream::Impl::conn_on_ev_peer_socket_writable()
        +
        438
        + +
        440 (const Function<util::sync_io::Asio_waitable_native_handle ()>& create_ev_wait_hndl_func)
        +
        441{
        +
        442 if ((!m_snd_ev_wait_func.empty()) || (!m_rcv_ev_wait_func.empty()))
        +
        443 {
        +
        444 FLOW_LOG_WARNING("Socket stream [" << *this << "]: Cannot replace event-wait handles after "
        +
        445 "a start-*-ops procedure has been executed. Ignoring.");
        +
        446 return false;
        +
        447 }
        +
        448 // else
        +
        449
        +
        450 FLOW_LOG_INFO("Socket stream [" << *this << "]: Replacing event-wait handles (probably to replace underlying "
        +
        451 "execution context without outside event loop's boost.asio Task_engine or similar).");
        +
        452
        +
        453 assert(m_ev_wait_hndl_peer_socket.is_open());
        +
        454 assert(m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.is_open());
        +
        455 assert(m_rcv_ev_wait_hndl_idle_timer_fired_peer.is_open());
        +
        456
        +
        457 Native_handle saved(m_ev_wait_hndl_peer_socket.release());
        +
        458 m_ev_wait_hndl_peer_socket = create_ev_wait_hndl_func();
        +
        459 m_ev_wait_hndl_peer_socket.assign(saved);
        +
        460
        +
        461 saved.m_native_handle = m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.release();
        +
        462 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer = create_ev_wait_hndl_func();
        +
        463 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.assign(saved);
        +
        464
        +
        465 saved.m_native_handle = m_rcv_ev_wait_hndl_idle_timer_fired_peer.release();
        +
        466 m_rcv_ev_wait_hndl_idle_timer_fired_peer = create_ev_wait_hndl_func();
        +
        467 m_rcv_ev_wait_hndl_idle_timer_fired_peer.assign(saved);
        +
        468
        +
        469 return true;
        +
        470} // Native_socket_stream::Impl::replace_event_wait_handles()
        +
        471
        + + +
        474{
        + + +
        477
        +
        478 FLOW_ERROR_EXEC_AND_THROW_ON_ERROR(Process_credentials, Native_socket_stream::Impl::remote_peer_process_credentials,
        +
        479 _1);
        +
        480 // ^-- Call ourselves and return if err_code is null. If got to present line, err_code is not null.
        +
        481
        +
        482 if (!state_peer("remote_peer_process_credentials()"))
        +
        483 {
        +
        484 err_code->clear(); // As promised.
        +
        485 return Process_credentials();
        +
        486 }
        +
        487 // else
        +
        488
        +
        489 if (!m_peer_socket)
        +
        490 {
        + +
        492 return Process_credentials();
        +
        493 }
        +
        494 // else
        +
        495
        +
        496 Opt_peer_process_credentials sock_opt; // Contains default-cted Process_credentials.
        +
        497 m_peer_socket->get_option(sock_opt, *err_code);
        +
        498
        +
        499 return sock_opt;
        +
        500} // Native_socket_stream::Impl::remote_peer_process_credentials()
        +
        501
        +
        502const std::string& Native_socket_stream::Impl::nickname() const
        +
        503{
        +
        504 return m_nickname;
        +
        505}
        +
        506
        + +
        508{
        +
        509 if (m_state != State::S_PEER)
        +
        510 {
        +
        511 FLOW_LOG_WARNING("Socket stream [" << *this << "]: In context [" << context << "] we must be in PEER state, "
        +
        512 "but we are not. Probably a user bug, but it is not for us to judge.");
        +
        513 return false;
        +
        514 }
        +
        515 // else
        +
        516 return true;
        +
        517}
        +
        518
        +
        519std::ostream& operator<<(std::ostream& os, const Native_socket_stream::Impl& val)
        +
        520{
        +
        521 return os << "SIO[" << val.nickname() << "]@" << static_cast<const void*>(&val);
        +
        522}
        +
        523
        +
        524#if 0 // See the declaration in class { body }; explains why `if 0` yet still here.
        +
        525void Native_socket_stream::Impl::reset_sync_io_setup()
        +
        526{
        + +
        528
        +
        529 /* Please see our doc header first. That has important background. Back here again? Read on:
        +
        530 * - We're supposed to undo start_receive_*_ops(), if it has been called.
        +
        531 * - We're supposed to undo start_send_*_ops(), if it has been called.
        +
        532 * - However, do *not* undo its send of protocol-negotiation out-message. Well, that's impossible anyway.
        +
        533 * More accurately: do *not* undo m_protocol_negotiator.local_max_proto_ver_for_sending() (i.e., do not
        +
        534 * .reset()). The effect of leaving that alone => start_send_*_ops() will skip attempt to send it (again).
        +
        535 * - We're supposed to undo replace_event_wait_handles(), if it has been called.
        +
        536 * - We must leave *this in a coherent state (so one can use it, as-if it had just been cted in PEER state).
        +
        537 * - We can assume certain things that'll make the above (in aggregate) not hard. Namely, none of these have
        +
        538 * been called: async_receive_*(), send_*(), *end_sending(), auto_ping(), idle_timer_run().
        +
        539 * That's very helpful, because it means no async-waits are currently in progress; which means undoing
        +
        540 * the sync-op-pattern-init methods (start_*_ops() and/or replace_event_wait_handles()) doesn't lead to
        +
        541 * an incoherent *this.
        +
        542 * - It'd be nice to assert() on that wherever practical.
        +
        543 * - HOWEVER!!! A complicating factor is that, while no auto_ping() / send_*() / *end_sending() = helpful,
        +
        544 * nevertheless a send-op *will* have been invoked from start_send_*_ops(). As noted above, it would have
        +
        545 * sent the Protocol_negotiator out-message. Thankfully, in actual fact, this can have caused one of
        +
        546 * exactly 2 state change sets, firstly m_protocol_negotiator.local_max_proto_ver_for_sending() now returns
        +
        547 * UNKNOWN plus secondly either
        +
        548 * - (success -- likely) no other state change; or
        +
        549 * - (failure -- unlikely) m_snd_pending_err_code is made truthy; m_peer_socket is nullified.
        +
        550 * Undoing start_*_ops() and replace_event_wait_handles() does *not* conflict with any of these eventualities.
        +
        551 * That is *this remains coherent. To convince oneself of this, you only need to worry about the
        +
        552 * "(failure -- unlikely)" case, but in doing so you may have to go through other *this code to achieve it.
        +
        553 * Basically imagine *this after that scenario executes.
        +
        554 * - At first it's before any start_*_ops() or replace_event_wait_handles(), at which point essentially only
        +
        555 * those are callable. Are they safe? Yes:
        +
        556 * - start_*_ops(F): It'll just memorize move(F); and start_send_*_ops() will detect that Protocol_negotiator
        +
        557 * out-message was already sent and hence do nothing beyond memorizing move(F).
        +
        558 * - replace_event_wait_handles(): It does not access m_peer_socket or m_snd_pending_err_code at all.
        +
        559 * - Once they have been called: You can do other stuff, namely send_*(), async_receive_*(), and so on.
        +
        560 * Are they safe? Yes, of course: It's just the vanilla an-error-has-hosed-*this-in-PEER-state situation. */
        +
        561
        +
        562 // So first let's do our best to assert() the requirements.
        +
        563
        +
        564 assert((m_state == State::S_PEER) && "Must be in PEER state by contract.");
        +
        565
        +
        566 const bool hosed = !m_peer_socket;
        +
        567 assert((hosed == bool(m_snd_pending_err_code))
        +
        568 && "By contract we must not be in hosed state, unless due to internal initial-negotiation-send failing.");
        +
        569
        +
        570 FLOW_LOG_TRACE("Socket stream [" << *this << "]: Releasing idle-state object to new socket-stream core object. "
        +
        571 "To finish this: Undoing sync_io-pattern init steps to released core. "
        +
        572 "Is it hosed due to protocol-negotiation out-message send having failed? = [" << hosed << "].");
        +
        573
        +
        574 /* m_snd_pending_payloads_q being non-empty would mean there's an active async-wait; that'd be tough for us.
        +
        575 * Slight subtlety: the Protocol_negotiator out-message send ostensibly could encounter would-block and hence
        +
        576 * make this out-queue non-empty. Except, no, it can't: there's no way the send buffer gets filled up by 1 small
        +
        577 * message. So if it's non-empty, they must have send_*()ed stuff against contract. */
        +
        578 assert(m_snd_pending_payloads_q.empty()
        +
        579 && "Did you send_*() against contract? No way should initial-protocol-negotiation-send yield would-block.");
        +
        580
        +
        581 assert((!m_snd_finished) && "Did you *end_sending() against contract?");
        +
        582 assert(m_snd_pending_on_last_send_done_func_or_empty.empty() && "Did you *end_sending() against contract?");
        +
        583 assert((m_snd_auto_ping_period == util::Fine_duration::zero()) && "Did you auto_ping() against contract?");
        +
        584 assert((!m_rcv_user_request) && "Did you async_receive_*() against contract?");
        +
        585 assert((!m_rcv_pending_err_code)
        +
        586 && "Did you async_receive_*() or idle_timer_run() against contract?");
        +
        587 assert((m_rcv_idle_timeout == util::Fine_duration::zero()) && "Did you idle_timer_run() against contract?");
        +
        588 assert((m_protocol_negotiator.negotiated_proto_ver() == Protocol_negotiator::S_VER_UNKNOWN)
        +
        589 && "Did you async_receive_*() or idle_timer_run() against contract?");
        +
        590
        +
        591 // Time to undo stuff.
        +
        592
        +
        593 /* start_*_ops() (excluding the m_protocol_negotiator out-message thing), in PEER state =
        +
        594 * - Memorize a user-supplied func into m_snd_ev_wait_func.
        +
        595 * - Ditto m_rcv_ev_wait_func.
        +
        596 * Therefore just do this (possibly no-op): */
        +
        597 m_snd_ev_wait_func.clear();
        +
        598 m_rcv_ev_wait_func.clear();
        +
        599
        +
        600 /* replace_event_wait_handles(), in PEER state =
        +
        601 * For the 3 watchable FDs in *this -- m_ev_wait_hndl_peer_socket, m_snd_ev_wait_hndl_auto_ping_timer_fired_peer,
        +
        602 * and m_rcv_ev_wait_hndl_idle_timer_fired_peer -- do this (for each guy S of those):
        +
        603 * - Starting point: S contains a particular raw FD, associated with Task_engine m_ev_hndl_task_engine_unused.
        +
        604 * - Do: Replace associated Task_engine m_ev_hndl_task_engine_unused with <user-supplied one via functor thing>.
        +
        605 * So to undo it just do reverse it essentially (possibly no-op): */
        +
        606 m_ev_wait_hndl_peer_socket
        +
        607 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        +
        608 m_ev_wait_hndl_peer_socket.release());
        +
        609
        +
        610 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer
        +
        611 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        +
        612 m_snd_ev_wait_hndl_auto_ping_timer_fired_peer.release());
        +
        613
        +
        614 m_rcv_ev_wait_hndl_idle_timer_fired_peer
        +
        615 = Asio_waitable_native_handle(m_ev_hndl_task_engine_unused,
        +
        616 m_rcv_ev_wait_hndl_idle_timer_fired_peer.release());
        +
        617} // Native_socket_stream::Impl::reset_sync_io_setup()
        +
        618#endif
        +
        619
        +
        620} // namespace ipc::transport::sync_io
        static constexpr proto_ver_t S_VER_UNKNOWN
        A proto_ver_t value, namely a negative one, which is a reserved value indicating "unknown version"; i...
        -
        Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
        +
        Gettable (read-only) socket option for use with asio_local_stream_socket::Peer_socket ....
        Internal, non-movable pImpl implementation of sync_io::Native_socket_stream class.
        util::sync_io::Asio_waitable_native_handle m_ev_wait_hndl_peer_socket
        Descriptor waitable by outside event loop async-waits – storing the same Native_handle as (and thus b...
        -
        const std::string & nickname() const
        See Native_socket_stream counterpart.
        -
        bool state_peer(util::String_view context) const
        Checks whether m_state has reached State::S_PEER; if so returns true; if not logs WARNING and returns...
        +
        const std::string & nickname() const
        See Native_socket_stream counterpart.
        +
        bool state_peer(util::String_view context) const
        Checks whether m_state has reached State::S_PEER; if so returns true; if not logs WARNING and returns...
        flow::util::Task_engine m_nb_task_engine
        The Task_engine for m_peer_socket.
        bool sync_connect(const Shared_name &absolute_name, Error_code *err_code)
        See Native_socket_stream counterpart.
        bool start_connect_ops(util::sync_io::Event_wait_func &&ev_wait_func)
        It is start_ops<Op::S_CONN>().
        boost::movelib::unique_ptr< asio_local_stream_socket::Peer_socket > m_peer_socket
        The peer stream-type Unix domain socket; or null pointer if we've detected the connection has become ...
        -
        util::Process_credentials remote_peer_process_credentials(Error_code *err_code) const
        See Native_socket_stream counterpart.
        +
        util::Process_credentials remote_peer_process_credentials(Error_code *err_code) const
        See Native_socket_stream counterpart.
        static const size_t S_MAX_META_BLOB_LENGTH
        See Native_socket_stream counterpart.
        uint16_t low_lvl_payload_blob_length_t
        The type used to encode the meta-blob length; this puts a cap on how long the meta-blobs can be.
        -
        bool replace_event_wait_handles(const Function< util::sync_io::Asio_waitable_native_handle()> &create_ev_wait_hndl_func)
        See Native_socket_stream counterpart.
        +
        bool replace_event_wait_handles(const Function< util::sync_io::Asio_waitable_native_handle()> &create_ev_wait_hndl_func)
        See Native_socket_stream counterpart.
        State
        Overall state of a Native_socket_stream::Impl.
        std::optional< util::sync_io::Asio_waitable_native_handle > m_conn_ev_wait_hndl_peer_socket
        This is to (m_peer_socket, m_conn_async_worker) what m_ev_wait_hndl_peer_socket is to (m_peer_socket,...
        -
        void conn_on_ev_peer_socket_writable(flow::async::Task_asio_err &&on_done_func)
        Handler for the async-wait in case async_connect() cannot synchronously complete the m_peer_socket co...
        +
        void conn_on_ev_peer_socket_writable(flow::async::Task_asio_err &&on_done_func)
        Handler for the async-wait in case async_connect() cannot synchronously complete the m_peer_socket co...
        static const low_lvl_payload_blob_length_t S_META_BLOB_LENGTH_PING_SENTINEL
        Value for the length field in payload 1 that means "not a length; indicating this is a ping message....
        void async_connect(const Shared_name &absolute_name, Error_code *sync_err_code, flow::async::Task_asio_err &&on_done_func)
        The core of sync_connect(), written in the sync_io-pattern style.
        @@ -729,19 +730,19 @@
        util::Native_handle Native_handle
        Convenience alias for the commonly used type util::Native_handle.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        boost::shared_ptr< Task > Task_ptr
        Short-hand for ref-counted pointer to a Function<> that takes no arguments and returns nothing; in pa...
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:322
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        -
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:301
        -
        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.
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:323
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        +
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:302
        +
        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.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp.html index 9da8c8ddb..285539ab2 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -121,7 +121,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp_source.html index 664f7029f..b05a21d85 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2detail_2native__socket__stream__impl_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -1716,11 +1716,11 @@
        util::sync_io::Asio_waitable_native_handle m_ev_wait_hndl_peer_socket
        Descriptor waitable by outside event loop async-waits – storing the same Native_handle as (and thus b...
        bool async_end_sending(Error_code *sync_err_code, flow::async::Task_asio_err &&on_done_func)
        See Native_socket_stream counterpart.
        void rcv_read_blob(Rcv_msg_state msg_state, const util::Blob_mutable &target_blob, Error_code *sync_err_code, size_t *sync_sz)
        A somewhat-general utility that continues read chain with the aim to complete the present in-message,...
        -
        const std::string & nickname() const
        See Native_socket_stream counterpart.
        +
        const std::string & nickname() const
        See Native_socket_stream counterpart.
        Rcv_msg_state
        Used to organize tje incoming-direction state machine tactically, this indicates what part of payload...
        bool start_receive_blob_ops(util::sync_io::Event_wait_func &&ev_wait_func)
        See Native_socket_stream counterpart.
        -
        bool state_peer(util::String_view context) const
        Checks whether m_state has reached State::S_PEER; if so returns true; if not logs WARNING and returns...
        +
        bool state_peer(util::String_view context) const
        Checks whether m_state has reached State::S_PEER; if so returns true; if not logs WARNING and returns...
        std::queue< Snd_low_lvl_payload::Ptr > m_snd_pending_payloads_q
        Queue storing (at head) the currently in-progress async write-op of a Snd_low_lvl_payload; followed b...
        flow::util::Task_engine m_nb_task_engine
        The Task_engine for m_peer_socket.
        size_t rcv_nb_read_low_lvl_payload(Native_handle *target_payload_hndl_or_null, const util::Blob_mutable &target_payload_blob, Error_code *err_code)
        Utility that synchronously, non-blockingly attempts to read over m_peer_socket into the target blob a...
        @@ -1749,14 +1749,14 @@
        bool async_end_sending_impl(Error_code *sync_err_code_ptr_or_null, flow::async::Task_asio_err &&on_done_func_or_empty)
        *end_sending() body.
        bool start_send_native_handle_ops(util::sync_io::Event_wait_func &&ev_wait_func)
        See Native_socket_stream counterpart.
        -
        util::Process_credentials remote_peer_process_credentials(Error_code *err_code) const
        See Native_socket_stream counterpart.
        +
        util::Process_credentials remote_peer_process_credentials(Error_code *err_code) const
        See Native_socket_stream counterpart.
        low_lvl_payload_blob_length_t m_rcv_target_meta_length
        Direct-write target, storing the length in bytes of the next meta-blob; 0 meaning the current user me...
        bool start_send_blob_ops(util::sync_io::Event_wait_func &&ev_wait_func)
        See Native_socket_stream counterpart.
        bool start_ops(util::sync_io::Event_wait_func &&ev_wait_func)
        Boiler-plate-reducing body of start_*_ops() for the given Op.
        bool op_started(util::String_view context) const
        Helper that returns true silently if the given Op start_*_ops() has been called; else logs WARNING an...
        static const size_t S_MAX_META_BLOB_LENGTH
        See Native_socket_stream counterpart.
        uint16_t low_lvl_payload_blob_length_t
        The type used to encode the meta-blob length; this puts a cap on how long the meta-blobs can be.
        -
        bool replace_event_wait_handles(const Function< util::sync_io::Asio_waitable_native_handle()> &create_ev_wait_hndl_func)
        See Native_socket_stream counterpart.
        +
        bool replace_event_wait_handles(const Function< util::sync_io::Asio_waitable_native_handle()> &create_ev_wait_hndl_func)
        See Native_socket_stream counterpart.
        std::optional< Rcv_user_request > m_rcv_user_request
        Null if no async_receive_*() is currently pending; else describes the arguments to that pending async...
        flow::async::Task_asio_err m_snd_pending_on_last_send_done_func_or_empty
        Function passed to async_end_sending(), if it returned true and was unable to synchronously flush eve...
        State
        Overall state of a Native_socket_stream::Impl.
        @@ -1767,7 +1767,7 @@
        void rcv_read_msg(Error_code *sync_err_code, size_t *sync_sz)
        Begins read chain (completing it as synchronously as possible, async-completing the rest) for the nex...
        util::sync_io::Timer_event_emitter::Timer_fired_read_end * m_rcv_idle_timer_fired_peer
        Read-end of IPC-mechanism used by m_timer_worker to ferry timer-fired events from m_rcv_idle_timer to...
        bool send_blob(const util::Blob_const &blob, Error_code *err_code)
        See Native_socket_stream counterpart.
        -
        void conn_on_ev_peer_socket_writable(flow::async::Task_asio_err &&on_done_func)
        Handler for the async-wait in case async_connect() cannot synchronously complete the m_peer_socket co...
        +
        void conn_on_ev_peer_socket_writable(flow::async::Task_asio_err &&on_done_func)
        Handler for the async-wait in case async_connect() cannot synchronously complete the m_peer_socket co...
        flow::util::Timer m_rcv_idle_timer
        Timer that fires rcv_on_ev_idle_timer_fired() (which hoses the in-pipe with idle timeour error) and i...
        bool auto_ping(util::Fine_duration period)
        See Native_socket_stream counterpart.
        Error_code m_rcv_pending_err_code
        The first and only connection-hosing error condition detected when attempting to low-level-read on m_...
        @@ -1799,12 +1799,12 @@
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        -
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:301
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        +
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:302
        Identical to sync_io::Async_adapter_receiver::User_request, except we only keep at most 1 of these an...
        util::Blob_mutable m_target_meta_blob
        Same as in sync_io::Async_adapter_receiver::User_request.
        @@ -1814,14 +1814,14 @@
        Native_handle m_hndl_or_null
        The native handle to transmit in the payload; .null() == true to transmit no such thing.
        boost::movelib::unique_ptr< Snd_low_lvl_payload > Ptr
        Short-hand for unique_ptr to this.
        flow::util::Blob m_blob
        The buffer to transmit in the payload; !m_blob.empty() == true, period.
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp.html index 8d589280c..5576b7cb6 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -100,7 +100,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp_source.html index 5e44f7294..aaa033caa 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__handle__transport_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -91,546 +91,547 @@
        19
        20// Not compiled: for documentation only. Contains concept docs as of this writing.
        21#ifndef IPC_DOXYGEN_ONLY
        -
        22# error "As of this writing this is a documentation-only "header" (the "source" is for humans and Doxygen only)."
        -
        23#else // ifdef IPC_DOXYGEN_ONLY
        -
        24
        - -
        26{
        -
        27
        -
        28// Types.
        -
        29
        -
        30/**
        -
        31 * A documentation-only *concept* defining the behavior of an object that is the `sync_io`-pattern counterpart
        -
        32 * of the async-I/O-pattern-following concept of the same name in our parent namespace: transport::Native_handle_sender.
        -
        33 * This is paired with the sync_io::Native_handle_receiver concept which defines reception of such messages.
        -
        34 *
        -
        35 * @see transport::Native_handle_sender -- our async-I/O counterpart.
        -
        36 * @see util::sync_io doc header -- describes the general `sync_io` pattern we are following here.
        -
        37 *
        -
        38 * ### Concept contents ###
        -
        39 * The concept defines the following behaviors/requirements.
        -
        40 * - The object has at least 2 states: Same notes as for transport::Native_handle_sender.
        -
        41 * - The (outgoing) transmission-of-messages methods, including transmission of graceful-close message.
        -
        42 * See their doc headers. Same signatures as transport::Native_handle_sender methods but acting per
        -
        43 * `sync_io` pattern (synchronously).
        -
        44 * - Behavior when the destructor is invoked. See its doc header.
        -
        45 * - All ctors and move assignment: Same notes as for transport::Native_handle_sender. Exception: no
        -
        46 * `sync_io`-core-adopting ctor (since we *are* that core).
        -
        47 * - `sync_io`-pattern setup methods: replace_event_wait_handles(), start_send_native_handle_ops().
        -
        48 *
        -
        49 * The concept (intentionally) does *not* define the following behaviors:
        -
        50 * - How to create a Native_handle_sender, except the default and move ctors.
        -
        51 * Same notes as for transport::Native_handle_sender.
        -
        52 *
        -
        53 * @see sync_io::Native_socket_stream: as of this writing one key class that implements this concept (and also
        -
        54 * sync_io::Native_handle_receiver) -- using the Unix domain socket transport.
        -
        55 *
        -
        56 * ### Thread safety ###
        -
        57 * For a given `*this`, it is not required to be safe for a non-`const` operation to be invoked concurrently with
        -
        58 * another operation. That's typical. *In addition* -- and this is significant -- the following operation shall
        -
        59 * count as a "non-`const` operation" (as opposed to the usual definition which is simply non-`const` methods and
        -
        60 * related free functions):
        -
        61 * - `(*on_active_ev_func)()`, where `on_active_ev_func` is the so-named argument passed into an invocation of
        -
        62 * the `Event_wait_func` the user registers via start_send_native_handle_ops().
        -
        63 *
        -
        64 * Therefore: If you report an active event to `*this` (per `sync_io` pattern) from thread 1, and possibly
        -
        65 * call methods such as `send_native_handle()` from thread 2, then you must use a mutex (or strand or ...)
        -
        66 * to prevent concurrent execution. For example: transport::Native_socket_stream, which internally operates
        -
        67 * a sync_io::Native_socket_stream, uses a send-ops mutex (`transport::Native_socket_stream::Impl::m_snd_mutex`).
        -
        68 *
        -
        69 * ### Rationale: Why is send_native_handle() not asynchronous? ###
        -
        70 * Same notes as for transport::Native_handle_sender.
        -
        71 */
        - -
        73{
        -
        74public:
        -
        75 // Constants.
        -
        76
        -
        77 /// Same notes as for transport::Native_handle_sender.
        - -
        79
        -
        80 // Constructors/destructor.
        -
        81
        -
        82 /**
        -
        83 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        -
        84 * Same notes as for transport::Native_handle_sender.
        -
        85 */
        - -
        87
        -
        88 /**
        -
        89 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        -
        90 * Same notes as for transport::Native_handle_sender.
        -
        91 *
        -
        92 * @param src
        -
        93 * Same notes as for transport::Native_handle_sender.
        -
        94 */
        - -
        96
        -
        97 /// Disallow copying.
        - -
        99
        -
        100 /**
        -
        101 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        -
        102 * still active) and return resources to OS as applicable.
        -
        103 */
        - -
        105
        -
        106 // Methods.
        -
        107
        -
        108 /**
        -
        109 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        -
        110 * No-op if `&src == this`. Same notes as for transport::Native_handle_sender.
        -
        111 *
        -
        112 * @param src
        -
        113 * Same notes as for transport::Native_handle_sender.
        -
        114 * @return `*this`.
        -
        115 */
        - -
        117
        -
        118 /// Disallow copying.
        - -
        120
        -
        121 // `sync_io`-pattern API.
        -
        122
        -
        123 /**
        -
        124 * To be (optionally) invoked before any `start_*_ops()`, supplies a factory for the
        -
        125 * util::sync_io::Asio_waitable_native_handle objects pointers to which shall be subsequently passed into
        -
        126 * any `Event_wait_func` (as registered via `start_*_ops()`), when `*this` requires an async-wait on
        -
        127 * a particular native-handle. This is useful if the user event loop is built on boost.asio: the supplied factory
        -
        128 * function can associate the handle-object with the user's `Task_engine` (or strand or ...); hence
        -
        129 * when an async-wait is requested, the user can simply `hndl_of_interest->async_wait(..., F)`; `F()` will
        -
        130 * be invoked directly within the user's event loop.
        -
        131 *
        -
        132 * (By contrast: if the user means to merely `poll(fd)` or `epoll_wait(fd)`, then they would simply do:
        -
        133 * `auto fd = hndl_of_interest->native_handle().m_native_handle`. In this case the associated execution
        -
        134 * context/executor of `*hndl_of_interest` is of zero import.)
        -
        135 *
        -
        136 * This is a standard `sync_io`-pattern API per util::sync_io doc header.
        -
        137 *
        -
        138 * @tparam Create_ev_wait_hndl_func
        -
        139 * Function type matching signature `util::sync_io::Asio_waitable_native_handle F()`.
        -
        140 * @param create_ev_wait_hndl_func
        -
        141 * See above. Must return object `X` such that `X.is_open() == false` (i.e., storing no native handle/FD).
        -
        142 * @return `false` -- indicating no-op, logging aside -- if and only if `start_*_ops()` has been called already.
        -
        143 * `true` indicating success. Note that this method should succeed even in NULL state.
        -
        144 */
        -
        145 template<typename Create_ev_wait_hndl_func>
        -
        146 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        -
        147
        -
        148 /**
        -
        149 * Sets up the `sync_io`-pattern interaction between `*this` and the user's event loop; required before
        -
        150 * send_native_handle(), async_end_sending(), end_sending(), auto_ping() will work (as opposed to no-op/return
        -
        151 * `false`).
        -
        152 *
        -
        153 * `ev_wait_func()` -- with signature matching util::sync_io::Event_wait_func -- is a key function memorized
        -
        154 * by `*this`. It shall be invoked by `*this` operations when some op cannot complete synchronously and requires
        -
        155 * a certain event (readable/writable) to be active on a certain native-handle.
        -
        156 *
        -
        157 * @see util::sync_io::Event_wait_func doc header for useful and complete instructions on how to write an
        -
        158 * `ev_wait_func()` properly. Doing so correctly is the crux of using the `sync_io` pattern.
        -
        159 *
        -
        160 * This is a standard `sync_io`-pattern API per util::sync_io doc header.
        -
        161 *
        -
        162 * @tparam Event_wait_func_t
        -
        163 * Function type matching util::sync_io::Event_wait_func.
        -
        164 * @param ev_wait_func
        -
        165 * See above.
        -
        166 * @return `false` if this (or equivalent) has already been invoked; no-op logging aside. `true` otherwise.
        -
        167 */
        -
        168 template<typename Event_wait_func_t>
        -
        169 bool start_send_native_handle_ops(Event_wait_func_t&& ev_wait_func);
        -
        170
        -
        171 // General API (mirrors transport:: counterpart).
        -
        172
        -
        173 /**
        -
        174 * Same notes as for transport::Native_handle_sender.
        -
        175 * @return See above.
        -
        176 */
        - -
        178
        -
        179 /**
        -
        180 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order, to the opposing peer;
        -
        181 * the message consists of the provided native handle (if supplied); or the provided binary blob (if supplied);
        -
        182 * or both (if both supplied). The opposing peer's paired sync_io::Native_handle_receiver or
        -
        183 * transport::Native_handle_receiver shall receive it reliably and in-order via `async_receive_native_handle()`.
        -
        184 *
        -
        185 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        -
        186 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        -
        187 * registered via start_send_native_handle_ops() by the user of `*this`.
        -
        188 *
        -
        189 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        -
        190 * instead and otherwise no-ops (logging aside).
        -
        191 *
        -
        192 * Providing neither a handle nor a blob results in undefined behavior (assertion may trip).
        -
        193 * To *not* supply a handle, provide object with `.null() == true`. To *not* supply a blob, provide
        -
        194 * a buffer with `.size() == 0`.
        -
        195 *
        -
        196 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
        -
        197 * Same notes as for transport::Native_handle_sender.
        -
        198 *
        -
        199 * ### Error semantics ###
        -
        200 * Same notes as for transport::Native_handle_sender.
        -
        201 *
        -
        202 * ### Thread safety ###
        -
        203 * You may call this from any thread. It is *not* required to be safe to call concurrently with
        -
        204 * any Native_handle_sender API, including this one and the destructor, invoked on `*this`.
        -
        205 *
        -
        206 * @param hndl_or_null
        -
        207 * Same notes as for transport::Native_handle_sender.
        -
        208 * @param meta_blob
        -
        209 * Same notes as for transport::Native_handle_sender.
        -
        210 * @param err_code
        -
        211 * See above.
        -
        212 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        -
        213 * start_send_native_handle_ops() has not been called successfully.
        -
        214 */
        -
        215 bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const& meta_blob, Error_code* err_code = 0);
        -
        216
        -
        217 /**
        -
        218 * Equivalent to send_native_handle() but sends a graceful-close message instead of the usual payload; the opposing
        -
        219 * peer's paired sync_io::Native_handle_receiver or transport::Native_handle_receiver shall receive it reliably
        -
        220 * and in-order via `async_receive_native_handle()` in the form of
        -
        221 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE. If invoked after already invoking
        -
        222 * `*end_sending()`, the method shall no-op and return `false` and neither an exception nor truthy
        -
        223 * `*err_code`. Otherwise it shall return `true` -- but potentially emit a truthy #Error_code (if an error is
        -
        224 * detected).
        -
        225 *
        -
        226 * Informally one should think of async_end_sending() as just another message, which is queued after
        -
        227 * preceding ones; but: it is the *last* message to be queued by definition. It's like an EOF or a TCP-FIN.
        -
        228 *
        -
        229 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        -
        230 * in 1+ active-event (readable, writable) state, this method shall later invoke the `Event_wait_func`
        -
        231 * registered via start_send_native_handle_ops() by the user of `*this`; and the error code
        -
        232 * error::Code::S_SYNC_IO_WOULD_BLOCK shall be emitted here synchronously (via `*sync_err_code` if not null,
        -
        233 * exception if null -- per standard `flow::Error_code`-doc-header semantics). Meanwhile the completion handler
        -
        234 * `on_done_func()` shall execute once the required async-waits have been satisfied
        -
        235 * by the `*this` user, synchronously from inside the `(*on_active_ev_func)()` call that achieves this state.
        -
        236 *
        -
        237 * If, by contrast, no more work is required -- the operation completed synchronously within this method -- then:
        -
        238 * success or error *other than* error::code::S_SYNC_IO_WOULD_BLOB shall be emitted (again per standard
        -
        239 * semantics) synchronously, and `on_done_func()` shall not be saved nor ever executed by `*this`.
        -
        240 * Thus the result of the operation shall be either output directly synchronously -- if op completed synchronously --
        -
        241 * or later via `on_done_func()` completion handler.
        -
        242 *
        -
        243 * Informally:
        -
        244 * - emission of *not* `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_write()` *not* returning
        -
        245 * `SSL_ERROR_WANT_*`. The operation completed.
        -
        246 * - emission of `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_write()` returning
        -
        247 * `SSL_ERROR_WANT_*`. The operation requires an underlying transport to reach a certain readable/writable
        -
        248 * state before `SSL_write()` can complete.
        -
        249 *
        -
        250 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
        -
        251 * `false` immediately instead and otherwise no-ops (logging aside).
        -
        252 *
        -
        253 * ### Error semantics ###
        -
        254 * Same notes as for transport::Native_handle_sender. Exception: error may be emitted synchronously.
        -
        255 * Exception: error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER shall not be emitted.
        -
        256 *
        -
        257 * ### Thread safety ###
        -
        258 * The notes for send_native_handle() apply.
        -
        259 *
        -
        260 * @internal
        -
        261 * The semantic re. calling `*end_sending()` after already having called it and having that exclusively
        -
        262 * return `false` and do nothing was a judgment call. As of this writing there's a long-ish comment at the top of
        -
        263 * of `"sync_io::Native_socket_stream::Impl::*end_sending()"`" body discussing why I (ygoldfel) went that way.
        -
        264 * @endinternal
        -
        265 *
        -
        266 * @tparam Task_err
        -
        267 * Same notes as for transport::Native_handle_sender.
        -
        268 * @param sync_err_code
        -
        269 * See above.
        -
        270 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        -
        271 * would-block *will* make this throw.
        -
        272 * @param on_done_func
        -
        273 * Same notes as for transport::Native_handle_sender. Plus see above.
        -
        274 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        -
        275 * start_send_native_handle_ops() has not been called successfully.
        -
        276 */
        -
        277 template<typename Task_err>
        -
        278 bool async_end_sending(Error_code* sync_err_code, Task_err&& on_done_func);
        -
        279
        -
        280 /**
        -
        281 * Equivalent to `async_end_sending(&E, F)` wherein `F()` does nothing, and `E` is some `Error_code` "sink"
        -
        282 * ignored by the caller.
        -
        283 *
        -
        284 * Informally: ...Same notes as for transport::Native_handle_sender.
        -
        285 *
        -
        286 * @return Same as in async_end_sending().
        -
        287 */
        - -
        289
        -
        290 /**
        -
        291 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
        -
        292 * are ignored except that they reset any idle timer as enabled via sync_io::Native_handle_receiver::idle_timer_run()
        -
        293 * or transport::Native_handle_receiver::idle_timer_run() (or similar). As to the behavior of auto-pings:
        -
        294 * Same notes as for transport::Native_handle_sender.
        -
        295 *
        -
        296 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        -
        297 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        -
        298 * registered via start_send_native_handle_ops() by the user of `*this`.
        -
        299 * - In *this* case the events waited-on are likely to be the periodic firing of an internal auto-ping timer.
        -
        300 * Therefore the correct auto-pinging behavior shall occur if and only if the user heeds the `sync_io` pattern:
        -
        301 * async-wait when requested, report resulting events when they occur.
        -
        302 *
        -
        303 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        -
        304 * instead and otherwise no-ops (logging aside). If auto_ping() has already been called successfuly,
        -
        305 * subsequently it will return `false` and no-op (logging aside). If `*end_sending()` has been called succesfully,
        -
        306 * auto_ping() will return `false` and no-op (logging side).
        -
        307 *
        -
        308 * ### Behavior past `*end_sending()` ###
        -
        309 * Same notes as for transport::Native_handle_sender.
        -
        310 *
        -
        311 * ### Thread safety ###
        -
        312 * The notes for send_native_handle() apply.
        -
        313 *
        -
        314 * @param period
        -
        315 * Same notes as for transport::Native_handle_sender.
        -
        316 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        -
        317 * start_send_native_handle_ops() has not been called successfully.
        -
        318 */
        -
        319 bool auto_ping(util::Fine_duration period = default_value);
        -
        320}; // class Native_handle_sender
        -
        321
        -
        322/**
        -
        323 * A documentation-only *concept* defining the behavior of an object that is the `sync_io`-pattern counterpart
        -
        324 * of the async-I/O-pattern-following concept of the same name in our parent namespace:
        -
        325 * transport::Native_handle_receiver. This is paired with the sync_io::Native_handle_sender concept which defines
        -
        326 * sending of such messages.
        -
        327 *
        -
        328 * ### Concept contents ###
        -
        329 * The concept defines the behaviors/requirements mirroring those of sync_io::Native_handle_sender.
        -
        330 * Notes from that doc header apply similarly; except that among the `sync_io`-specific method names replace
        -
        331 * `send_native_handle` fragment of method names with `receive_native_handle`.
        -
        332 *
        -
        333 * @note The "Thread safety" section most definitely applies. You should read it.
        -
        334 *
        -
        335 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
        -
        336 * sync_io::Native_handle_sender) -- using the Unix domain socket transport.
        -
        337 */
        - -
        339{
        -
        340public:
        -
        341 // Constants.
        -
        342
        -
        343 /// Same notes as for transport::Native_handle_receiver.
        - -
        345
        -
        346 /// Same notes as for transport::Native_handle_receiver.
        -
        347 static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED = value;
        -
        348
        -
        349 // Constructors/destructor.
        -
        350
        -
        351 /**
        -
        352 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        -
        353 * Same notes as for transport::Native_handle_receiver.
        -
        354 */
        - -
        356
        -
        357 /**
        -
        358 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        -
        359 * Same notes as for transport::Native_handle_receiver.
        -
        360 *
        -
        361 * @param src
        -
        362 * Same notes as for transport::Native_handle_receiver.
        -
        363 */
        - -
        365
        -
        366 /// Disallow copying.
        - -
        368
        -
        369 /**
        -
        370 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        -
        371 * still active) and return resources to OS as applicable.
        -
        372 */
        - -
        374
        -
        375 // Methods.
        -
        376
        -
        377 /**
        -
        378 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        -
        379 * No-op if `&src == this`. Same notes as for transport::Native_handle_receiver.
        -
        380 *
        -
        381 * @param src
        -
        382 * Same notes as for transport::Native_handle_receiver.
        -
        383 * @return `*this`.
        -
        384 */
        - -
        386
        -
        387 /// Disallow copying.
        - -
        389
        -
        390 // `sync_io`-pattern API.
        -
        391
        -
        392 /**
        -
        393 * Coincides with sync_io::Native_handle_sender concept counterpart.
        -
        394 *
        -
        395 * @tparam Create_ev_wait_hndl_func
        -
        396 * See above.
        -
        397 * @param create_ev_wait_hndl_func
        -
        398 * See above.
        -
        399 * @return See above.
        -
        400 */
        -
        401 template<typename Create_ev_wait_hndl_func>
        -
        402 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        -
        403
        -
        404 /**
        -
        405 * Sets up the `sync_io`-pattern interaction between `*this` and the user's event loop; required before
        -
        406 * async_receive_native_handle(), idle_timer_run() will work (as opposed to no-op/return
        -
        407 * `false`).
        -
        408 *
        -
        409 * Otherwise the notes for sync_io::Native_handle_receiver::start_send_native_handle_ops() apply equally.
        -
        410 *
        -
        411 * @tparam Event_wait_func_t
        -
        412 * See above.
        -
        413 * @param ev_wait_func
        -
        414 * See above.
        -
        415 * @return See above.
        -
        416 */
        -
        417 template<typename Event_wait_func_t>
        -
        418 bool start_receive_native_handle_ops(Event_wait_func_t&& ev_wait_func);
        -
        419
        -
        420 // General API (mirrors transport:: counterpart).
        -
        421
        -
        422 /**
        -
        423 * Mirrors sync_io::Native_handle_sender::send_meta_blob_max_size().
        -
        424 * @return See above.
        -
        425 */
        - -
        427
        -
        428 /**
        -
        429 * In PEER state: Possibly-asynchronously awaits one discrete message -- as sent by the opposing peer via
        -
        430 * Native_handle_sender::send_native_handle() or `"Native_handle_sender::*end_sending()"` -- and
        -
        431 * receives it into the given target locations, reliably and in-order. The message is, therefore, one of the
        -
        432 * following:
        -
        433 * - A binary blob; a native handle; or both. This is indicated by `on_done_func(Error_code(), N)` or
        -
        434 * the equivalent synchronous out-args (see below on that topic).
        -
        435 * The falsy code indicates success; `N <= target_meta_blob.size()` indicates the number of bytes received into
        -
        436 * `target_meta_blob.data()` (zero means no blob was sent in the message). `*target_hndl` is set
        -
        437 * (`target_hndl->null() == true` means no handle was sent in the message).
        -
        438 * - Graceful-close. This is indicated by `on_done_func(error::code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, 0)` or
        -
        439 * the equivalent synchronous out-args (see below on that topic).
        -
        440 * Neither the target blob nor target native handle are touched.
        -
        441 *
        -
        442 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        -
        443 * in 1+ active-event (readable, writable) state, this method shall later invoke the `Event_wait_func`
        -
        444 * registered via start_receive_native_handle_ops() by the user of `*this`; and the error code
        -
        445 * error::Code::S_SYNC_IO_WOULD_BLOCK shall be emitted here synchronously (via `*sync_err_code` if not null,
        -
        446 * exception if null -- per standard `flow::Error_code`-doc-header semantics). Meanwhile the completion handler
        -
        447 * `on_done_func()` shall execute once the required async-waits have been satisfied
        -
        448 * by the `*this` user, synchronously from inside the `(*on_active_ev_func)()` call that achieves this state.
        -
        449 *
        -
        450 * If, by contrast, no more work is required -- the operation completed synchronously within this method -- then:
        -
        451 * success or error *other than* error::code::S_SYNC_IO_WOULD_BLOB shall be emitted (again per standard
        -
        452 * semantics) synchronously; `*sync_sz` is set to 0 or bytes-transmitted, and `on_done_func()` shall not be
        -
        453 * saved nor ever executed by `*this`. Thus the result of the operation shall be either output directly
        -
        454 * synchronously -- if op completed synchronously -- or later via `on_done_func()` completion handler.
        -
        455 *
        -
        456 * Informally:
        -
        457 * - emission of *not* `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_read()` *not* returning
        -
        458 * `SSL_ERROR_WANT_*`. The operation completed.
        -
        459 * - emission of `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_read()` returning
        -
        460 * `SSL_ERROR_WANT_*`. The operation requires an underlying transport to reach a certain readable/writable
        -
        461 * state before `SSL_read()` can complete.
        -
        462 *
        -
        463 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
        -
        464 * `false` immediately instead and otherwise no-ops (logging aside). Same if the preceding `async_receive_*()`
        -
        465 * to have returned `true` has not yet executed its completion handler or synchronously completed.
        -
        466 *
        -
        467 * ### Error semantics ###
        -
        468 * Same notes as for transport::Native_handle_receiver. Exception: error may be emitted synchronously.
        -
        469 * Exception: error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER shall not be emitted.
        -
        470 *
        -
        471 * @tparam Task_err_sz
        -
        472 * A functor type with signature identical to `flow::async::Task_asio_err_sz`.
        -
        473 * @param target_hndl
        -
        474 * `*target_hndl` shall be set before `on_done_func()` is executed with a falsy code.
        -
        475 * @param target_meta_blob
        -
        476 * `target_meta_blob.data()...` shall be written to before `on_done_func()` is executed with a falsy
        -
        477 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
        -
        478 * `target_meta_blob.size()`. See "Error semantics" (there is an `Error_code` regarding
        -
        479 * overflowing the user's memory area).
        -
        480 * @param sync_err_code
        -
        481 * See above.
        -
        482 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        -
        483 * would-block *will* make this throw.
        -
        484 * @param sync_sz
        -
        485 * See above. If null behavior undefined (assertion may trip).
        -
        486 * @param on_done_func
        -
        487 * See above.
        -
        488 * @return Same notes as for transport::Native_handle_receiver. In addition: return `false` if
        -
        489 * start_receive_native_handle_ops() has not been called successfully, or if the preceding
        -
        490 * async-receive has not completed (completion handler has not executed).
        -
        491 */
        -
        492 template<typename Task_err_sz>
        - -
        494 Error_code* sync_err_code, size_t sync_sz,
        -
        495 const util::Blob_mutable& target_meta_blob,
        -
        496 Task_err_sz&& on_done_func);
        -
        497
        -
        498 /**
        -
        499 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
        -
        500 * the specified time has passed since the last received low-level traffic (or this call, whichever most
        -
        501 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT. The implementation
        -
        502 * shall guarantee the observer idle timeout is at least the provided value but may exceed this value for
        -
        503 * internal reasons, as long as it's by a less than human-perceptible period (roughly speaking -- milliseconds,
        -
        504 * not seconds).
        -
        505 *
        -
        506 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        -
        507 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        -
        508 * registered via start_send_native_handle_ops() by the user of `*this`.
        -
        509 * - In *this* case the events waited-on are likely to be at most 1 (per PEER state) firing of an internal
        -
        510 * idle timer.
        -
        511 * - Indeed if that does occur, the `(*on_active_ev_func)()` call (by the `*this` user) that reported
        -
        512 * the timer firing shall also act as-if the currently pending async_receive_native_handle() (if any)
        -
        513 * encountered the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
        -
        514 * - No special code is necessary on the user's part to handle this: it will look like the
        -
        515 * async_receive_native_handle() failing with a pipe-hosing error; which any proper
        -
        516 * `on_done_func()` must handle anyway.
        -
        517 *
        -
        518 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        -
        519 * instead and otherwise no-ops (logging aside). If idle_timer_run() has already been called successfuly,
        -
        520 * subsequently it will return `false` and no-op (logging aside).
        -
        521 *
        -
        522 * ### Important: Relationship between idle_timer_run() and async_receive_native_handle() ###
        -
        523 * Notes for transport::Native_handle_receiver apply. In short: if you use idle_timer_run(), then you'd best
        -
        524 * have an async_receive_native_handle() outstanding at ~all times.
        -
        525 *
        -
        526 * ### Error semantics ###
        -
        527 * If and only if the timeout does occur down the line, the aforementioned error will be emitted via
        -
        528 * async_receive_native_handle() (or similar) handler. It shall be treated as the reason to hose the pipe
        -
        529 * (assuming it was not hosed by something else earlier).
        -
        530 *
        -
        531 * ### Suggested use ###
        -
        532 * Notes for transport::Native_handle_receiver apply.
        -
        533 *
        -
        534 * @param timeout
        -
        535 * Notes for transport::Native_handle_receiver apply.
        -
        536 * @return Same notes as for transport::Native_handle_receiver. In addition: return `false` if
        -
        537 * start_receive_native_handle_ops() has not been called successfully.
        -
        538 */
        -
        539 bool idle_timer_run(util::Fine_duration timeout = default_value);
        -
        540}; // class Native_handle_receiver
        -
        541
        -
        542} // namespace ipc::transport::sync_io
        -
        A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
        +
        22static_assert(false, "As of this writing this is a documentation-only \"header\" "
        +
        23 "(the \"source\" is for humans and Doxygen only).");
        +
        24#else // ifdef IPC_DOXYGEN_ONLY
        +
        25
        + +
        27{
        +
        28
        +
        29// Types.
        +
        30
        +
        31/**
        +
        32 * A documentation-only *concept* defining the behavior of an object that is the `sync_io`-pattern counterpart
        +
        33 * of the async-I/O-pattern-following concept of the same name in our parent namespace: transport::Native_handle_sender.
        +
        34 * This is paired with the sync_io::Native_handle_receiver concept which defines reception of such messages.
        +
        35 *
        +
        36 * @see transport::Native_handle_sender -- our async-I/O counterpart.
        +
        37 * @see util::sync_io doc header -- describes the general `sync_io` pattern we are following here.
        +
        38 *
        +
        39 * ### Concept contents ###
        +
        40 * The concept defines the following behaviors/requirements.
        +
        41 * - The object has at least 2 states: Same notes as for transport::Native_handle_sender.
        +
        42 * - The (outgoing) transmission-of-messages methods, including transmission of graceful-close message.
        +
        43 * See their doc headers. Same signatures as transport::Native_handle_sender methods but acting per
        +
        44 * `sync_io` pattern (synchronously).
        +
        45 * - Behavior when the destructor is invoked. See its doc header.
        +
        46 * - All ctors and move assignment: Same notes as for transport::Native_handle_sender. Exception: no
        +
        47 * `sync_io`-core-adopting ctor (since we *are* that core).
        +
        48 * - `sync_io`-pattern setup methods: replace_event_wait_handles(), start_send_native_handle_ops().
        +
        49 *
        +
        50 * The concept (intentionally) does *not* define the following behaviors:
        +
        51 * - How to create a Native_handle_sender, except the default and move ctors.
        +
        52 * Same notes as for transport::Native_handle_sender.
        +
        53 *
        +
        54 * @see sync_io::Native_socket_stream: as of this writing one key class that implements this concept (and also
        +
        55 * sync_io::Native_handle_receiver) -- using the Unix domain socket transport.
        +
        56 *
        +
        57 * ### Thread safety ###
        +
        58 * For a given `*this`, it is not required to be safe for a non-`const` operation to be invoked concurrently with
        +
        59 * another operation. That's typical. *In addition* -- and this is significant -- the following operation shall
        +
        60 * count as a "non-`const` operation" (as opposed to the usual definition which is simply non-`const` methods and
        +
        61 * related free functions):
        +
        62 * - `(*on_active_ev_func)()`, where `on_active_ev_func` is the so-named argument passed into an invocation of
        +
        63 * the `Event_wait_func` the user registers via start_send_native_handle_ops().
        +
        64 *
        +
        65 * Therefore: If you report an active event to `*this` (per `sync_io` pattern) from thread 1, and possibly
        +
        66 * call methods such as `send_native_handle()` from thread 2, then you must use a mutex (or strand or ...)
        +
        67 * to prevent concurrent execution. For example: transport::Native_socket_stream, which internally operates
        +
        68 * a sync_io::Native_socket_stream, uses a send-ops mutex (`transport::Native_socket_stream::Impl::m_snd_mutex`).
        +
        69 *
        +
        70 * ### Rationale: Why is send_native_handle() not asynchronous? ###
        +
        71 * Same notes as for transport::Native_handle_sender.
        +
        72 */
        + +
        74{
        +
        75public:
        +
        76 // Constants.
        +
        77
        +
        78 /// Same notes as for transport::Native_handle_sender.
        + +
        80
        +
        81 // Constructors/destructor.
        +
        82
        +
        83 /**
        +
        84 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        +
        85 * Same notes as for transport::Native_handle_sender.
        +
        86 */
        + +
        88
        +
        89 /**
        +
        90 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        +
        91 * Same notes as for transport::Native_handle_sender.
        +
        92 *
        +
        93 * @param src
        +
        94 * Same notes as for transport::Native_handle_sender.
        +
        95 */
        + +
        97
        +
        98 /// Disallow copying.
        + +
        100
        +
        101 /**
        +
        102 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        +
        103 * still active) and return resources to OS as applicable.
        +
        104 */
        + +
        106
        +
        107 // Methods.
        +
        108
        +
        109 /**
        +
        110 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        +
        111 * No-op if `&src == this`. Same notes as for transport::Native_handle_sender.
        +
        112 *
        +
        113 * @param src
        +
        114 * Same notes as for transport::Native_handle_sender.
        +
        115 * @return `*this`.
        +
        116 */
        + +
        118
        +
        119 /// Disallow copying.
        + +
        121
        +
        122 // `sync_io`-pattern API.
        +
        123
        +
        124 /**
        +
        125 * To be (optionally) invoked before any `start_*_ops()`, supplies a factory for the
        +
        126 * util::sync_io::Asio_waitable_native_handle objects pointers to which shall be subsequently passed into
        +
        127 * any `Event_wait_func` (as registered via `start_*_ops()`), when `*this` requires an async-wait on
        +
        128 * a particular native-handle. This is useful if the user event loop is built on boost.asio: the supplied factory
        +
        129 * function can associate the handle-object with the user's `Task_engine` (or strand or ...); hence
        +
        130 * when an async-wait is requested, the user can simply `hndl_of_interest->async_wait(..., F)`; `F()` will
        +
        131 * be invoked directly within the user's event loop.
        +
        132 *
        +
        133 * (By contrast: if the user means to merely `poll(fd)` or `epoll_wait(fd)`, then they would simply do:
        +
        134 * `auto fd = hndl_of_interest->native_handle().m_native_handle`. In this case the associated execution
        +
        135 * context/executor of `*hndl_of_interest` is of zero import.)
        +
        136 *
        +
        137 * This is a standard `sync_io`-pattern API per util::sync_io doc header.
        +
        138 *
        +
        139 * @tparam Create_ev_wait_hndl_func
        +
        140 * Function type matching signature `util::sync_io::Asio_waitable_native_handle F()`.
        +
        141 * @param create_ev_wait_hndl_func
        +
        142 * See above. Must return object `X` such that `X.is_open() == false` (i.e., storing no native handle/FD).
        +
        143 * @return `false` -- indicating no-op, logging aside -- if and only if `start_*_ops()` has been called already.
        +
        144 * `true` indicating success. Note that this method should succeed even in NULL state.
        +
        145 */
        +
        146 template<typename Create_ev_wait_hndl_func>
        +
        147 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        +
        148
        +
        149 /**
        +
        150 * Sets up the `sync_io`-pattern interaction between `*this` and the user's event loop; required before
        +
        151 * send_native_handle(), async_end_sending(), end_sending(), auto_ping() will work (as opposed to no-op/return
        +
        152 * `false`).
        +
        153 *
        +
        154 * `ev_wait_func()` -- with signature matching util::sync_io::Event_wait_func -- is a key function memorized
        +
        155 * by `*this`. It shall be invoked by `*this` operations when some op cannot complete synchronously and requires
        +
        156 * a certain event (readable/writable) to be active on a certain native-handle.
        +
        157 *
        +
        158 * @see util::sync_io::Event_wait_func doc header for useful and complete instructions on how to write an
        +
        159 * `ev_wait_func()` properly. Doing so correctly is the crux of using the `sync_io` pattern.
        +
        160 *
        +
        161 * This is a standard `sync_io`-pattern API per util::sync_io doc header.
        +
        162 *
        +
        163 * @tparam Event_wait_func_t
        +
        164 * Function type matching util::sync_io::Event_wait_func.
        +
        165 * @param ev_wait_func
        +
        166 * See above.
        +
        167 * @return `false` if this (or equivalent) has already been invoked; no-op logging aside. `true` otherwise.
        +
        168 */
        +
        169 template<typename Event_wait_func_t>
        +
        170 bool start_send_native_handle_ops(Event_wait_func_t&& ev_wait_func);
        +
        171
        +
        172 // General API (mirrors transport:: counterpart).
        +
        173
        +
        174 /**
        +
        175 * Same notes as for transport::Native_handle_sender.
        +
        176 * @return See above.
        +
        177 */
        + +
        179
        +
        180 /**
        +
        181 * In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order, to the opposing peer;
        +
        182 * the message consists of the provided native handle (if supplied); or the provided binary blob (if supplied);
        +
        183 * or both (if both supplied). The opposing peer's paired sync_io::Native_handle_receiver or
        +
        184 * transport::Native_handle_receiver shall receive it reliably and in-order via `async_receive_native_handle()`.
        +
        185 *
        +
        186 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        +
        187 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        +
        188 * registered via start_send_native_handle_ops() by the user of `*this`.
        +
        189 *
        +
        190 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        +
        191 * instead and otherwise no-ops (logging aside).
        +
        192 *
        +
        193 * Providing neither a handle nor a blob results in undefined behavior (assertion may trip).
        +
        194 * To *not* supply a handle, provide object with `.null() == true`. To *not* supply a blob, provide
        +
        195 * a buffer with `.size() == 0`.
        +
        196 *
        +
        197 * ### Blob copying behavior; synchronicity/blockingness guarantees ###
        +
        198 * Same notes as for transport::Native_handle_sender.
        +
        199 *
        +
        200 * ### Error semantics ###
        +
        201 * Same notes as for transport::Native_handle_sender.
        +
        202 *
        +
        203 * ### Thread safety ###
        +
        204 * You may call this from any thread. It is *not* required to be safe to call concurrently with
        +
        205 * any Native_handle_sender API, including this one and the destructor, invoked on `*this`.
        +
        206 *
        +
        207 * @param hndl_or_null
        +
        208 * Same notes as for transport::Native_handle_sender.
        +
        209 * @param meta_blob
        +
        210 * Same notes as for transport::Native_handle_sender.
        +
        211 * @param err_code
        +
        212 * See above.
        +
        213 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        +
        214 * start_send_native_handle_ops() has not been called successfully.
        +
        215 */
        +
        216 bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const& meta_blob, Error_code* err_code = 0);
        +
        217
        +
        218 /**
        +
        219 * Equivalent to send_native_handle() but sends a graceful-close message instead of the usual payload; the opposing
        +
        220 * peer's paired sync_io::Native_handle_receiver or transport::Native_handle_receiver shall receive it reliably
        +
        221 * and in-order via `async_receive_native_handle()` in the form of
        +
        222 * #Error_code = error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE. If invoked after already invoking
        +
        223 * `*end_sending()`, the method shall no-op and return `false` and neither an exception nor truthy
        +
        224 * `*err_code`. Otherwise it shall return `true` -- but potentially emit a truthy #Error_code (if an error is
        +
        225 * detected).
        +
        226 *
        +
        227 * Informally one should think of async_end_sending() as just another message, which is queued after
        +
        228 * preceding ones; but: it is the *last* message to be queued by definition. It's like an EOF or a TCP-FIN.
        +
        229 *
        +
        230 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        +
        231 * in 1+ active-event (readable, writable) state, this method shall later invoke the `Event_wait_func`
        +
        232 * registered via start_send_native_handle_ops() by the user of `*this`; and the error code
        +
        233 * error::Code::S_SYNC_IO_WOULD_BLOCK shall be emitted here synchronously (via `*sync_err_code` if not null,
        +
        234 * exception if null -- per standard `flow::Error_code`-doc-header semantics). Meanwhile the completion handler
        +
        235 * `on_done_func()` shall execute once the required async-waits have been satisfied
        +
        236 * by the `*this` user, synchronously from inside the `(*on_active_ev_func)()` call that achieves this state.
        +
        237 *
        +
        238 * If, by contrast, no more work is required -- the operation completed synchronously within this method -- then:
        +
        239 * success or error *other than* error::code::S_SYNC_IO_WOULD_BLOB shall be emitted (again per standard
        +
        240 * semantics) synchronously, and `on_done_func()` shall not be saved nor ever executed by `*this`.
        +
        241 * Thus the result of the operation shall be either output directly synchronously -- if op completed synchronously --
        +
        242 * or later via `on_done_func()` completion handler.
        +
        243 *
        +
        244 * Informally:
        +
        245 * - emission of *not* `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_write()` *not* returning
        +
        246 * `SSL_ERROR_WANT_*`. The operation completed.
        +
        247 * - emission of `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_write()` returning
        +
        248 * `SSL_ERROR_WANT_*`. The operation requires an underlying transport to reach a certain readable/writable
        +
        249 * state before `SSL_write()` can complete.
        +
        250 *
        +
        251 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
        +
        252 * `false` immediately instead and otherwise no-ops (logging aside).
        +
        253 *
        +
        254 * ### Error semantics ###
        +
        255 * Same notes as for transport::Native_handle_sender. Exception: error may be emitted synchronously.
        +
        256 * Exception: error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER shall not be emitted.
        +
        257 *
        +
        258 * ### Thread safety ###
        +
        259 * The notes for send_native_handle() apply.
        +
        260 *
        +
        261 * @internal
        +
        262 * The semantic re. calling `*end_sending()` after already having called it and having that exclusively
        +
        263 * return `false` and do nothing was a judgment call. As of this writing there's a long-ish comment at the top of
        +
        264 * of `"sync_io::Native_socket_stream::Impl::*end_sending()"`" body discussing why I (ygoldfel) went that way.
        +
        265 * @endinternal
        +
        266 *
        +
        267 * @tparam Task_err
        +
        268 * Same notes as for transport::Native_handle_sender.
        +
        269 * @param sync_err_code
        +
        270 * See above.
        +
        271 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        +
        272 * would-block *will* make this throw.
        +
        273 * @param on_done_func
        +
        274 * Same notes as for transport::Native_handle_sender. Plus see above.
        +
        275 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        +
        276 * start_send_native_handle_ops() has not been called successfully.
        +
        277 */
        +
        278 template<typename Task_err>
        +
        279 bool async_end_sending(Error_code* sync_err_code, Task_err&& on_done_func);
        +
        280
        +
        281 /**
        +
        282 * Equivalent to `async_end_sending(&E, F)` wherein `F()` does nothing, and `E` is some `Error_code` "sink"
        +
        283 * ignored by the caller.
        +
        284 *
        +
        285 * Informally: ...Same notes as for transport::Native_handle_sender.
        +
        286 *
        +
        287 * @return Same as in async_end_sending().
        +
        288 */
        + +
        290
        +
        291 /**
        +
        292 * In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level messages that
        +
        293 * are ignored except that they reset any idle timer as enabled via sync_io::Native_handle_receiver::idle_timer_run()
        +
        294 * or transport::Native_handle_receiver::idle_timer_run() (or similar). As to the behavior of auto-pings:
        +
        295 * Same notes as for transport::Native_handle_sender.
        +
        296 *
        +
        297 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        +
        298 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        +
        299 * registered via start_send_native_handle_ops() by the user of `*this`.
        +
        300 * - In *this* case the events waited-on are likely to be the periodic firing of an internal auto-ping timer.
        +
        301 * Therefore the correct auto-pinging behavior shall occur if and only if the user heeds the `sync_io` pattern:
        +
        302 * async-wait when requested, report resulting events when they occur.
        +
        303 *
        +
        304 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        +
        305 * instead and otherwise no-ops (logging aside). If auto_ping() has already been called successfuly,
        +
        306 * subsequently it will return `false` and no-op (logging aside). If `*end_sending()` has been called succesfully,
        +
        307 * auto_ping() will return `false` and no-op (logging side).
        +
        308 *
        +
        309 * ### Behavior past `*end_sending()` ###
        +
        310 * Same notes as for transport::Native_handle_sender.
        +
        311 *
        +
        312 * ### Thread safety ###
        +
        313 * The notes for send_native_handle() apply.
        +
        314 *
        +
        315 * @param period
        +
        316 * Same notes as for transport::Native_handle_sender.
        +
        317 * @return Same notes as for transport::Native_handle_sender. In addition: return `false` if
        +
        318 * start_send_native_handle_ops() has not been called successfully.
        +
        319 */
        +
        320 bool auto_ping(util::Fine_duration period = default_value);
        +
        321}; // class Native_handle_sender
        +
        322
        +
        323/**
        +
        324 * A documentation-only *concept* defining the behavior of an object that is the `sync_io`-pattern counterpart
        +
        325 * of the async-I/O-pattern-following concept of the same name in our parent namespace:
        +
        326 * transport::Native_handle_receiver. This is paired with the sync_io::Native_handle_sender concept which defines
        +
        327 * sending of such messages.
        +
        328 *
        +
        329 * ### Concept contents ###
        +
        330 * The concept defines the behaviors/requirements mirroring those of sync_io::Native_handle_sender.
        +
        331 * Notes from that doc header apply similarly; except that among the `sync_io`-specific method names replace
        +
        332 * `send_native_handle` fragment of method names with `receive_native_handle`.
        +
        333 *
        +
        334 * @note The "Thread safety" section most definitely applies. You should read it.
        +
        335 *
        +
        336 * @see Native_socket_stream: as of this writing one key class that implements this concept (and also
        +
        337 * sync_io::Native_handle_sender) -- using the Unix domain socket transport.
        +
        338 */
        + +
        340{
        +
        341public:
        +
        342 // Constants.
        +
        343
        +
        344 /// Same notes as for transport::Native_handle_receiver.
        + +
        346
        +
        347 /// Same notes as for transport::Native_handle_receiver.
        +
        348 static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED = value;
        +
        349
        +
        350 // Constructors/destructor.
        +
        351
        +
        352 /**
        +
        353 * Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        +
        354 * Same notes as for transport::Native_handle_receiver.
        +
        355 */
        + +
        357
        +
        358 /**
        +
        359 * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in NULL state).
        +
        360 * Same notes as for transport::Native_handle_receiver.
        +
        361 *
        +
        362 * @param src
        +
        363 * Same notes as for transport::Native_handle_receiver.
        +
        364 */
        + +
        366
        +
        367 /// Disallow copying.
        + +
        369
        +
        370 /**
        +
        371 * Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state, and if it's
        +
        372 * still active) and return resources to OS as applicable.
        +
        373 */
        + +
        375
        +
        376 // Methods.
        +
        377
        +
        378 /**
        +
        379 * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in NULL state).
        +
        380 * No-op if `&src == this`. Same notes as for transport::Native_handle_receiver.
        +
        381 *
        +
        382 * @param src
        +
        383 * Same notes as for transport::Native_handle_receiver.
        +
        384 * @return `*this`.
        +
        385 */
        + +
        387
        +
        388 /// Disallow copying.
        + +
        390
        +
        391 // `sync_io`-pattern API.
        +
        392
        +
        393 /**
        +
        394 * Coincides with sync_io::Native_handle_sender concept counterpart.
        +
        395 *
        +
        396 * @tparam Create_ev_wait_hndl_func
        +
        397 * See above.
        +
        398 * @param create_ev_wait_hndl_func
        +
        399 * See above.
        +
        400 * @return See above.
        +
        401 */
        +
        402 template<typename Create_ev_wait_hndl_func>
        +
        403 bool replace_event_wait_handles(const Create_ev_wait_hndl_func& create_ev_wait_hndl_func);
        +
        404
        +
        405 /**
        +
        406 * Sets up the `sync_io`-pattern interaction between `*this` and the user's event loop; required before
        +
        407 * async_receive_native_handle(), idle_timer_run() will work (as opposed to no-op/return
        +
        408 * `false`).
        +
        409 *
        +
        410 * Otherwise the notes for sync_io::Native_handle_receiver::start_send_native_handle_ops() apply equally.
        +
        411 *
        +
        412 * @tparam Event_wait_func_t
        +
        413 * See above.
        +
        414 * @param ev_wait_func
        +
        415 * See above.
        +
        416 * @return See above.
        +
        417 */
        +
        418 template<typename Event_wait_func_t>
        +
        419 bool start_receive_native_handle_ops(Event_wait_func_t&& ev_wait_func);
        +
        420
        +
        421 // General API (mirrors transport:: counterpart).
        +
        422
        +
        423 /**
        +
        424 * Mirrors sync_io::Native_handle_sender::send_meta_blob_max_size().
        +
        425 * @return See above.
        +
        426 */
        + +
        428
        +
        429 /**
        +
        430 * In PEER state: Possibly-asynchronously awaits one discrete message -- as sent by the opposing peer via
        +
        431 * Native_handle_sender::send_native_handle() or `"Native_handle_sender::*end_sending()"` -- and
        +
        432 * receives it into the given target locations, reliably and in-order. The message is, therefore, one of the
        +
        433 * following:
        +
        434 * - A binary blob; a native handle; or both. This is indicated by `on_done_func(Error_code(), N)` or
        +
        435 * the equivalent synchronous out-args (see below on that topic).
        +
        436 * The falsy code indicates success; `N <= target_meta_blob.size()` indicates the number of bytes received into
        +
        437 * `target_meta_blob.data()` (zero means no blob was sent in the message). `*target_hndl` is set
        +
        438 * (`target_hndl->null() == true` means no handle was sent in the message).
        +
        439 * - Graceful-close. This is indicated by `on_done_func(error::code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, 0)` or
        +
        440 * the equivalent synchronous out-args (see below on that topic).
        +
        441 * Neither the target blob nor target native handle are touched.
        +
        442 *
        +
        443 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        +
        444 * in 1+ active-event (readable, writable) state, this method shall later invoke the `Event_wait_func`
        +
        445 * registered via start_receive_native_handle_ops() by the user of `*this`; and the error code
        +
        446 * error::Code::S_SYNC_IO_WOULD_BLOCK shall be emitted here synchronously (via `*sync_err_code` if not null,
        +
        447 * exception if null -- per standard `flow::Error_code`-doc-header semantics). Meanwhile the completion handler
        +
        448 * `on_done_func()` shall execute once the required async-waits have been satisfied
        +
        449 * by the `*this` user, synchronously from inside the `(*on_active_ev_func)()` call that achieves this state.
        +
        450 *
        +
        451 * If, by contrast, no more work is required -- the operation completed synchronously within this method -- then:
        +
        452 * success or error *other than* error::code::S_SYNC_IO_WOULD_BLOB shall be emitted (again per standard
        +
        453 * semantics) synchronously; `*sync_sz` is set to 0 or bytes-transmitted, and `on_done_func()` shall not be
        +
        454 * saved nor ever executed by `*this`. Thus the result of the operation shall be either output directly
        +
        455 * synchronously -- if op completed synchronously -- or later via `on_done_func()` completion handler.
        +
        456 *
        +
        457 * Informally:
        +
        458 * - emission of *not* `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_read()` *not* returning
        +
        459 * `SSL_ERROR_WANT_*`. The operation completed.
        +
        460 * - emission of `S_SYNC_IO_WOULD_BLOCK` is analogous to `SSL_read()` returning
        +
        461 * `SSL_ERROR_WANT_*`. The operation requires an underlying transport to reach a certain readable/writable
        +
        462 * state before `SSL_read()` can complete.
        +
        463 *
        +
        464 * In addition: if `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns
        +
        465 * `false` immediately instead and otherwise no-ops (logging aside). Same if the preceding `async_receive_*()`
        +
        466 * to have returned `true` has not yet executed its completion handler or synchronously completed.
        +
        467 *
        +
        468 * ### Error semantics ###
        +
        469 * Same notes as for transport::Native_handle_receiver. Exception: error may be emitted synchronously.
        +
        470 * Exception: error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER shall not be emitted.
        +
        471 *
        +
        472 * @tparam Task_err_sz
        +
        473 * A functor type with signature identical to `flow::async::Task_asio_err_sz`.
        +
        474 * @param target_hndl
        +
        475 * `*target_hndl` shall be set before `on_done_func()` is executed with a falsy code.
        +
        476 * @param target_meta_blob
        +
        477 * `target_meta_blob.data()...` shall be written to before `on_done_func()` is executed with a falsy
        +
        478 * code, bytes numbering `N`, where `N` is passed to that callback. `N` shall not exceed
        +
        479 * `target_meta_blob.size()`. See "Error semantics" (there is an `Error_code` regarding
        +
        480 * overflowing the user's memory area).
        +
        481 * @param sync_err_code
        +
        482 * See above.
        +
        483 * Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then
        +
        484 * would-block *will* make this throw.
        +
        485 * @param sync_sz
        +
        486 * See above. If null behavior undefined (assertion may trip).
        +
        487 * @param on_done_func
        +
        488 * See above.
        +
        489 * @return Same notes as for transport::Native_handle_receiver. In addition: return `false` if
        +
        490 * start_receive_native_handle_ops() has not been called successfully, or if the preceding
        +
        491 * async-receive has not completed (completion handler has not executed).
        +
        492 */
        +
        493 template<typename Task_err_sz>
        + +
        495 Error_code* sync_err_code, size_t sync_sz,
        +
        496 const util::Blob_mutable& target_meta_blob,
        +
        497 Task_err_sz&& on_done_func);
        +
        498
        +
        499 /**
        +
        500 * In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is, once at least
        +
        501 * the specified time has passed since the last received low-level traffic (or this call, whichever most
        +
        502 * recently occurred), to emit the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT. The implementation
        +
        503 * shall guarantee the observer idle timeout is at least the provided value but may exceed this value for
        +
        504 * internal reasons, as long as it's by a less than human-perceptible period (roughly speaking -- milliseconds,
        +
        505 * not seconds).
        +
        506 *
        +
        507 * Per `sync_io` pattern: if internally more work is required asynchronously pending 1+ native handles being
        +
        508 * in 1+ active-event (readable, writable) state, this method shall synchronously invoke the `Event_wait_func`
        +
        509 * registered via start_send_native_handle_ops() by the user of `*this`.
        +
        510 * - In *this* case the events waited-on are likely to be at most 1 (per PEER state) firing of an internal
        +
        511 * idle timer.
        +
        512 * - Indeed if that does occur, the `(*on_active_ev_func)()` call (by the `*this` user) that reported
        +
        513 * the timer firing shall also act as-if the currently pending async_receive_native_handle() (if any)
        +
        514 * encountered the pipe-hosing error error::Code::S_RECEIVER_IDLE_TIMEOUT.
        +
        515 * - No special code is necessary on the user's part to handle this: it will look like the
        +
        516 * async_receive_native_handle() failing with a pipe-hosing error; which any proper
        +
        517 * `on_done_func()` must handle anyway.
        +
        518 *
        +
        519 * If `*this` is not in PEER state (in particular if it is default-cted or moved-from), returns `false` immediately
        +
        520 * instead and otherwise no-ops (logging aside). If idle_timer_run() has already been called successfuly,
        +
        521 * subsequently it will return `false` and no-op (logging aside).
        +
        522 *
        +
        523 * ### Important: Relationship between idle_timer_run() and async_receive_native_handle() ###
        +
        524 * Notes for transport::Native_handle_receiver apply. In short: if you use idle_timer_run(), then you'd best
        +
        525 * have an async_receive_native_handle() outstanding at ~all times.
        +
        526 *
        +
        527 * ### Error semantics ###
        +
        528 * If and only if the timeout does occur down the line, the aforementioned error will be emitted via
        +
        529 * async_receive_native_handle() (or similar) handler. It shall be treated as the reason to hose the pipe
        +
        530 * (assuming it was not hosed by something else earlier).
        +
        531 *
        +
        532 * ### Suggested use ###
        +
        533 * Notes for transport::Native_handle_receiver apply.
        +
        534 *
        +
        535 * @param timeout
        +
        536 * Notes for transport::Native_handle_receiver apply.
        +
        537 * @return Same notes as for transport::Native_handle_receiver. In addition: return `false` if
        +
        538 * start_receive_native_handle_ops() has not been called successfully.
        +
        539 */
        +
        540 bool idle_timer_run(util::Fine_duration timeout = default_value);
        +
        541}; // class Native_handle_receiver
        +
        542
        +
        543} // namespace ipc::transport::sync_io
        +
        A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
        size_t receive_meta_blob_max_size() const
        Mirrors sync_io::Native_handle_sender::send_meta_blob_max_size().
        Native_handle_receiver()
        Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        bool idle_timer_run(util::Fine_duration timeout=default_value)
        In PEER state: Irreversibly enables a conceptual idle timer whose potential side effect is,...
        bool async_receive_native_handle(Native_handle *target_hndl, Error_code *sync_err_code, size_t sync_sz, const util::Blob_mutable &target_meta_blob, Task_err_sz &&on_done_func)
        In PEER state: Possibly-asynchronously awaits one discrete message – as sent by the opposing peer via...
        bool replace_event_wait_handles(const Create_ev_wait_hndl_func &create_ev_wait_hndl_func)
        Coincides with sync_io::Native_handle_sender concept counterpart.
        -
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Native_handle_receiver.
        +
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Native_handle_receiver.
        ~Native_handle_receiver()
        Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
        Native_handle_receiver(Native_handle_receiver &&src)
        Move-constructs from src; src becomes as-if default-cted (therefore in NULL state).
        bool start_receive_native_handle_ops(Event_wait_func_t &&ev_wait_func)
        Sets up the sync_io-pattern interaction between *this and the user's event loop; required before asyn...
        Native_handle_receiver & operator=(const Native_handle_receiver &)=delete
        Disallow copying.
        -
        static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED
        Same notes as for transport::Native_handle_receiver.
        +
        static constexpr bool S_META_BLOB_UNDERFLOW_ALLOWED
        Same notes as for transport::Native_handle_receiver.
        Native_handle_receiver(const Native_handle_receiver &)=delete
        Disallow copying.
        Native_handle_receiver & operator=(Native_handle_receiver &&src)
        Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in NULL...
        -
        A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
        +
        A documentation-only concept defining the behavior of an object that is the sync_io-pattern counterpa...
        bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const &meta_blob, Error_code *err_code=0)
        In PEER state: Synchronously, non-blockingly sends one discrete message, reliably/in-order,...
        ~Native_handle_sender()
        Destroys this peer endpoint which will end the conceptual outgoing-direction pipe (in PEER state,...
        bool auto_ping(util::Fine_duration period=default_value)
        In PEER state: Irreversibly enables periodic auto-pinging of opposing receiver with low-level message...
        -
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Native_handle_sender.
        +
        static const Shared_name S_RESOURCE_TYPE_ID
        Same notes as for transport::Native_handle_sender.
        bool start_send_native_handle_ops(Event_wait_func_t &&ev_wait_func)
        Sets up the sync_io-pattern interaction between *this and the user's event loop; required before send...
        bool end_sending()
        Equivalent to async_end_sending(&E, F) wherein F() does nothing, and E is some Error_code "sink" igno...
        Native_handle_sender()
        Default ctor: Creates a peer object in NULL (neither connected nor connecting) state.
        @@ -643,15 +644,15 @@
        size_t send_meta_blob_max_size() const
        Same notes as for transport::Native_handle_sender.
        String-wrapping abstraction representing a name uniquely distinguishing a kernel-persistent entity fr...
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp.html index 3c110f1e8..26df2cc38 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -99,7 +99,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp_source.html index 3169da840..8f715ce59 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -318,18 +318,18 @@
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        util::Shared_name Shared_name
        Convenience alias for the commonly used type util::Shared_name.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        -
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:301
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        +
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:302
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp.html index 74f2d1c35..03a13d5c5 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -104,7 +104,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp_source.html index 8302f4c0c..85ec3fbd3 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -966,21 +966,21 @@
        Useful if using the sync_io pattern within a user event loop built on boost.asio (optionally with flo...
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        -
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:301
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        +
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:302
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp.html index 0663bde27..6d2872fc2 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -99,7 +99,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp_source.html index fc2b51af3..44f16d3cb 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -156,7 +156,7 @@
        84}
        85
        86} // namespace ipc::transport::sync_io
        -
        const Shared_name & absolute_name() const
        Returns the full name/address to which the constructor bound, or attempted to bind,...
        +
        const Shared_name & absolute_name() const
        Returns the full name/address to which the constructor bound, or attempted to bind,...
        sync_io-pattern counterpart to async-I/O-pattern transport::Native_socket_stream_acceptor.
        Native_socket_stream_acceptor(flow::log::Logger *logger_ptr, const Shared_name &absolute_name, Error_code *err_code=0)
        All notes from Async_io_obj API counterpart API apply.
        ~Native_socket_stream_acceptor()
        All notes from Async_io_obj API counterpart API apply, except that no completion handler(s) are fired...
        @@ -173,13 +173,13 @@
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        util::Shared_name Shared_name
        Convenience alias for the commonly used type util::Shared_name.
        util::Native_handle Native_handle
        Convenience alias for the commonly used type util::Native_handle.
        -
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:322
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:323
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp.html index a1e908e1d..1b310b5f1 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -104,7 +104,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp_source.html index f7ea390ee..e398af331 100644 --- a/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io_2native__socket__stream__acceptor_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -435,20 +435,20 @@
        @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
        Async completion handler is being called prematurely, because underlying object is shutting down,...
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122
        void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
        Writes a byte to the given pipe writer.
        Definition: util.cpp:67
        void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
        Reads a byte via the given pipe reader.
        Definition: util.cpp:96
        boost::asio::writable_pipe Pipe_writer
        Short-hand for anonymous pipe write end.
        Definition: util_fwd.hpp:32
        boost::asio::readable_pipe Pipe_reader
        Short-hand for anonymous pipe read end.
        Definition: util_fwd.hpp:35
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        diff --git a/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp.html index 34f07d390..bf9fd06f4 100644 --- a/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -102,7 +102,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp_source.html index 45a27a0f0..0b0dfc8b6 100644 --- a/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/sync__io__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -873,15 +873,15 @@
        801
        802} // namespace ipc::util::sync_io
        Useful if using the sync_io pattern within a user event loop built on boost.asio (optionally with flo...
        -
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:208
        +
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:209
        Function< void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &&on_active_ev_func)> Event_wait_func
        In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...
        boost::shared_ptr< Task > Task_ptr
        Short-hand for ref-counted pointer to a Function<> that takes no arguments and returns nothing; in pa...
        -
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:301
        +
        flow::Function< Signature > Function
        Short-hand for polymorphic functor holder which is very common. This is essentially std::function.
        Definition: common.hpp:302
        diff --git a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp.html b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp.html index a0863cdd5..1560100e6 100644 --- a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp.html +++ b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -101,7 +101,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp_source.html b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp_source.html index 1aae022e2..14e5bdd1c 100644 --- a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -220,18 +220,18 @@
        Timer_fired_read_end * create_timer_signal_pipe()
        Creates, and internally stores, an IPC mechanism instance intended for use with a given create_timer(...
        std::vector< boost::movelib::unique_ptr< Timer_fired_read_end > > m_signal_pipe_readers
        The readers (never null) returned by create_timer_signal_pipe().
        -
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:208
        +
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:209
        std::ostream & operator<<(std::ostream &os, const Timer_event_emitter &val)
        Prints string representation of the given Timer_event_emitter to the given ostream.
        void pipe_produce(flow::log::Logger *logger_ptr, Pipe_writer *pipe)
        Writes a byte to the given pipe writer.
        Definition: util.cpp:67
        void pipe_consume(flow::log::Logger *logger_ptr, Pipe_reader *pipe)
        Reads a byte via the given pipe reader.
        Definition: util.cpp:96
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:322
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        Log_component
        The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...
        Definition: common.hpp:323
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        diff --git a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp.html b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp.html index aeefceb69..3fe00986c 100644 --- a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp.html +++ b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -99,7 +99,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp_source.html b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp_source.html index dc3c23412..1faa9881a 100644 --- a/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/timer__ev__emitter_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -353,13 +353,13 @@
        flow::async::Single_thread_task_loop m_worker
        The thread where (only) timer-firing events (from create_timer()-created Timers) execute.
        Timer_fired_read_end * create_timer_signal_pipe()
        Creates, and internally stores, an IPC mechanism instance intended for use with a given create_timer(...
        std::vector< boost::movelib::unique_ptr< Timer_fired_read_end > > m_signal_pipe_readers
        The readers (never null) returned by create_timer_signal_pipe().
        -
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:208
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        +
        Contains common code, as well as important explanatory documentation in the following text,...
        Definition: util_fwd.hpp:209
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        diff --git a/doc/ipc_doc/generated/html_full/todo.html b/doc/ipc_doc/generated/html_full/todo.html index c2f736f7b..aa571201a 100644 --- a/doc/ipc_doc/generated/html_full/todo.html +++ b/doc/ipc_doc/generated/html_full/todo.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -154,7 +154,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html index d804a4f95..89840639a 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -108,7 +108,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html index 93deb4c7c..752f3f33e 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -127,7 +127,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html index e170a5f07..d1e4a714b 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -111,7 +111,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html index 2660a7573..0765ae8d5 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -130,7 +130,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp.html index 1064bcb8d..ce6783770 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -105,7 +105,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp_source.html index 98377a6f3..dda7d2217 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -120,7 +120,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html index bbd706c0a..92059e3d8 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -108,7 +108,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html index 037dd7bd7..4f8f7d90a 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -119,7 +119,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp.html index 693968524..87ef6e017 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -117,7 +117,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp_source.html index cfd8a63ee..cd1573e19 100644 --- a/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport_2struc_2shm_2shm__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -224,7 +224,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/transport__fwd_8hpp.html index 767d23bb6..f61600c26 100644 --- a/doc/ipc_doc/generated/html_full/transport__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/transport__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -201,7 +201,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/transport__fwd_8hpp_source.html index 38b0097cb..7ccda1d95 100644 --- a/doc/ipc_doc/generated/html_full/transport__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/transport__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -488,7 +488,7 @@
        A server object that binds to a Shared_name and listens for incoming Native_socket_stream connect att...
        Implements both Native_handle_sender and Native_handle_receiver concepts by using a stream-oriented U...
        Dummy type for use as a template param to Channel when either the blobs pipe or handles pipe is disab...
        Definition: channel.hpp:1000
        -
        Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
        +
        Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
        Implements sync_io::Blob_receiver concept by using an adopted Persistent_mq_handle MQ handle to an MQ...
        Implements sync_io::Blob_sender concept by using an adopted Persistent_mq_handle MQ handle to an MQ (...
        sync_io-pattern counterpart to async-I/O-pattern transport::Native_socket_stream_acceptor.
        @@ -497,18 +497,18 @@
        struc::Channel< Channel_obj, Message_body, Builder::Config, Reader::Config > Channel
        Convenience alias: Use this when constructing a struc::Channel with tag Channel_base::S_SERIALIZE_VIA...
        Definition: classic.hpp:42
        sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.
        std::ostream & operator<<(std::ostream &os, const Blob_stream_mq_receiver_impl< Persistent_mq_handle > &val)
        Prints string representation of the given Blob_stream_mq_receiver_impl to the given ostream.
        -
        Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
        +
        Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
        util::Shared_name Shared_name
        Convenience alias for the commonly used type util::Shared_name.
        -
        std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
        Prints string representation of the given Bipc_mq_handle to the given ostream.
        +
        std::ostream & operator<<(std::ostream &os, const Bipc_mq_handle &val)
        Prints string representation of the given Bipc_mq_handle to the given ostream.
        util::Native_handle Native_handle
        Convenience alias for the commonly used type util::Native_handle.
        void swap(Bipc_mq_handle &val1, Bipc_mq_handle &val2)
        Implements Persistent_mq_handle related concept: Swaps two objects.
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        diff --git a/doc/ipc_doc/generated/html_full/transport_core.html b/doc/ipc_doc/generated/html_full/transport_core.html index 237f0d358..2eafbd3f8 100644 --- a/doc/ipc_doc/generated/html_full/transport_core.html +++ b/doc/ipc_doc/generated/html_full/transport_core.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -76,7 +76,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/transport_shm.html b/doc/ipc_doc/generated/html_full/transport_shm.html index ba2c1b830..342572f02 100644 --- a/doc/ipc_doc/generated/html_full/transport_shm.html +++ b/doc/ipc_doc/generated/html_full/transport_shm.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -398,7 +398,7 @@

        What can you do with a borrowed (received) data structured in SHM?

        diff --git a/doc/ipc_doc/generated/html_full/universes.html b/doc/ipc_doc/generated/html_full/universes.html index b237dd856..ee0cba2f2 100644 --- a/doc/ipc_doc/generated/html_full/universes.html +++ b/doc/ipc_doc/generated/html_full/universes.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -76,7 +76,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/use__counted__object_8cpp.html b/doc/ipc_doc/generated/html_full/use__counted__object_8cpp.html index 64d8bd930..b7a1d7eac 100644 --- a/doc/ipc_doc/generated/html_full/use__counted__object_8cpp.html +++ b/doc/ipc_doc/generated/html_full/use__counted__object_8cpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -88,7 +88,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/use__counted__object_8cpp_source.html b/doc/ipc_doc/generated/html_full/use__counted__object_8cpp_source.html index 3323fda9b..2960bee42 100644 --- a/doc/ipc_doc/generated/html_full/use__counted__object_8cpp_source.html +++ b/doc/ipc_doc/generated/html_full/use__counted__object_8cpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -125,7 +125,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/use__counted__object_8hpp.html b/doc/ipc_doc/generated/html_full/use__counted__object_8hpp.html index 2f4ffc1f2..b2a53ed31 100644 --- a/doc/ipc_doc/generated/html_full/use__counted__object_8hpp.html +++ b/doc/ipc_doc/generated/html_full/use__counted__object_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -95,7 +95,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/use__counted__object_8hpp_source.html b/doc/ipc_doc/generated/html_full/use__counted__object_8hpp_source.html index 617cb43c4..d84551a02 100644 --- a/doc/ipc_doc/generated/html_full/use__counted__object_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/use__counted__object_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -137,7 +137,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/util_8hpp.html b/doc/ipc_doc/generated/html_full/util_8hpp.html index c10c52f04..7e4fe9051 100644 --- a/doc/ipc_doc/generated/html_full/util_8hpp.html +++ b/doc/ipc_doc/generated/html_full/util_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -109,7 +109,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/util_8hpp_source.html b/doc/ipc_doc/generated/html_full/util_8hpp_source.html index 5ef83f710..a2260ce69 100644 --- a/doc/ipc_doc/generated/html_full/util_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/util_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -184,44 +184,45 @@
        112 * its own .is_regular_file(), but boost.fs lacks this; though the latter is described in terms of
        113 * of the free function anyway; so meh.) */
        114#ifndef FLOW_OS_LINUX
        -
        115# error "We rely on Linux /dev/... (etc.) semantics, where the object-mapped files are classified as regular files."
        -
        116#endif
        -
        117 Error_code err_code;
        -
        118 const auto dir_entry_status = dir_entry.status(err_code);
        -
        119 if (err_code || !fs::is_regular_file(dir_entry_status))
        -
        120 {
        -
        121 continue;
        -
        122 }
        -
        123 // else
        -
        124
        -
        125 handle_name_func(Shared_name::ct(dir_entry.path().filename().native()));
        -
        126 } // for (dir_entry)
        -
        127} // for_each_persistent_impl()
        -
        128
        -
        129template<typename Handle_name_func>
        -
        130void for_each_persistent_shm_pool(const Handle_name_func& handle_name_func)
        -
        131{
        -
        132#ifndef FLOW_OS_LINUX
        -
        133# error "This method relies on/has been tested only with Linux /dev/shm semantics."
        -
        134#endif
        -
        135 for_each_persistent_impl("/dev/shm", handle_name_func);
        -
        136}
        -
        137
        -
        138} // namespace ipc::util
        +
        115 static_assert(false, "We rely on Linux /dev/... (etc.) semantics, where the object-mapped files "
        +
        116 "are classified as regular files.");
        +
        117#endif
        +
        118 Error_code err_code;
        +
        119 const auto dir_entry_status = dir_entry.status(err_code);
        +
        120 if (err_code || !fs::is_regular_file(dir_entry_status))
        +
        121 {
        +
        122 continue;
        +
        123 }
        +
        124 // else
        +
        125
        +
        126 handle_name_func(Shared_name::ct(dir_entry.path().filename().native()));
        +
        127 } // for (dir_entry)
        +
        128} // for_each_persistent_impl()
        +
        129
        +
        130template<typename Handle_name_func>
        +
        131void for_each_persistent_shm_pool(const Handle_name_func& handle_name_func)
        +
        132{
        +
        133#ifndef FLOW_OS_LINUX
        +
        134 static_assert(false, "This method relies on/has been tested only with Linux /dev/shm semantics.");
        +
        135#endif
        +
        136 for_each_persistent_impl("/dev/shm", handle_name_func);
        +
        137}
        +
        138
        +
        139} // namespace ipc::util
        static Shared_name ct(const Source &src)
        Copy-constructs from a char-sequence container (including string, util::String_view,...
        Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
        void for_each_persistent_impl(const fs::path &persistent_obj_dev_dir_path, const Handle_name_func &handle_name_func)
        Implementation of Persistent_object::for_each_persistent(); for example see shm::classic::Pool_arena:...
        Definition: util.hpp:90
        -
        void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
        Equivalent to shm::classic::Pool_arena::for_each_persistent().
        Definition: util.hpp:130
        +
        void for_each_persistent_shm_pool(const Handle_name_func &handle_name_func)
        Equivalent to shm::classic::Pool_arena::for_each_persistent().
        Definition: util.hpp:131
        void op_with_possible_bipc_exception(flow::log::Logger *logger_ptr, Error_code *err_code, const Error_code &misc_bipc_lib_error, String_view context, const Func &func)
        Internal (to ipc) utility that invokes the given function that invokes a boost.interprocess operation...
        Definition: util.hpp:34
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        diff --git a/doc/ipc_doc/generated/html_full/util__fwd_8hpp.html b/doc/ipc_doc/generated/html_full/util__fwd_8hpp.html index 46694be3b..9b5987f03 100644 --- a/doc/ipc_doc/generated/html_full/util__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_full/util__fwd_8hpp.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -174,7 +174,7 @@
        diff --git a/doc/ipc_doc/generated/html_full/util__fwd_8hpp_source.html b/doc/ipc_doc/generated/html_full/util__fwd_8hpp_source.html index 24b25b6e6..1899d651b 100644 --- a/doc/ipc_doc/generated/html_full/util__fwd_8hpp_source.html +++ b/doc/ipc_doc/generated/html_full/util__fwd_8hpp_source.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Full implementation reference.
        @@ -133,255 +133,261 @@
        61 * in two places, here and the definition; and (2) ::S_END_SENTINEL cannot be used in _fwd.hpp to, say,
        62 * set a compile-time array<> size. So just make an exception and define the enum fully here. It's not
        63 * "really" an aggregate type (class), so it's all right. */
        -
        64
        -
        65/**
        -
        66 * Simple specifier of desired access permissions, usually but not necessarily translated into
        -
        67 * a `Permissions` value (though even then different value in different contexts). May be used to map, say,
        -
        68 * from a Permissions_level to a #Permissions value in an
        -
        69 * `array<Permissions, size_t(Permissions_level::S_END_SENTINEL)>`.
        -
        70 *
        -
        71 * While, unlike #Permissions, this `enum` intends not be overtly based on a POSIX RWXRWXRWC model, it does
        -
        72 * still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd
        -
        73 * are likely universal, but the 2nd may not apply to all OS -- through probably all POSIX/Unix ones --
        -
        74 * and even for something like Linux there could be different groupings such as ones based on OS ACL.
        -
        75 * As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing,
        -
        76 * but that could change to include, say, MacOS/BSD).
        -
        77 *
        -
        78 * @internal
        -
        79 * ### Maintenance ###
        -
        80 * Do *not* change the order of these constants unless absolutely necessary. In general any change here
        -
        81 * means updating any `array<>`s (etc.) that map implicitly from a `size_t` representing
        -
        82 * Permissions_level. By convention they are named `*_PERMISSIONS_LVL_MAP` as of this writing.
        +
        64
        +
        65#ifndef FLOW_OS_LINUX
        +
        66static_assert(false, "Design of Permissions_level assumes a POSIX-y security model with users and groups; "
        +
        67 "we have not yet considered whether it can apply to Windows in its current form. "
        +
        68 "Should work in non-Linux POSIX OS (like macOS) but must be checked/tested.");
        +
        69#endif
        +
        70
        +
        71/**
        +
        72 * Simple specifier of desired access permissions, usually but not necessarily translated into
        +
        73 * a `Permissions` value (though even then different value in different contexts). May be used to map, say,
        +
        74 * from a Permissions_level to a #Permissions value in an
        +
        75 * `array<Permissions, size_t(Permissions_level::S_END_SENTINEL)>`.
        +
        76 *
        +
        77 * While, unlike #Permissions, this `enum` intends not be overtly based on a POSIX RWXRWXRWX model, it does
        +
        78 * still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd
        +
        79 * are likely universal, but the 2nd may not apply to all OS -- through probably all POSIX/Unix ones --
        +
        80 * and even for something like Linux there could be different groupings such as ones based on OS ACL.
        +
        81 * As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing,
        +
        82 * but that could change to include, say, macOS/similar).
        83 *
        -
        84 * The `array<>` mapping scheme is for max performance; if one uses an `unordered_map` or similar, then there is no
        -
        85 * similar issue.
        -
        86 */
        -
        87enum class Permissions_level : size_t
        -
        88{
        -
        89 /// Forbids all access, even by the creator's user. Most likely this would be useful for testing or debugging.
        - -
        91
        -
        92 /// Allows access by resource-owning user (in POSIX/Unix identified by UID) and no one else.
        - -
        94
        -
        95 /**
        -
        96 * Allows access by resource-owning user's containing group(s) (in POSIX/Unix identified by GID) and no one else.
        -
        97 * This implies, as well, at least as much access as `S_USER_ACCESS`.
        -
        98 */
        - +
        84 * @internal
        +
        85 * ### Maintenance ###
        +
        86 * Do *not* change the order of these constants unless absolutely necessary. In general any change here
        +
        87 * means updating any `array<>`s (etc.) that map implicitly from a `size_t` representing
        +
        88 * Permissions_level. By convention they are named `*_PERMISSIONS_LVL_MAP` as of this writing.
        +
        89 *
        +
        90 * The `array<>` mapping scheme is for max performance; if one uses an `unordered_map` or similar, then there is no
        +
        91 * similar issue.
        +
        92 */
        +
        93enum class Permissions_level : size_t
        +
        94{
        +
        95 /// Forbids all access, even by the creator's user. Most likely this would be useful for testing or debugging.
        + +
        97
        +
        98 /// Allows access by resource-owning user (in POSIX/Unix identified by UID) and no one else.
        +
        100
        -
        101 /// Allows access by all. Implies, as well, at least as much access as `S_GROUP_ACCESS` and thus `S_USER_ACCESS`.
        - -
        103
        -
        104 /// Sentinel: not a valid value. May be used to, e.g., size an `array<>` mapping from Permissions_level.
        - -
        106}; // enum class Permissions_level
        -
        107
        -
        108/// Short-hand for Flow's `String_view`.
        - -
        110/// Short-hand for Flow's `Fine_duration`.
        - -
        112/// Short-hand for Flow's `Fine_time_pt`.
        - -
        114
        -
        115/// Short-hand for polymorphic function (a-la `std::function<>`) that takes no arguments and returns nothing.
        - -
        117
        -
        118/**
        -
        119 * Short-hand for an immutable blob somewhere in memory, stored as exactly a `void const *` and a `size_t`.
        -
        120 *
        -
        121 * ### How to use ###
        -
        122 * We provide this alias as a stylistic short-hand, as it better suits various interfaces especially in
        -
        123 * ipc::transport. Nevertheless it's not meant to more than that; it's an attempt to abstract it away.
        -
        124 *
        -
        125 * That is to say, to work with these (create them, access them, etc.), do use the highly convenient
        -
        126 * boost.asio buffer APIs which are well documented in boost.asio's docs.
        -
        127 */
        -
        128using Blob_const = boost::asio::const_buffer;
        -
        129
        -
        130/**
        -
        131 * Short-hand for an mutable blob somewhere in memory, stored as exactly a `void*` and a `size_t`.
        -
        132 * @see ipc::util::Blob_const; usability notes in that doc header apply similarly here.
        +
        101 /**
        +
        102 * Allows access by resource-owning user's containing group(s) (in POSIX/Unix identified by GID) and no one else.
        +
        103 * This implies, as well, at least as much access as `S_USER_ACCESS`.
        +
        104 */
        + +
        106
        +
        107 /// Allows access by all. Implies, as well, at least as much access as `S_GROUP_ACCESS` and thus `S_USER_ACCESS`.
        + +
        109
        +
        110 /// Sentinel: not a valid value. May be used to, e.g., size an `array<>` mapping from Permissions_level.
        + +
        112}; // enum class Permissions_level
        +
        113
        +
        114/// Short-hand for Flow's `String_view`.
        + +
        116/// Short-hand for Flow's `Fine_duration`.
        + +
        118/// Short-hand for Flow's `Fine_time_pt`.
        + +
        120
        +
        121/// Short-hand for polymorphic function (a-la `std::function<>`) that takes no arguments and returns nothing.
        + +
        123
        +
        124/**
        +
        125 * Short-hand for an immutable blob somewhere in memory, stored as exactly a `void const *` and a `size_t`.
        +
        126 *
        +
        127 * ### How to use ###
        +
        128 * We provide this alias as a stylistic short-hand, as it better suits various interfaces especially in
        +
        129 * ipc::transport. Nevertheless it's not meant to more than that; it's an attempt to abstract it away.
        +
        130 *
        +
        131 * That is to say, to work with these (create them, access them, etc.), do use the highly convenient
        +
        132 * boost.asio buffer APIs which are well documented in boost.asio's docs.
        133 */
        -
        134using Blob_mutable = boost::asio::mutable_buffer;
        +
        134using Blob_const = boost::asio::const_buffer;
        135
        -
        136/// Syntactic-sugary type for POSIX process ID (integer).
        -
        137using process_id_t = ::pid_t;
        -
        138
        -
        139/// Syntactic-sugary type for POSIX user ID (integer).
        -
        140using user_id_t = ::uid_t;
        +
        136/**
        +
        137 * Short-hand for an mutable blob somewhere in memory, stored as exactly a `void*` and a `size_t`.
        +
        138 * @see ipc::util::Blob_const; usability notes in that doc header apply similarly here.
        +
        139 */
        +
        140using Blob_mutable = boost::asio::mutable_buffer;
        141
        -
        142/// Syntactic-sugary type for POSIX group ID (integer).
        -
        143using group_id_t = ::gid_t;
        +
        142/// Syntactic-sugary type for POSIX process ID (integer).
        +
        143using process_id_t = ::pid_t;
        144
        -
        145/// Tag type indicating an atomic open-if-exists-else-create operation. @see #OPEN_OR_CREATE.
        -
        146using Open_or_create = bipc::open_or_create_t;
        +
        145/// Syntactic-sugary type for POSIX user ID (integer).
        +
        146using user_id_t = ::uid_t;
        147
        -
        148/// Tag type indicating an ideally-atomic open-if-exists-else-fail operation. @see #OPEN_ONLY.
        -
        149using Open_only = bipc::open_only_t;
        +
        148/// Syntactic-sugary type for POSIX group ID (integer).
        +
        149using group_id_t = ::gid_t;
        150
        -
        151/// Tag type indicating a create-unless-exists-else-fail operation. @see #CREATE_ONLY.
        -
        152using Create_only = bipc::create_only_t;
        +
        151/// Tag type indicating an atomic open-if-exists-else-create operation. @see #OPEN_OR_CREATE.
        +
        152using Open_or_create = bipc::open_or_create_t;
        153
        -
        154/// Short-hand for Unix (POSIX) permissions class.
        -
        155using Permissions = bipc::permissions;
        -
        156
        -
        157// Constants.
        -
        158
        -
        159/// Tag value indicating an open-if-exists-else-create operation.
        -
        160extern const Open_or_create OPEN_OR_CREATE;
        -
        161
        -
        162/// Tag value indicating an atomic open-if-exists-else-fail operation.
        -
        163extern const Open_only OPEN_ONLY;
        +
        154/// Tag type indicating an ideally-atomic open-if-exists-else-fail operation. @see #OPEN_ONLY.
        +
        155using Open_only = bipc::open_only_t;
        +
        156
        +
        157/// Tag type indicating a create-unless-exists-else-fail operation. @see #CREATE_ONLY.
        +
        158using Create_only = bipc::create_only_t;
        +
        159
        +
        160/// Short-hand for Unix (POSIX) permissions class.
        +
        161using Permissions = bipc::permissions;
        +
        162
        +
        163// Constants.
        164
        -
        165/// Tag value indicating an atomic create-unless-exists-else-fail operation.
        -
        166extern const Create_only CREATE_ONLY;
        +
        165/// Tag value indicating an open-if-exists-else-create operation.
        +
        166extern const Open_or_create OPEN_OR_CREATE;
        167
        -
        168/// A (default-cted) string. May be useful for functions returning `const std::string&`.
        -
        169extern const std::string EMPTY_STRING;
        -
        170
        -
        171// Free functions.
        -
        172
        -
        173/**
        -
        174 * Maps general Permissions_level specifier to low-level #Permissions value, when the underlying resource
        -
        175 * is in the file-system and is either accessible (read-write in terms of file system) or inaccessible.
        -
        176 * Examples of such resources are SHM pools (e.g., shm::classic::Pool_arena), bipc MQs (transport::Bipc_mq_handle),
        -
        177 * POSIX MQs (transport::Posix_mq_handle).
        -
        178 *
        -
        179 * Please do not confuse this setting with the read-only/read-write dichotomy potentially specified each time such
        -
        180 * a resource is opened for access (as is the case for SHM pools): the present mapping applies to a persistent
        -
        181 * protection in the file system, not at runtime at the code writer's discretion. The present permissions check
        -
        182 * is performed at opening time; the runtime writability check each time a datum is written into the resource.
        -
        183 *
        -
        184 * @param permissions_lvl
        -
        185 * The value to translate.
        -
        186 * @return The result.
        -
        187 */
        - -
        189
        -
        190/**
        -
        191 * Utility that sets the permissions of the given resource (at the supplied file system path) to specified
        -
        192 * POSIX value. If the resource cannot be accessed (not found, permissions...) that system Error_code shall be
        -
        193 * emitted.
        -
        194 *
        -
        195 * ### Rationale ###
        -
        196 * It may seem unnecessary, particularly given that it sometimes (in our internal code, but I mention it
        -
        197 * publicly for exposition purposes) placed right after the
        -
        198 * creation of the resource (file, SHM pool, POSIX MQ, shared mutex, etc.) -- where the same `perms` is supplied
        -
        199 * to the creation-API, whichever is applicable. The reason is that those APIs tend to make the corresponding OS
        -
        200 * call (e.g., `open()`) which is bound by the "process umask" in POSIX/Linux; so for example if it's set to
        -
        201 * the typical 022 (octal), then it's impossible to make the resource group- or all-writable, regardless of
        -
        202 * `perms`. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make
        -
        203 * any calls to change the umask to accomplish this.
        -
        204 *
        -
        205 * Note 1: Sometimes there is not even the creation-API argument for `perms`; in which case the rationale is even
        -
        206 * more straightforward.
        -
        207 *
        -
        208 * Note 2: Sometimes there *is* that API... and (namely in boost.ipc at least) they actually took care to do this
        -
        209 * (what we do here) themselves (via `fchmod()` and such)... so we don't need to; in fact I (ygoldfel) treated
        -
        210 * it as valuable confirmation of the correctness of this maneuver.
        -
        211 *
        -
        212 * @param logger_ptr
        -
        213 * Logger to use for logging (WARNING, on error only). Caller can themselves log further info if desired.
        -
        214 * @param path
        -
        215 * Path to resource. Symlinks are followed, and the target is the resource in question (not the symlink).
        -
        216 * @param perms
        -
        217 * See other overload.
        -
        218 * @param err_code
        -
        219 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
        -
        220 * see other overload; note that in addition file-not-found and the like are possible errors (in fact
        -
        221 * arguably the likeliest).
        -
        222 */
        -
        223void set_resource_permissions(flow::log::Logger* logger_ptr, const fs::path& path,
        -
        224 const Permissions& perms, Error_code* err_code = 0);
        -
        225
        -
        226/**
        -
        227 * Identical to the other set_resource_permissions() overload but operates on a pre-opened Native_handle
        -
        228 * (a/k/a handle, socket, file descriptor) to the resource in question.
        -
        229 *
        -
        230 * @param logger_ptr
        -
        231 * See other overload.
        -
        232 * @param handle
        -
        233 * See above. `handle.null() == true` causes undefined behavior (assertion may trip).
        -
        234 * Closed/invalid/etc. handle will yield civilized Error_code emission.
        -
        235 * @param perms
        -
        236 * See other overload.
        -
        237 * @param err_code
        -
        238 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
        -
        239 * system error codes if permissions cannot be set (invalid descriptor, un-opened descriptor, etc.).
        -
        240 */
        -
        241void set_resource_permissions(flow::log::Logger* logger_ptr, Native_handle handle,
        -
        242 const Permissions& perms, Error_code* err_code = 0);
        -
        243
        -
        244/**
        -
        245 * Returns `true` if and only if the given process (by PID) is reported as running by the OS.
        -
        246 * Caution: It may be running, but it may be a zombie; and/or it may be running now but dead shortly after
        -
        247 * this function returns. Use defensively.
        -
        248 *
        -
        249 * Implementation: It invokes POSIX `kill()` with the fake zero signal; this indicates the process *can*
        -
        250 * be signaled and therefore exists.
        -
        251 *
        -
        252 * @param process_id
        -
        253 * The process ID of the process in question.
        -
        254 * @return See above.
        -
        255 */
        -
        256bool process_running(process_id_t process_id);
        -
        257
        -
        258/**
        -
        259 * Syntactic-sugary helper that returns pointer to first byte in an immutable buffer, as `const uint8_t*`.
        -
        260 *
        -
        261 * @param blob
        -
        262 * The buffer.
        -
        263 * @return See above.
        -
        264 */
        -
        265const uint8_t* blob_data(const Blob_const& blob);
        -
        266
        -
        267/**
        -
        268 * Syntactic-sugary helper that returns pointer to first byte in a mutable buffer, as `uint8_t*`.
        -
        269 *
        -
        270 * @param blob
        -
        271 * The buffer.
        -
        272 * @return See above.
        -
        273 */
        -
        274uint8_t* blob_data(const Blob_mutable& blob);
        -
        275
        -
        276} // namespace ipc::util
        +
        168/// Tag value indicating an atomic open-if-exists-else-fail operation.
        +
        169extern const Open_only OPEN_ONLY;
        +
        170
        +
        171/// Tag value indicating an atomic create-unless-exists-else-fail operation.
        +
        172extern const Create_only CREATE_ONLY;
        +
        173
        +
        174/// A (default-cted) string. May be useful for functions returning `const std::string&`.
        +
        175extern const std::string EMPTY_STRING;
        +
        176
        +
        177// Free functions.
        +
        178
        +
        179/**
        +
        180 * Maps general Permissions_level specifier to low-level #Permissions value, when the underlying resource
        +
        181 * is in the file-system and is either accessible (read-write in terms of file system) or inaccessible.
        +
        182 * Examples of such resources are SHM pools (e.g., shm::classic::Pool_arena), bipc MQs (transport::Bipc_mq_handle),
        +
        183 * POSIX MQs (transport::Posix_mq_handle).
        +
        184 *
        +
        185 * Please do not confuse this setting with the read-only/read-write dichotomy potentially specified each time such
        +
        186 * a resource is opened for access (as is the case for SHM pools): the present mapping applies to a persistent
        +
        187 * protection in the file system, not at runtime at the code writer's discretion. The present permissions check
        +
        188 * is performed at opening time; the runtime writability check each time a datum is written into the resource.
        +
        189 *
        +
        190 * @param permissions_lvl
        +
        191 * The value to translate.
        +
        192 * @return The result.
        +
        193 */
        + +
        195
        +
        196/**
        +
        197 * Utility that sets the permissions of the given resource (at the supplied file system path) to specified
        +
        198 * POSIX value. If the resource cannot be accessed (not found, permissions...) that system Error_code shall be
        +
        199 * emitted.
        +
        200 *
        +
        201 * ### Rationale ###
        +
        202 * It may seem unnecessary, particularly given that it sometimes (in our internal code, but I mention it
        +
        203 * publicly for exposition purposes) is placed right after the
        +
        204 * creation of the resource (file, SHM pool, POSIX MQ, shared mutex, etc.) -- where the same `perms` is supplied
        +
        205 * to the creation-API, whichever is applicable. The reason is that those APIs tend to make the corresponding OS
        +
        206 * call (e.g., `open()`) which is bound by the "process umask" in POSIX/Linux; so for example if it's set to
        +
        207 * the typical 022 (octal), then it's impossible to make the resource group- or all-writable, regardless of
        +
        208 * `perms`. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make
        +
        209 * any calls to change the umask to accomplish this.
        +
        210 *
        +
        211 * Note 1: Sometimes there is not even the creation-API argument for `perms`; in which case the rationale is even
        +
        212 * more straightforward.
        +
        213 *
        +
        214 * Note 2: Sometimes there *is* that API... and (namely in boost.ipc at least) they actually took care to do this
        +
        215 * (what we do here) themselves (via `fchmod()` and such)... so we don't need to; in fact I (ygoldfel) treated
        +
        216 * it as valuable confirmation of the correctness of this maneuver.
        +
        217 *
        +
        218 * @param logger_ptr
        +
        219 * Logger to use for logging (WARNING, on error only). Caller can themselves log further info if desired.
        +
        220 * @param path
        +
        221 * Path to resource. Symlinks are followed, and the target is the resource in question (not the symlink).
        +
        222 * @param perms
        +
        223 * See other overload.
        +
        224 * @param err_code
        +
        225 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
        +
        226 * see other overload; note that in addition file-not-found and the like are possible errors (in fact
        +
        227 * arguably the likeliest).
        +
        228 */
        +
        229void set_resource_permissions(flow::log::Logger* logger_ptr, const fs::path& path,
        +
        230 const Permissions& perms, Error_code* err_code = 0);
        +
        231
        +
        232/**
        +
        233 * Identical to the other set_resource_permissions() overload but operates on a pre-opened Native_handle
        +
        234 * (a/k/a handle, socket, file descriptor) to the resource in question.
        +
        235 *
        +
        236 * @param logger_ptr
        +
        237 * See other overload.
        +
        238 * @param handle
        +
        239 * See above. `handle.null() == true` causes undefined behavior (assertion may trip).
        +
        240 * Closed/invalid/etc. handle will yield civilized Error_code emission.
        +
        241 * @param perms
        +
        242 * See other overload.
        +
        243 * @param err_code
        +
        244 * See `flow::Error_code` docs for error reporting semantics. #Error_code generated:
        +
        245 * system error codes if permissions cannot be set (invalid descriptor, un-opened descriptor, etc.).
        +
        246 */
        +
        247void set_resource_permissions(flow::log::Logger* logger_ptr, Native_handle handle,
        +
        248 const Permissions& perms, Error_code* err_code = 0);
        +
        249
        +
        250/**
        +
        251 * Returns `true` if and only if the given process (by PID) is reported as running by the OS.
        +
        252 * Caution: It may be running, but it may be a zombie; and/or it may be running now but dead shortly after
        +
        253 * this function returns. Use defensively.
        +
        254 *
        +
        255 * Implementation: It invokes POSIX `kill()` with the fake zero signal; this indicates the process *can*
        +
        256 * be signaled and therefore exists.
        +
        257 *
        +
        258 * @param process_id
        +
        259 * The process ID of the process in question.
        +
        260 * @return See above.
        +
        261 */
        +
        262bool process_running(process_id_t process_id);
        +
        263
        +
        264/**
        +
        265 * Syntactic-sugary helper that returns pointer to first byte in an immutable buffer, as `const uint8_t*`.
        +
        266 *
        +
        267 * @param blob
        +
        268 * The buffer.
        +
        269 * @return See above.
        +
        270 */
        +
        271const uint8_t* blob_data(const Blob_const& blob);
        +
        272
        +
        273/**
        +
        274 * Syntactic-sugary helper that returns pointer to first byte in a mutable buffer, as `uint8_t*`.
        +
        275 *
        +
        276 * @param blob
        +
        277 * The buffer.
        +
        278 * @return See above.
        +
        279 */
        +
        280uint8_t* blob_data(const Blob_mutable& blob);
        +
        281
        +
        282} // namespace ipc::util
        Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
        -
        ::pid_t process_id_t
        Syntactic-sugary type for POSIX process ID (integer).
        Definition: util_fwd.hpp:137
        -
        bipc::permissions Permissions
        Short-hand for Unix (POSIX) permissions class.
        Definition: util_fwd.hpp:155
        -
        const uint8_t * blob_data(const Blob_const &blob)
        Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
        Definition: util.cpp:156
        -
        Permissions_level
        Simple specifier of desired access permissions, usually but not necessarily translated into a Permiss...
        Definition: util_fwd.hpp:88
        +
        ::pid_t process_id_t
        Syntactic-sugary type for POSIX process ID (integer).
        Definition: util_fwd.hpp:143
        +
        bipc::permissions Permissions
        Short-hand for Unix (POSIX) permissions class.
        Definition: util_fwd.hpp:161
        +
        const uint8_t * blob_data(const Blob_const &blob)
        Syntactic-sugary helper that returns pointer to first byte in an immutable buffer,...
        Definition: util.cpp:158
        +
        Permissions_level
        Simple specifier of desired access permissions, usually but not necessarily translated into a Permiss...
        Definition: util_fwd.hpp:94
        @ S_UNRESTRICTED
        Allows access by all. Implies, as well, at least as much access as S_GROUP_ACCESS and thus S_USER_ACC...
        @ S_USER_ACCESS
        Allows access by resource-owning user (in POSIX/Unix identified by UID) and no one else.
        @ S_GROUP_ACCESS
        Allows access by resource-owning user's containing group(s) (in POSIX/Unix identified by GID) and no ...
        @ S_NO_ACCESS
        Forbids all access, even by the creator's user. Most likely this would be useful for testing or debug...
        -
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:116
        -
        bipc::open_only_t Open_only
        Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
        Definition: util_fwd.hpp:149
        -
        ::gid_t group_id_t
        Syntactic-sugary type for POSIX group ID (integer).
        Definition: util_fwd.hpp:143
        +
        flow::async::Task Task
        Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
        Definition: util_fwd.hpp:122
        +
        bipc::open_only_t Open_only
        Tag type indicating an ideally-atomic open-if-exists-else-fail operation.
        Definition: util_fwd.hpp:155
        +
        ::gid_t group_id_t
        Syntactic-sugary type for POSIX group ID (integer).
        Definition: util_fwd.hpp:149
        const Open_or_create OPEN_OR_CREATE
        Tag value indicating an open-if-exists-else-create operation.
        Definition: util.cpp:30
        -
        ::uid_t user_id_t
        Syntactic-sugary type for POSIX user ID (integer).
        Definition: util_fwd.hpp:140
        +
        ::uid_t user_id_t
        Syntactic-sugary type for POSIX user ID (integer).
        Definition: util_fwd.hpp:146
        const Open_only OPEN_ONLY
        Tag value indicating an atomic open-if-exists-else-fail operation.
        Definition: util.cpp:31
        -
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:134
        +
        boost::asio::mutable_buffer Blob_mutable
        Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
        Definition: util_fwd.hpp:140
        bool process_running(process_id_t process_id)
        Returns true if and only if the given process (by PID) is reported as running by the OS.
        Definition: util.cpp:134
        -
        bipc::open_or_create_t Open_or_create
        Tag type indicating an atomic open-if-exists-else-create operation.
        Definition: util_fwd.hpp:146
        -
        bipc::create_only_t Create_only
        Tag type indicating a create-unless-exists-else-fail operation.
        Definition: util_fwd.hpp:152
        -
        flow::Fine_time_pt Fine_time_pt
        Short-hand for Flow's Fine_time_pt.
        Definition: util_fwd.hpp:113
        +
        bipc::open_or_create_t Open_or_create
        Tag type indicating an atomic open-if-exists-else-create operation.
        Definition: util_fwd.hpp:152
        +
        bipc::create_only_t Create_only
        Tag type indicating a create-unless-exists-else-fail operation.
        Definition: util_fwd.hpp:158
        +
        flow::Fine_time_pt Fine_time_pt
        Short-hand for Flow's Fine_time_pt.
        Definition: util_fwd.hpp:119
        void set_resource_permissions(flow::log::Logger *logger_ptr, const fs::path &path, const Permissions &perms, Error_code *err_code)
        Utility that sets the permissions of the given resource (at the supplied file system path) to specifi...
        Definition: util.cpp:46
        Permissions shared_resource_permissions(Permissions_level permissions_lvl)
        Maps general Permissions_level specifier to low-level Permissions value, when the underlying resource...
        Definition: util.cpp:37
        -
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:111
        +
        flow::Fine_duration Fine_duration
        Short-hand for Flow's Fine_duration.
        Definition: util_fwd.hpp:117
        const std::string EMPTY_STRING
        A (default-cted) string. May be useful for functions returning const std::string&.
        Definition: util.cpp:33
        const Create_only CREATE_ONLY
        Tag value indicating an atomic create-unless-exists-else-fail operation.
        Definition: util.cpp:32
        -
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:128
        -
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:109
        +
        boost::asio::const_buffer Blob_const
        Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
        Definition: util_fwd.hpp:134
        +
        flow::util::String_view String_view
        Short-hand for Flow's String_view.
        Definition: util_fwd.hpp:115
        @ S_END_SENTINEL
        CAUTION – see ipc::Log_component doc header for directions to find actual members of this enum class.
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298
        -
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        +
        A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
        diff --git a/doc/ipc_doc/generated/html_public/about.html b/doc/ipc_doc/generated/html_public/about.html index 1dd3e3764..51fb8888c 100644 --- a/doc/ipc_doc/generated/html_public/about.html +++ b/doc/ipc_doc/generated/html_public/about.html @@ -21,7 +21,7 @@ -
        Flow-IPC 1.0.1 +
        Flow-IPC 1.0.2
        Flow-IPC project: Public API.
        @@ -122,7 +122,7 @@

        Future directions of work

      • Networked IPC: At the moment all IPC supported by Flow-IPC is between processes within a given machine (node). A session can only be established that way for now. Extending this to establish IPC sessions via network would be easy. Unix-domain-socket-based low-level transports would easily be extended to work via TCP sockets (at least). This is a very natural next step for Flow-IPC development: a low-hanging fruit.
      • Networked "shared memory" (RDMA): While the preceding bullet point would have clear utility, naturally the zero-copy aspect of the existing Flow-IPC cannot directly translate across a networked session: It is internally achieved using SHM, but there is no shared memory between two separate machines. There is, however, Remote Direct Memory Access (RDMA): direct memory access from the memory of one computer into that of another without involving either one's OS. While assuredly non-trivial, leveraging RDMA in Flow-IPC might allow for a major improvement over the feature in the preceding bullet point, analogously to how SHM-based zero-copy hugely improves upon basic IPC.
      • Beyond C++: This is a C++ project at this time, but languages including Rust and Go have gained well-deserved popularity as well. In a similar way that (for example) Cap'n Proto's original core is in C++, but there are implementations for other languages, it would make sense for the same to happen for Flow-IPC. There are no technical stumbling blocks for this; it is only a question of time and effort.
      • -
      • More architectures: As of this writing, Flow-IPC targets Linux + x86-64. MacOS/Darwin/FreeBSD support is attainable with a few weeks of work, we estimate. (Could tackle Windows as well.) Supporting other hardware architectures, such as ARM64, is also doable and valuable. We'd like to do these things: by far most of the code is platform-independent, the exceptions being certain internal low-level details typically involving shared memory and pointer tagging in the SHM-jemalloc sub-component.
      • +
      • More architectures: As of this writing, Flow-IPC targets Linux + x86-64. macOS/Darwin/similar support is attainable with a few weeks of work, we estimate. (Could tackle Windows as well.) Supporting other hardware architectures, such as ARM64, is also doable and valuable. We'd like to do these things: by far most of the code is platform-independent, the exceptions being certain internal low-level details typically involving shared memory and pointer tagging in the SHM-jemalloc sub-component.

      We welcome feedback, ideas, and (of course) pull requests of all kinds!


      @@ -132,7 +132,7 @@

      Future directions of work

      diff --git a/doc/ipc_doc/generated/html_public/annotated.html b/doc/ipc_doc/generated/html_public/annotated.html index 7f2374154..ad6c6af85 100644 --- a/doc/ipc_doc/generated/html_public/annotated.html +++ b/doc/ipc_doc/generated/html_public/annotated.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -181,7 +181,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/api_overview.html b/doc/ipc_doc/generated/html_public/api_overview.html index dcdb17d64..5323e93a8 100644 --- a/doc/ipc_doc/generated/html_public/api_overview.html +++ b/doc/ipc_doc/generated/html_public/api_overview.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -140,7 +140,7 @@

      Sessions

      // NOTE: Upon opening session, capabilities of `session` on either side are **exactly the same**.
      // Client/server status matters only when establishing the IPC conversation;
      // the conversation itself once established is arbitrariy and up to you fully.
      -
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:297
      +
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:298

      Open channel(s) in a session:

      • Easiest: Have them be pre-opened, so that they're ready from the session start:
      @@ -341,20 +341,20 @@

      Transport (unstructured)

      A Channel with a blobs pipe consisting of 2 MQs of type Persistent_mq_handle (template arg); and a ha...
      Definition: channel.hpp:1278
      A server object that binds to a Shared_name and listens for incoming Native_socket_stream connect att...
      Definition: native_socket_stream_acceptor.hpp:105
      Implements both Native_handle_sender and Native_handle_receiver concepts by using a stream-oriented U...
      Definition: native_socket_stream.hpp:271
      -
      Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
      Definition: posix_mq_handle.hpp:62
      +
      Implements the Persistent_mq_handle concept by wrapping the POSIX message queue API (see man mq_overv...
      Definition: posix_mq_handle.hpp:63
      A Channel with a blobs pipe only (no handles pipe) that uses a Unix domain socket connection as the u...
      Definition: channel.hpp:1097
      A Channel with a handles pipe only (no blobs pipe) that uses a Unix domain socket connection as the u...
      Definition: channel.hpp:1029
      A process's credentials (PID, UID, GID as of this writing).
      Definition: process_credentials.hpp:39
      std::string process_invoked_as(Error_code *err_code=0) const
      Obtains, from the OS, information as to the binary name via which process process_id() was started,...
      Definition: process_credentials.cpp:62
      Short-hand for boost.asio Unix domain socket namespace.
      Protocol::socket Peer_socket
      Short-hand for boost.asio Unix domain peer stream-socket (usually-connected-or-empty guy).
      Definition: asio_local_stream_socket_fwd.hpp:114
      -
      Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
      Definition: asio_local_stream_socket.cpp:31
      +
      Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...
      Definition: asio_local_stream_socket.cpp:32
      Flow-IPC module containing miscellaneous general-use facilities that ubiquitously used by ~all Flow-I...
      Definition: default_init_allocator.hpp:24
      const Open_or_create OPEN_OR_CREATE
      Tag value indicating an open-if-exists-else-create operation.
      Definition: util.cpp:30
      const Open_only OPEN_ONLY
      Tag value indicating an atomic open-if-exists-else-fail operation.
      Definition: util.cpp:31
      -
      boost::asio::mutable_buffer Blob_mutable
      Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
      Definition: util_fwd.hpp:134
      -
      boost::asio::const_buffer Blob_const
      Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
      Definition: util_fwd.hpp:128
      -
      A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
      Definition: native_handle.hpp:62
      +
      boost::asio::mutable_buffer Blob_mutable
      Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
      Definition: util_fwd.hpp:140
      +
      boost::asio::const_buffer Blob_const
      Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.
      Definition: util_fwd.hpp:134
      +
      A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
      Definition: native_handle.hpp:63

      All those subleties about different types of pipes in a Channel bundle completely disappear when one deals with structured-data struc::Channels. They are a higher-layer abstraction and will leverage whatever transport::Channel it adapts. In addition to handling capnp-encoded structured data and SHM-backed zero-copy, it also provides basics like request/response, request-method multiplexing, and a bit more. So let's get into that.

      Transport (structured)

      @@ -681,7 +681,7 @@

      Safety

      diff --git a/doc/ipc_doc/generated/html_public/app_8cpp.html b/doc/ipc_doc/generated/html_public/app_8cpp.html index 8f5f60536..8adf65bbf 100644 --- a/doc/ipc_doc/generated/html_public/app_8cpp.html +++ b/doc/ipc_doc/generated/html_public/app_8cpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -104,7 +104,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/app_8hpp.html b/doc/ipc_doc/generated/html_public/app_8hpp.html index 619ec5d14..5d769e611 100644 --- a/doc/ipc_doc/generated/html_public/app_8hpp.html +++ b/doc/ipc_doc/generated/html_public/app_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -98,7 +98,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/arena__activator_8hpp.html b/doc/ipc_doc/generated/html_public/arena__activator_8hpp.html index bd51ac31c..f89269c14 100644 --- a/doc/ipc_doc/generated/html_public/arena__activator_8hpp.html +++ b/doc/ipc_doc/generated/html_public/arena__activator_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -95,7 +95,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8cpp.html b/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8cpp.html index 6f188adac..89a59c9a1 100644 --- a/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8cpp.html +++ b/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8cpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -101,7 +101,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8hpp.html b/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8hpp.html index 7f7918850..72940d06b 100644 --- a/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8hpp.html +++ b/doc/ipc_doc/generated/html_public/asio__local__stream__socket_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -111,7 +111,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/asio__local__stream__socket__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/asio__local__stream__socket__fwd_8hpp.html index c05ba5f83..d975b0501 100644 --- a/doc/ipc_doc/generated/html_public/asio__local__stream__socket__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/asio__local__stream__socket__fwd_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -136,7 +136,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8cpp.html b/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8cpp.html index 74e6d04bf..9de008bf3 100644 --- a/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8cpp.html +++ b/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8cpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -88,7 +88,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8hpp.html b/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8hpp.html index 995f3517f..ff2e4aa80 100644 --- a/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8hpp.html +++ b/doc/ipc_doc/generated/html_public/asio__waitable__native__hndl_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -95,7 +95,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/async_loop.html b/doc/ipc_doc/generated/html_public/async_loop.html index e1bc251d4..102420f5b 100644 --- a/doc/ipc_doc/generated/html_public/async_loop.html +++ b/doc/ipc_doc/generated/html_public/async_loop.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -102,13 +102,13 @@

      Your application's event loop versus an Flow-IPC async op

      That note aside: The most basic operation of interest to us has the following form:

      template<typename Task> // Task = function type matching signature `void F()`.
      void post(Task&& task);
      -
      flow::async::Task Task
      Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
      Definition: util_fwd.hpp:116
      +
      flow::async::Task Task
      Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
      Definition: util_fwd.hpp:122

      This operation, invokable both from within an already-executing task on thread U, or from any other thread, enqueues std::move(task) onto the task-queue, so that run() either wakes up thread U (if currently sleeping) and executes task() (no args), or else it'll get invoked once ongoing tasks have been executed and popped. post() itself does not synchronously invoke task(); but if invoked from within a task (i.e., from thread U, i.e., from run() itself), then run() will possibly invoke the moment the current (posting) task returns.

      Note
      post() is thread-safe, in that it takes care of any synchronization of the internally-kept task-queue, itself.

      Now, consider the aforementioned Blob_receiver receive op. Its API is as follows:

      template<typename Handler> // Handler = function type matching signature `void F(const Error_code&, size_t n_sz)`.
      void async_receive_blob(ipc::util::Blob_mutable target_buf, Handler&& handler);
      -
      boost::asio::mutable_buffer Blob_mutable
      Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
      Definition: util_fwd.hpp:134
      +
      boost::asio::mutable_buffer Blob_mutable
      Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.
      Definition: util_fwd.hpp:140

      To use it, a task in the context of an event loop in thread U might be written as follows:

      class My_loop
      {
      @@ -161,7 +161,7 @@

      Your application's event loop versus an Flow-IPC async op

      }
      };
      @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
      Async completion handler is being called prematurely, because underlying object is shutting down,...
      -
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:297
      +
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:298

      The key points:

      • When operating according to this pattern, the user handler is always invoked from (formally) "unspecified thread that is not thread U." In reality it is thread W in our case, but that should not matter.
      • In the proactor pattern – when there's only one thread U as opposed to concurrent workers U1, U2, ... – user tasks can safely assume they're never invoked concurrently with each other. Therefore, usually, the completion handler supplied to this Flow-IPC API (Blob_receiver::async_receive_blob() in this case) should perform the bulk of its work in thread U and thus must invoke post(), capturing any required args in the lambda first.
          @@ -299,7 +299,7 @@

          Recap

      diff --git a/doc/ipc_doc/generated/html_public/bipc__mq__handle_8cpp.html b/doc/ipc_doc/generated/html_public/bipc__mq__handle_8cpp.html index 592472a8a..b6878076d 100644 --- a/doc/ipc_doc/generated/html_public/bipc__mq__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_public/bipc__mq__handle_8cpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -95,7 +95,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/bipc__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_public/bipc__mq__handle_8hpp.html index 647b1d121..b69f8a424 100644 --- a/doc/ipc_doc/generated/html_public/bipc__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_public/bipc__mq__handle_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -92,7 +92,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/blob__stream__mq_8hpp.html b/doc/ipc_doc/generated/html_public/blob__stream__mq_8hpp.html index 3dd05e324..5b4675f94 100644 --- a/doc/ipc_doc/generated/html_public/blob__stream__mq_8hpp.html +++ b/doc/ipc_doc/generated/html_public/blob__stream__mq_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -92,7 +92,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/blob__stream__mq__rcv_8hpp.html b/doc/ipc_doc/generated/html_public/blob__stream__mq__rcv_8hpp.html index d4c7d10cb..efbad1091 100644 --- a/doc/ipc_doc/generated/html_public/blob__stream__mq__rcv_8hpp.html +++ b/doc/ipc_doc/generated/html_public/blob__stream__mq__rcv_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -100,7 +100,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/blob__stream__mq__snd_8hpp.html b/doc/ipc_doc/generated/html_public/blob__stream__mq__snd_8hpp.html index 64b7fd53f..788502183 100644 --- a/doc/ipc_doc/generated/html_public/blob__stream__mq__snd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/blob__stream__mq__snd_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -100,7 +100,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/blob__transport_8hpp.html b/doc/ipc_doc/generated/html_public/blob__transport_8hpp.html index 60744a7bf..070533098 100644 --- a/doc/ipc_doc/generated/html_public/blob__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_public/blob__transport_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -95,7 +95,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/capnp__msg__builder_8hpp.html b/doc/ipc_doc/generated/html_public/capnp__msg__builder_8hpp.html index 40955e14d..c4816d832 100644 --- a/doc/ipc_doc/generated/html_public/capnp__msg__builder_8hpp.html +++ b/doc/ipc_doc/generated/html_public/capnp__msg__builder_8hpp.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -106,7 +106,7 @@
      diff --git a/doc/ipc_doc/generated/html_public/chan_open.html b/doc/ipc_doc/generated/html_public/chan_open.html index 440c1138d..093991aee 100644 --- a/doc/ipc_doc/generated/html_public/chan_open.html +++ b/doc/ipc_doc/generated/html_public/chan_open.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -197,7 +197,7 @@

      Opening init-channels

      // Operate on `session` (etc.) in here, long-term, until it is hosed.
      go_do_ipc_yay(...);
      } // namespace my_meta_app
      -
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:297
      +
      flow::Error_code Error_code
      Short-hand for flow::Error_code which is very common.
      Definition: common.hpp:298

      On the server end, accordingly:

      // ...
      using Session_server = Session_server_t<...knob1..., ...knob2...,
      @@ -399,7 +399,7 @@

      Opening init-channels

      diff --git a/doc/ipc_doc/generated/html_public/chan_struct.html b/doc/ipc_doc/generated/html_public/chan_struct.html index d10a52869..3bc39d0b0 100644 --- a/doc/ipc_doc/generated/html_public/chan_struct.html +++ b/doc/ipc_doc/generated/html_public/chan_struct.html @@ -21,7 +21,7 @@ -
      Flow-IPC 1.0.1 +
      Flow-IPC 1.0.2
      Flow-IPC project: Public API.
      @@ -215,7 +215,7 @@

      Creating and mutating out-messages

      msg.store_native_handle_or_null(Native_handle(::dup(STDOUT_FILENO)));
      // Receiving process -- upon receipt -- can write to that FD and cause output to appear in *our* stdout.
      util::Native_handle Native_handle
      Convenience alias for the commonly used type util::Native_handle.
      Definition: transport_fwd.hpp:81
      -
      A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
      Definition: native_handle.hpp:62
      +
      A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.
      Definition: native_handle.hpp:63

      Sending notification messages

      So you've loaded up your struc::Channel::Msg_out a/k/a struc::Msg_out. Now you'll presumably want to send it. The Msg_out is a message, while a message actually sent via channel (and received by the opposing side) is a message instance. Therefore the act of invoking one of the send methods of a struc::Channel (.send(), .async_request(), .sync_request()) creates a message instance from a message – which the opposing side obtains as an ipc::transport::struc::Msg_in (but more on this later). All properties of a message instance are contained either in the message itself or in the arguments to the chosen struc::Channel send method; they cannot be changed subsequently.

      A message is a message; but a message instance is one of 2 things:

        @@ -579,7 +579,7 @@

        Errors

        // ...Destroy channel. See next section of Manual....
        }
        -
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:297
        +
        flow::Error_code Error_code
        Short-hand for flow::Error_code which is very common.
        Definition: common.hpp:298

        Chronologically:

        1. Point X: We've called .expect_msg(). Say it returned true which means the channel is not hosed at that exact point in time. It, itself, lacks an err_code arg in its signature, so it cannot itself emit a new error.
        2. Point A: Apparently a message has arrived. So at that exact point the channel is not hosed either. Even if it is, .create_msg() has nothing to do with transmitting anything, and certainyl all the message-reading and -filling logic is orthogonal to the channel itself. No problem.
        3. @@ -617,7 +617,7 @@

          Destroying struc::Channel

          diff --git a/doc/ipc_doc/generated/html_public/chan_struct_advanced.html b/doc/ipc_doc/generated/html_public/chan_struct_advanced.html index 613e55581..ab39b6969 100644 --- a/doc/ipc_doc/generated/html_public/chan_struct_advanced.html +++ b/doc/ipc_doc/generated/html_public/chan_struct_advanced.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -165,7 +165,7 @@

          Message lifetime

          diff --git a/doc/ipc_doc/generated/html_public/channel__base_8hpp.html b/doc/ipc_doc/generated/html_public/channel__base_8hpp.html index bb08b3dac..8829dd858 100644 --- a/doc/ipc_doc/generated/html_public/channel__base_8hpp.html +++ b/doc/ipc_doc/generated/html_public/channel__base_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -104,7 +104,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classes.html b/doc/ipc_doc/generated/html_public/classes.html index e3ad8adf3..e8cb9c021 100644 --- a/doc/ipc_doc/generated/html_public/classes.html +++ b/doc/ipc_doc/generated/html_public/classes.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -111,7 +111,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv-members.html index 99de514b5..8db98d09d 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv.html index 9f85a2cf8..c51ffbc91 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Client__session__mv.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -648,7 +648,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv-members.html index a25bcead8..d252931c5 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -119,7 +119,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv.html index dcb244198..63e31f1ec 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Server__session__mv.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -631,7 +631,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session-members.html index 45834f6fe..408e5c151 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session.html index f41680e69..b66cd23ba 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -681,7 +681,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv-members.html index 229e5d4dc..abe553232 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -113,7 +113,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv.html index 76645deb8..25fc69fad 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__mv.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1047,7 +1047,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server-members.html index d1d7f5996..536d22145 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -86,7 +86,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server.html index dc186bd87..723f66586 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1Session__server.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -534,7 +534,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session-members.html index b140162d0..fa5a541c0 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -141,7 +141,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session.html index 469ba541e..8d7cdb4d4 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Server__session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -579,7 +579,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv-members.html index c4b39a096..caf5361aa 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv.html index 4dd1b2980..1573e0737 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__mv.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -629,7 +629,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server-members.html index 68f7aa974..735bbbd65 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server.html index 32ad74eef..ba70384b3 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1Session__server.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -629,7 +629,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session-members.html index fef62b979..cfaa7adef 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session.html index 39636b42b..99a90adb1 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Server__session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -333,7 +333,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv-members.html index 54e5bfcea..516e415ef 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv.html index 4543cde71..edd44edb7 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__mv.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -629,7 +629,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server-members.html index 664ef72a6..53a3d3b2c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server.html index a03012cc3..daaf05fb2 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1shm_1_1classic_1_1Session__server.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -643,7 +643,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter-members.html index 417874a0a..f69e01302 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter.html index 0c88628ad..186bf4cff 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Client__session__adapter.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -386,7 +386,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter-members.html index a54cefe13..4a81af56a 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -86,7 +86,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter.html index 3b931ba99..2e6411134 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Server__session__adapter.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -391,7 +391,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter-members.html index 49d3642fd..51a7d4199 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter.html b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter.html index c9c5c72cc..1b0c1e421 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1session_1_1sync__io_1_1Session__server__adapter.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -565,7 +565,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena-members.html index 854e5f85c..5bd5d243f 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -93,7 +93,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena.html index 594aeae5c..55ed22605 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1classic_1_1Pool__arena.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -904,7 +904,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator-members.html index f7bf738eb..c9bd472a8 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator.html index 660933b6e..9f7b74117 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Arena__activator.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -187,7 +187,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator-members.html index f6c5cc301..d55e323f4 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator.html b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator.html index 74d0008f9..1c39ae918 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1shm_1_1stl_1_1Stateless__allocator.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -478,7 +478,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle-members.html index acff1bc4b..da8fb1f90 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -111,7 +111,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle.html index cfa25c1ad..616acd2b3 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Bipc__mq__handle.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1350,7 +1350,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver-members.html index 33fc44667..69c42de8e 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver.html index 5181f1f6a..75dd986eb 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -391,7 +391,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender-members.html index 817afa9df..36a15b911 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender.html index 2baabe8b3..0b1fdb1a2 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -416,7 +416,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base-members.html index b1335254d..c227f431c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base.html index 72a883c1a..825f246df 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__base.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -219,7 +219,7 @@

          Rationale

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver-members.html index 66ebfeca3..10a5ea184 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -97,7 +97,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver.html index 7b7972f8a..7d9a9d2f6 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -686,7 +686,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender-members.html index c0a7bcbc4..e5ea1782c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -100,7 +100,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender.html index 604a9f3ca..a12bca273 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Blob__stream__mq__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -759,7 +759,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel-members.html index 91c72cdfa..5ff6395fb 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -131,7 +131,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel.html index 478a1eceb..1293971d8 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1715,7 +1715,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel-members.html index 1a4a90409..738237bf8 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -134,7 +134,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel.html index 1364be1dd..0a2944929 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -415,7 +415,7 @@

          Error semantics

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel-members.html index 247355453..b6e97fb5c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -137,7 +137,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel.html index a6cd2748e..ae1fb1c38 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Mqs__socket__stream__channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -447,7 +447,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver-members.html index ccfb0d54b..78b5c9292 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver.html index 529bea0fe..405593f41 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -493,7 +493,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender-members.html index f01415960..0989fd7b8 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender.html index 6c9301b07..ef96b44fb 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__handle__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -545,7 +545,7 @@

          Thread safety

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream-members.html index b39eabc85..b528b32dc 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -108,7 +108,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream.html index 7f661d0a0..ac6fc27bb 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1192,7 +1192,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor-members.html index abc8f8ce0..6e89aa714 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor.html index 0faeb674d..dd3967b12 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Native__socket__stream__acceptor.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -360,7 +360,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer-members.html index 26a8fdc8e..8a8d2d287 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer.html index e25ffc86b..df116ae0c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Null__peer.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -158,7 +158,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle-members.html index 77ec28022..27da205f7 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -110,7 +110,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle.html index f74dc2b4c..0d0ce3dba 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Persistent__mq__handle.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1340,7 +1340,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle-members.html index ecf1604c6..bf402816e 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle.html index 1e7b2a1f5..fd26c2226 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Posix__mq__handle.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1359,7 +1359,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator-members.html index a6d4cab78..e9ad54c66 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator.html index 6ec4a53f4..da74e30c7 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Protocol__negotiator.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -577,7 +577,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel-members.html index d26dd892b..2f3a4cf62 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -134,7 +134,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel.html index 6c73780fd..a582c4c14 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -402,7 +402,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs-members.html index a284fa76c..3f46b67c3 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -134,7 +134,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html index 9773de652..5c5b836c8 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -406,7 +406,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials-members.html index c7555fd3a..481bfae0f 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -99,7 +99,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials.html index c90ed2398..70fbf4e49 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1asio__local__stream__socket_1_1Opt__peer__process__credentials.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -449,7 +449,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel-members.html index 70784ce9d..296fb5b91 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -116,7 +116,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel.html index da5dff537..2fe967719 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1668,7 +1668,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base-members.html index 8ca2bf57d..dada3c376 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base.html index 8ed3656b1..6addfcd3c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Channel__base.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -152,7 +152,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder-members.html index 23344f8bb..9e91177ef 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder.html index 37978a97e..002ae5bdd 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -480,7 +480,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder-members.html index 9da7843ed..773e1216e 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder.html index 8928643f2..3701bc166 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__fixed__builder__capnp__message__builder.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -287,7 +287,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader-members.html index 1aab69a9e..1aa3ed874 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader.html index b3e35201e..586e6a126 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Heap__reader.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -300,7 +300,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in-members.html index aea476e13..340916dad 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -97,7 +97,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in.html index 7d7e7e3f3..1985498d9 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__in.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -710,7 +710,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out-members.html index 34ee4f240..20a079414 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out.html index 269c59bbb..03afc4dd2 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Msg__out.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -717,7 +717,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder-members.html index 38c371057..aa9eb7421 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -86,7 +86,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder.html index 0dfcf0ddb..184d482fd 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__builder.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -395,7 +395,7 @@

          Errors

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader-members.html index 631eaf0ee..81a2e6fdd 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -84,7 +84,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader.html index 143d92b53..803c199aa 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1Struct__reader.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -341,7 +341,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder-members.html index d5f7269c3..b0cff4b77 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder.html index 71c5bbe3f..68f97fdc0 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -524,7 +524,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base-members.html index c103a915b..02c796dd0 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base.html index 450fb3727..eec49ac62 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Builder__base.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -125,7 +125,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder-members.html index 64c62ca94..85c4f4c87 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html index 57fff2b58..23df2cf41 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -444,7 +444,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader-members.html index 9526d4e80..f756febd5 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -83,7 +83,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader.html index e7c44b15a..69aece282 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1shm_1_1Reader.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -329,7 +329,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel-members.html index d176957ac..5088175bf 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -125,7 +125,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel.html index fc4ada6f7..b62cfe070 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1struc_1_1sync__io_1_1Channel.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1832,7 +1832,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver-members.html index e317d94f8..8e9f7f51f 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver.html index a1bb6fdb9..560b222ae 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -427,7 +427,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender-members.html index 35e023dae..b5679fd52 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender.html index 8002a0720..b3c9c51ad 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -475,7 +475,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver-members.html index e54a230ab..4cdd43103 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -102,7 +102,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver.html index 00f95b83a..5059a309c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -745,7 +745,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender-members.html index 9485a6b27..00b7b4e2e 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -103,7 +103,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender.html index ca6a3d2e3..a4fa6eae5 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Blob__stream__mq__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -778,7 +778,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver-members.html index e7f4dd4c7..8b23cd588 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver.html index 724b94a14..940be4ddd 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__receiver.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -444,7 +444,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender-members.html index 3c58b683f..948e94f19 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender.html index e1d205be6..f37abf468 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__handle__sender.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -516,7 +516,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream-members.html index 6acb7dbdf..447f31d2d 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -115,7 +115,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html index 6b5031fbc..878ff7ecd 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1403,7 +1403,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor-members.html index 103b9bd7d..1387b610a 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor.html b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor.html index d2d5ee249..5f857e69c 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1transport_1_1sync__io_1_1Native__socket__stream__acceptor.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -415,7 +415,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator-members.html index d7b6fe833..7e2fbb3a7 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator.html index fc0b32b54..c50470eb5 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Default__init__allocator.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -217,7 +217,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials-members.html index cceecd985..e4dc9f61b 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -91,7 +91,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials.html index 57fda6edc..7aca1bd70 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Process__credentials.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -634,7 +634,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name-members.html index e6940e161..85c5a2237 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -123,7 +123,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name.html index a6111855f..32e628b0e 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Shared__name.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -1748,7 +1748,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object-members.html index cb6961814..a947c7306 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object.html index a8b219e06..02ee5d977 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1Use__counted__object.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -127,7 +127,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle-members.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle-members.html index 72f9c7df3..5fd2ca1a6 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle-members.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -86,7 +86,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle.html b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle.html index 2eaa2fdd2..d9c4d442d 100644 --- a/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle.html +++ b/doc/ipc_doc/generated/html_public/classipc_1_1util_1_1sync__io_1_1Asio__waitable__native__handle.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -471,7 +471,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/client__session__adapter_8hpp.html b/doc/ipc_doc/generated/html_public/client__session__adapter_8hpp.html index 237d7b104..08145d2f1 100644 --- a/doc/ipc_doc/generated/html_public/client__session__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_public/client__session__adapter_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -103,7 +103,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/common_8cpp.html b/doc/ipc_doc/generated/html_public/common_8cpp.html index 7500489f3..342d4b7d6 100644 --- a/doc/ipc_doc/generated/html_public/common_8cpp.html +++ b/doc/ipc_doc/generated/html_public/common_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/common_8hpp.html b/doc/ipc_doc/generated/html_public/common_8hpp.html index 6dee999ee..79675bebf 100644 --- a/doc/ipc_doc/generated/html_public/common_8hpp.html +++ b/doc/ipc_doc/generated/html_public/common_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/default__init__allocator_8hpp.html b/doc/ipc_doc/generated/html_public/default__init__allocator_8hpp.html index d0fa4a3ef..e6fbb871f 100644 --- a/doc/ipc_doc/generated/html_public/default__init__allocator_8hpp.html +++ b/doc/ipc_doc/generated/html_public/default__init__allocator_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -92,7 +92,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_000000_000007.html b/doc/ipc_doc/generated/html_public/dir_000000_000007.html index c000519bd..345db3097 100644 --- a/doc/ipc_doc/generated/html_public/dir_000000_000007.html +++ b/doc/ipc_doc/generated/html_public/dir_000000_000007.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          arena_lend → session Relation

          File in session/shm/arena_lendIncludes file in session
          jemalloc / client_session.hppclient_session.hpp
          jemalloc / server_session.hppserver_session.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000000_000008.html b/doc/ipc_doc/generated/html_public/dir_000000_000008.html index 8ce111e15..785d7e961 100644 --- a/doc/ipc_doc/generated/html_public/dir_000000_000008.html +++ b/doc/ipc_doc/generated/html_public/dir_000000_000008.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          arena_lend → session Relation

          File in session/shm/arena_lendIncludes file in session
          jemalloc / jemalloc.hppshm / shm.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000000_000011.html b/doc/ipc_doc/generated/html_public/dir_000000_000011.html index be3cfe9e5..e3e4bec33 100644 --- a/doc/ipc_doc/generated/html_public/dir_000000_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000000_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          arena_lend → shm Relation

          File in session/shm/arena_lendIncludes file in shm
          jemalloc / session.hppstl / stateless_allocator.hpp
          jemalloc / session_server.hppclassic / pool_arena.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000000_000027.html b/doc/ipc_doc/generated/html_public/dir_000000_000027.html index 44cd70147..ea2f627a8 100644 --- a/doc/ipc_doc/generated/html_public/dir_000000_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000000_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          arena_lend → util Relation

          File in session/shm/arena_lendIncludes file in util
          jemalloc / error.cpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000001_000024.html b/doc/ipc_doc/generated/html_public/dir_000001_000024.html index c9ac52d38..d32bf61d7 100644 --- a/doc/ipc_doc/generated/html_public/dir_000001_000024.html +++ b/doc/ipc_doc/generated/html_public/dir_000001_000024.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          arena_lend → transport Relation

          File in transport/struc/shm/arena_lendIncludes file in transport
          jemalloc / jemalloc.hppstruc / shm / serializer.hpp
          jemalloc / jemalloc_fwd.hppstruc / shm / shm_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000002_000007.html b/doc/ipc_doc/generated/html_public/dir_000002_000007.html index 94189e4c2..baa18ff1f 100644 --- a/doc/ipc_doc/generated/html_public/dir_000002_000007.html +++ b/doc/ipc_doc/generated/html_public/dir_000002_000007.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          classic → session Relation

          File in session/shm/classicIncludes file in session
          client_session.hppclient_session.hpp
          server_session.hppserver_session.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000002_000011.html b/doc/ipc_doc/generated/html_public/dir_000002_000011.html index 3cd010aba..cd1a1aa84 100644 --- a/doc/ipc_doc/generated/html_public/dir_000002_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000002_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          classic → shm Relation

          File in session/shm/classicIncludes file in shm
          classic.hppclassic / classic_fwd.hpp
          classic.hppclassic / pool_arena.hpp
          client_session.hppclassic / classic.hpp
          server_session.hppclassic / classic.hpp
          session.hppclassic / classic.hpp
          session.hppstl / stateless_allocator.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000003_000015.html b/doc/ipc_doc/generated/html_public/dir_000003_000015.html index 17b6abcbe..dd79cb9a9 100644 --- a/doc/ipc_doc/generated/html_public/dir_000003_000015.html +++ b/doc/ipc_doc/generated/html_public/dir_000003_000015.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          classic → stl Relation

          File in shm/classicIncludes file in shm/stl
          classic_fwd.hppstl_fwd.hpp
          pool_arena.hpparena_activator.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000003_000027.html b/doc/ipc_doc/generated/html_public/dir_000003_000027.html index ae2b42db4..7093236a7 100644 --- a/doc/ipc_doc/generated/html_public/dir_000003_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000003_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          classic → util Relation

          File in shm/classicIncludes file in util
          classic_fwd.hppshared_name_fwd.hpp
          error.cpputil_fwd.hpp
          pool_arena.hppshared_name.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000004_000011.html b/doc/ipc_doc/generated/html_public/dir_000004_000011.html index 3dc027ad1..e2cb89d50 100644 --- a/doc/ipc_doc/generated/html_public/dir_000004_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000004_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          classic → shm Relation

          File in transport/struc/shm/classicIncludes file in shm
          classic_fwd.hppclassic / classic_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000005_000007.html b/doc/ipc_doc/generated/html_public/dir_000005_000007.html index 68df2b0e3..10bb651fa 100644 --- a/doc/ipc_doc/generated/html_public/dir_000005_000007.html +++ b/doc/ipc_doc/generated/html_public/dir_000005_000007.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          jemalloc → session Relation

          File in session/shm/arena_lend/jemallocIncludes file in session
          client_session.hppclient_session.hpp
          server_session.hppserver_session.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000005_000008.html b/doc/ipc_doc/generated/html_public/dir_000005_000008.html index 24a445274..a37f6033a 100644 --- a/doc/ipc_doc/generated/html_public/dir_000005_000008.html +++ b/doc/ipc_doc/generated/html_public/dir_000005_000008.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          jemalloc → session Relation

          File in session/shm/arena_lend/jemallocIncludes file in session
          jemalloc.hppshm / shm.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000005_000011.html b/doc/ipc_doc/generated/html_public/dir_000005_000011.html index 80b7ad52c..8d9ae2596 100644 --- a/doc/ipc_doc/generated/html_public/dir_000005_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000005_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          jemalloc → shm Relation

          File in session/shm/arena_lend/jemallocIncludes file in shm
          session.hppstl / stateless_allocator.hpp
          session_server.hppclassic / pool_arena.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000005_000027.html b/doc/ipc_doc/generated/html_public/dir_000005_000027.html index 318fc0b3f..1a81d173d 100644 --- a/doc/ipc_doc/generated/html_public/dir_000005_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000005_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          jemalloc → util Relation

          File in session/shm/arena_lend/jemallocIncludes file in util
          error.cpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000006_000024.html b/doc/ipc_doc/generated/html_public/dir_000006_000024.html index 7a675219f..61d46bccc 100644 --- a/doc/ipc_doc/generated/html_public/dir_000006_000024.html +++ b/doc/ipc_doc/generated/html_public/dir_000006_000024.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          jemalloc → transport Relation

          File in transport/struc/shm/arena_lend/jemallocIncludes file in transport
          jemalloc.hppstruc / shm / serializer.hpp
          jemalloc_fwd.hppstruc / shm / shm_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000007_000023.html b/doc/ipc_doc/generated/html_public/dir_000007_000023.html index 1b2714e1c..1343c1dc3 100644 --- a/doc/ipc_doc/generated/html_public/dir_000007_000023.html +++ b/doc/ipc_doc/generated/html_public/dir_000007_000023.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          session → transport Relation

          File in sessionIncludes file in transport
          session_fwd.hpptransport_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000007_000026.html b/doc/ipc_doc/generated/html_public/dir_000007_000026.html index 6be6fe156..70b09e5c6 100644 --- a/doc/ipc_doc/generated/html_public/dir_000007_000026.html +++ b/doc/ipc_doc/generated/html_public/dir_000007_000026.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          session → transport Relation

          File in sessionIncludes file in transport
          session.hppstruc / heap_serializer.hpp
          session_fwd.hppstruc / struc_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000007_000027.html b/doc/ipc_doc/generated/html_public/dir_000007_000027.html index 493dd373c..80fa4756b 100644 --- a/doc/ipc_doc/generated/html_public/dir_000007_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000007_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          session → util Relation

          File in sessionIncludes file in util
          app.cppnative_handle.hpp
          app.hpputil_fwd.hpp
          error.cpputil_fwd.hpp
          session_fwd.hppnative_handle.hpp
          session_fwd.hpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000010_000007.html b/doc/ipc_doc/generated/html_public/dir_000010_000007.html index 8ec9df238..069617942 100644 --- a/doc/ipc_doc/generated/html_public/dir_000010_000007.html +++ b/doc/ipc_doc/generated/html_public/dir_000010_000007.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → session Relation

          File in session/shmIncludes file in session
          classic / client_session.hppclient_session.hpp
          classic / server_session.hppserver_session.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000010_000011.html b/doc/ipc_doc/generated/html_public/dir_000010_000011.html index 9f14fff6a..274054813 100644 --- a/doc/ipc_doc/generated/html_public/dir_000010_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000010_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → shm Relation

          File in session/shmIncludes file in shm
          classic / classic.hppclassic / classic_fwd.hpp
          classic / classic.hppclassic / pool_arena.hpp
          classic / client_session.hppclassic / classic.hpp
          classic / server_session.hppclassic / classic.hpp
          classic / session.hppclassic / classic.hpp
          classic / session.hppstl / stateless_allocator.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000012_000008.html b/doc/ipc_doc/generated/html_public/dir_000012_000008.html index 2323028d0..992e85502 100644 --- a/doc/ipc_doc/generated/html_public/dir_000012_000008.html +++ b/doc/ipc_doc/generated/html_public/dir_000012_000008.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → session Relation

          File in transport/struc/shmIncludes file in session
          capnp_msg_builder.hppshm / shm.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000012_000011.html b/doc/ipc_doc/generated/html_public/dir_000012_000011.html index 9ea2ea716..bd1e64478 100644 --- a/doc/ipc_doc/generated/html_public/dir_000012_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000012_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → shm Relation

          File in transport/struc/shmIncludes file in shm
          capnp_msg_builder.hppstl / arena_activator.hpp
          capnp_msg_builder.hppshm.hpp
          capnp_msg_builder.hppstl / stateless_allocator.hpp
          classic / classic_fwd.hppclassic / classic_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000012_000026.html b/doc/ipc_doc/generated/html_public/dir_000012_000026.html index 6d1a99065..a11f99618 100644 --- a/doc/ipc_doc/generated/html_public/dir_000012_000026.html +++ b/doc/ipc_doc/generated/html_public/dir_000012_000026.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → transport Relation

          File in transport/struc/shmIncludes file in transport
          capnp_msg_builder.hppstruc / struc_fwd.hpp
          serializer.hppstruc / heap_serializer.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000012_000027.html b/doc/ipc_doc/generated/html_public/dir_000012_000027.html index f10834a86..dc417673e 100644 --- a/doc/ipc_doc/generated/html_public/dir_000012_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000012_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → util Relation

          File in transport/struc/shmIncludes file in util
          util.cpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000013_000007.html b/doc/ipc_doc/generated/html_public/dir_000013_000007.html index 4f16eacf8..2ba7757b4 100644 --- a/doc/ipc_doc/generated/html_public/dir_000013_000007.html +++ b/doc/ipc_doc/generated/html_public/dir_000013_000007.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → session Relation

          File in session/shmIncludes file in session
          arena_lend / jemalloc / client_session.hppclient_session.hpp
          arena_lend / jemalloc / server_session.hppserver_session.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000013_000008.html b/doc/ipc_doc/generated/html_public/dir_000013_000008.html index 644510072..30b148890 100644 --- a/doc/ipc_doc/generated/html_public/dir_000013_000008.html +++ b/doc/ipc_doc/generated/html_public/dir_000013_000008.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → session Relation

          File in session/shmIncludes file in session
          arena_lend / jemalloc / jemalloc.hppshm / shm.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000013_000011.html b/doc/ipc_doc/generated/html_public/dir_000013_000011.html index a7082ebc9..e9b83db82 100644 --- a/doc/ipc_doc/generated/html_public/dir_000013_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000013_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → shm Relation

          File in session/shmIncludes file in shm
          arena_lend / jemalloc / session.hppstl / stateless_allocator.hpp
          arena_lend / jemalloc / session_server.hppclassic / pool_arena.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000013_000027.html b/doc/ipc_doc/generated/html_public/dir_000013_000027.html index 3c532b882..0fddbd1b7 100644 --- a/doc/ipc_doc/generated/html_public/dir_000013_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000013_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → util Relation

          File in session/shmIncludes file in util
          arena_lend / jemalloc / error.cpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000014_000024.html b/doc/ipc_doc/generated/html_public/dir_000014_000024.html index 18768e7bc..1a3a817d9 100644 --- a/doc/ipc_doc/generated/html_public/dir_000014_000024.html +++ b/doc/ipc_doc/generated/html_public/dir_000014_000024.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          shm → transport Relation

          File in transport/struc/shmIncludes file in transport
          arena_lend / jemalloc / jemalloc.hppstruc / shm / serializer.hpp
          arena_lend / jemalloc / jemalloc_fwd.hppstruc / shm / shm_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000016_000008.html b/doc/ipc_doc/generated/html_public/dir_000016_000008.html index e99a50473..1bfa1836f 100644 --- a/doc/ipc_doc/generated/html_public/dir_000016_000008.html +++ b/doc/ipc_doc/generated/html_public/dir_000016_000008.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → session Relation

          File in transport/strucIncludes file in session
          shm / capnp_msg_builder.hppshm / shm.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000016_000011.html b/doc/ipc_doc/generated/html_public/dir_000016_000011.html index 3ec918e20..9c8e40825 100644 --- a/doc/ipc_doc/generated/html_public/dir_000016_000011.html +++ b/doc/ipc_doc/generated/html_public/dir_000016_000011.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → shm Relation

          File in transport/strucIncludes file in shm
          shm / capnp_msg_builder.hppstl / arena_activator.hpp
          shm / capnp_msg_builder.hppshm.hpp
          shm / capnp_msg_builder.hppstl / stateless_allocator.hpp
          shm / classic / classic_fwd.hppclassic / classic_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000016_000026.html b/doc/ipc_doc/generated/html_public/dir_000016_000026.html index c18e158d7..9c8e357a4 100644 --- a/doc/ipc_doc/generated/html_public/dir_000016_000026.html +++ b/doc/ipc_doc/generated/html_public/dir_000016_000026.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → transport Relation

          File in transport/strucIncludes file in transport
          shm / capnp_msg_builder.hppstruc / struc_fwd.hpp
          shm / serializer.hppstruc / heap_serializer.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000016_000027.html b/doc/ipc_doc/generated/html_public/dir_000016_000027.html index dece86d2d..a264ac8ba 100644 --- a/doc/ipc_doc/generated/html_public/dir_000016_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000016_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → util Relation

          File in transport/strucIncludes file in util
          shm / util.cpputil_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000017_000024.html b/doc/ipc_doc/generated/html_public/dir_000017_000024.html index 1ad1c0f9f..98298ac49 100644 --- a/doc/ipc_doc/generated/html_public/dir_000017_000024.html +++ b/doc/ipc_doc/generated/html_public/dir_000017_000024.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → transport Relation

          File in transport/strucIncludes file in transport
          shm / arena_lend / jemalloc / jemalloc.hppstruc / shm / serializer.hpp
          shm / arena_lend / jemalloc / jemalloc_fwd.hppstruc / shm / shm_fwd.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000018_000022.html b/doc/ipc_doc/generated/html_public/dir_000018_000022.html index 3fea11e11..3a51078cc 100644 --- a/doc/ipc_doc/generated/html_public/dir_000018_000022.html +++ b/doc/ipc_doc/generated/html_public/dir_000018_000022.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → sync_io Relation

          File in transport/strucIncludes file in transport/struc/sync_io
          channel.hppchannel.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000018_000023.html b/doc/ipc_doc/generated/html_public/dir_000018_000023.html index 1f52ed4f1..ce9a5ad0f 100644 --- a/doc/ipc_doc/generated/html_public/dir_000018_000023.html +++ b/doc/ipc_doc/generated/html_public/dir_000018_000023.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → transport Relation

          File in transport/strucIncludes file in transport
          msg.hppasio_local_stream_socket_fwd.hpp
          msg.hpptransport_fwd.hpp
          struc_fwd.hpptransport_fwd.hpp
          sync_io / channel.hppchannel.hpp
          sync_io / channel.hpperror.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000018_000027.html b/doc/ipc_doc/generated/html_public/dir_000018_000027.html index 8bb9b3bd7..cdb36e937 100644 --- a/doc/ipc_doc/generated/html_public/dir_000018_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000018_000027.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          struc → util Relation

          File in transport/strucIncludes file in util
          error.cpputil_fwd.hpp
          heap_serializer.hpputil_fwd.hpp
          msg.hppnative_handle.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000019_000027.html b/doc/ipc_doc/generated/html_public/dir_000019_000027.html index 1c4eb6208..ed725803c 100644 --- a/doc/ipc_doc/generated/html_public/dir_000019_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000019_000027.html @@ -21,7 +21,7 @@ - diff --git a/doc/ipc_doc/generated/html_public/dir_000022_000023.html b/doc/ipc_doc/generated/html_public/dir_000022_000023.html index 35a299a88..0e27cfae0 100644 --- a/doc/ipc_doc/generated/html_public/dir_000022_000023.html +++ b/doc/ipc_doc/generated/html_public/dir_000022_000023.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@

          sync_io → transport Relation

          File in transport/struc/sync_ioIncludes file in transport
          channel.hppchannel.hpp
          channel.hpperror.hpp
          diff --git a/doc/ipc_doc/generated/html_public/dir_000023_000019.html b/doc/ipc_doc/generated/html_public/dir_000023_000019.html index 7fdae9db5..9f6179384 100644 --- a/doc/ipc_doc/generated/html_public/dir_000023_000019.html +++ b/doc/ipc_doc/generated/html_public/dir_000023_000019.html @@ -21,7 +21,7 @@ - diff --git a/doc/ipc_doc/generated/html_public/dir_000023_000027.html b/doc/ipc_doc/generated/html_public/dir_000023_000027.html index c3b20720b..39c4d0100 100644 --- a/doc/ipc_doc/generated/html_public/dir_000023_000027.html +++ b/doc/ipc_doc/generated/html_public/dir_000023_000027.html @@ -21,7 +21,7 @@ - diff --git a/doc/ipc_doc/generated/html_public/dir_00580eb0cf40d799755587f5d56ed1cf.html b/doc/ipc_doc/generated/html_public/dir_00580eb0cf40d799755587f5d56ed1cf.html index dc8877201..d7ee54854 100644 --- a/doc/ipc_doc/generated/html_public/dir_00580eb0cf40d799755587f5d56ed1cf.html +++ b/doc/ipc_doc/generated/html_public/dir_00580eb0cf40d799755587f5d56ed1cf.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -99,7 +99,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_0c017496b493ff066fbbe686970307ba.html b/doc/ipc_doc/generated/html_public/dir_0c017496b493ff066fbbe686970307ba.html index 273291a6b..cf920e88e 100644 --- a/doc/ipc_doc/generated/html_public/dir_0c017496b493ff066fbbe686970307ba.html +++ b/doc/ipc_doc/generated/html_public/dir_0c017496b493ff066fbbe686970307ba.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -136,7 +136,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_18de54d40c020a62dfebd12c68fa56ae.html b/doc/ipc_doc/generated/html_public/dir_18de54d40c020a62dfebd12c68fa56ae.html index 318b1aafc..78c992699 100644 --- a/doc/ipc_doc/generated/html_public/dir_18de54d40c020a62dfebd12c68fa56ae.html +++ b/doc/ipc_doc/generated/html_public/dir_18de54d40c020a62dfebd12c68fa56ae.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_23fbec4e7c966aae2efbb90aeb47f596.html b/doc/ipc_doc/generated/html_public/dir_23fbec4e7c966aae2efbb90aeb47f596.html index 557257174..016eed371 100644 --- a/doc/ipc_doc/generated/html_public/dir_23fbec4e7c966aae2efbb90aeb47f596.html +++ b/doc/ipc_doc/generated/html_public/dir_23fbec4e7c966aae2efbb90aeb47f596.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_29eca46078f73b220c63d096b03a57e8.html b/doc/ipc_doc/generated/html_public/dir_29eca46078f73b220c63d096b03a57e8.html index a50ab211f..52f98dd94 100644 --- a/doc/ipc_doc/generated/html_public/dir_29eca46078f73b220c63d096b03a57e8.html +++ b/doc/ipc_doc/generated/html_public/dir_29eca46078f73b220c63d096b03a57e8.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_330ec51ed7bfaf381355aaef7c1667ec.html b/doc/ipc_doc/generated/html_public/dir_330ec51ed7bfaf381355aaef7c1667ec.html index 221dc94be..3ed04f1f3 100644 --- a/doc/ipc_doc/generated/html_public/dir_330ec51ed7bfaf381355aaef7c1667ec.html +++ b/doc/ipc_doc/generated/html_public/dir_330ec51ed7bfaf381355aaef7c1667ec.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_420eb5c69419e70df9303f96761e9dfb.html b/doc/ipc_doc/generated/html_public/dir_420eb5c69419e70df9303f96761e9dfb.html index 7d224ad09..c95a9f5d9 100644 --- a/doc/ipc_doc/generated/html_public/dir_420eb5c69419e70df9303f96761e9dfb.html +++ b/doc/ipc_doc/generated/html_public/dir_420eb5c69419e70df9303f96761e9dfb.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_49621dcf2e58f6d541462f9bec53bd7e.html b/doc/ipc_doc/generated/html_public/dir_49621dcf2e58f6d541462f9bec53bd7e.html index 647ff6d5f..73a0b1f9b 100644 --- a/doc/ipc_doc/generated/html_public/dir_49621dcf2e58f6d541462f9bec53bd7e.html +++ b/doc/ipc_doc/generated/html_public/dir_49621dcf2e58f6d541462f9bec53bd7e.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -92,7 +92,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_58e412aa7ace8e71fc01678dc8765e7c.html b/doc/ipc_doc/generated/html_public/dir_58e412aa7ace8e71fc01678dc8765e7c.html index faf765a63..592208eb9 100644 --- a/doc/ipc_doc/generated/html_public/dir_58e412aa7ace8e71fc01678dc8765e7c.html +++ b/doc/ipc_doc/generated/html_public/dir_58e412aa7ace8e71fc01678dc8765e7c.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_61dc77215bb335d1119be1f67ca641a9.html b/doc/ipc_doc/generated/html_public/dir_61dc77215bb335d1119be1f67ca641a9.html index 67670810d..ea1e4b22b 100644 --- a/doc/ipc_doc/generated/html_public/dir_61dc77215bb335d1119be1f67ca641a9.html +++ b/doc/ipc_doc/generated/html_public/dir_61dc77215bb335d1119be1f67ca641a9.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_6227a2031bab796131cf8c4b0b895649.html b/doc/ipc_doc/generated/html_public/dir_6227a2031bab796131cf8c4b0b895649.html index 5f55ed5e6..1963b7729 100644 --- a/doc/ipc_doc/generated/html_public/dir_6227a2031bab796131cf8c4b0b895649.html +++ b/doc/ipc_doc/generated/html_public/dir_6227a2031bab796131cf8c4b0b895649.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_6a9154929a3cacbead8390e6681e37b8.html b/doc/ipc_doc/generated/html_public/dir_6a9154929a3cacbead8390e6681e37b8.html index 5e64bcac9..6add4d69d 100644 --- a/doc/ipc_doc/generated/html_public/dir_6a9154929a3cacbead8390e6681e37b8.html +++ b/doc/ipc_doc/generated/html_public/dir_6a9154929a3cacbead8390e6681e37b8.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_6bf669985e0a4bfed5b74de88b3e7893.html b/doc/ipc_doc/generated/html_public/dir_6bf669985e0a4bfed5b74de88b3e7893.html index 8bd0aef82..a6cb0fe48 100644 --- a/doc/ipc_doc/generated/html_public/dir_6bf669985e0a4bfed5b74de88b3e7893.html +++ b/doc/ipc_doc/generated/html_public/dir_6bf669985e0a4bfed5b74de88b3e7893.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_938858dd290fe54e59e3500689c41d32.html b/doc/ipc_doc/generated/html_public/dir_938858dd290fe54e59e3500689c41d32.html index c3040043f..5e1b19c0b 100644 --- a/doc/ipc_doc/generated/html_public/dir_938858dd290fe54e59e3500689c41d32.html +++ b/doc/ipc_doc/generated/html_public/dir_938858dd290fe54e59e3500689c41d32.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -106,7 +106,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_a762a7cb84c76c9561dbc78c61068184.html b/doc/ipc_doc/generated/html_public/dir_a762a7cb84c76c9561dbc78c61068184.html index 988a67a87..a9ab9336d 100644 --- a/doc/ipc_doc/generated/html_public/dir_a762a7cb84c76c9561dbc78c61068184.html +++ b/doc/ipc_doc/generated/html_public/dir_a762a7cb84c76c9561dbc78c61068184.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -108,7 +108,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_a98fddea045b8b2df4350ebb1d483bf8.html b/doc/ipc_doc/generated/html_public/dir_a98fddea045b8b2df4350ebb1d483bf8.html index 6201eedef..c09045b24 100644 --- a/doc/ipc_doc/generated/html_public/dir_a98fddea045b8b2df4350ebb1d483bf8.html +++ b/doc/ipc_doc/generated/html_public/dir_a98fddea045b8b2df4350ebb1d483bf8.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_aa9b1de9a811fc0081d5a436dbc37c19.html b/doc/ipc_doc/generated/html_public/dir_aa9b1de9a811fc0081d5a436dbc37c19.html index 4786b8827..7fa85c5b8 100644 --- a/doc/ipc_doc/generated/html_public/dir_aa9b1de9a811fc0081d5a436dbc37c19.html +++ b/doc/ipc_doc/generated/html_public/dir_aa9b1de9a811fc0081d5a436dbc37c19.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_ad52dd8cdf71953d2954f95ecd6c0394.html b/doc/ipc_doc/generated/html_public/dir_ad52dd8cdf71953d2954f95ecd6c0394.html index 090c89c77..302ece868 100644 --- a/doc/ipc_doc/generated/html_public/dir_ad52dd8cdf71953d2954f95ecd6c0394.html +++ b/doc/ipc_doc/generated/html_public/dir_ad52dd8cdf71953d2954f95ecd6c0394.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_b574b0807182fd54d29cf48452072c45.html b/doc/ipc_doc/generated/html_public/dir_b574b0807182fd54d29cf48452072c45.html index 0f217f505..75612f9a2 100644 --- a/doc/ipc_doc/generated/html_public/dir_b574b0807182fd54d29cf48452072c45.html +++ b/doc/ipc_doc/generated/html_public/dir_b574b0807182fd54d29cf48452072c45.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_b8aa7e2e9741fa9cbe830a8616b13cfd.html b/doc/ipc_doc/generated/html_public/dir_b8aa7e2e9741fa9cbe830a8616b13cfd.html index 580ea0a5b..b35f3a1a7 100644 --- a/doc/ipc_doc/generated/html_public/dir_b8aa7e2e9741fa9cbe830a8616b13cfd.html +++ b/doc/ipc_doc/generated/html_public/dir_b8aa7e2e9741fa9cbe830a8616b13cfd.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_c7ea703034e45a505e1ea635ef215d07.html b/doc/ipc_doc/generated/html_public/dir_c7ea703034e45a505e1ea635ef215d07.html index f003e6194..7769c74b4 100644 --- a/doc/ipc_doc/generated/html_public/dir_c7ea703034e45a505e1ea635ef215d07.html +++ b/doc/ipc_doc/generated/html_public/dir_c7ea703034e45a505e1ea635ef215d07.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_d1a5353b5ceb9e8de9acee201f2ed2e4.html b/doc/ipc_doc/generated/html_public/dir_d1a5353b5ceb9e8de9acee201f2ed2e4.html index 6ebaf8219..77022d20c 100644 --- a/doc/ipc_doc/generated/html_public/dir_d1a5353b5ceb9e8de9acee201f2ed2e4.html +++ b/doc/ipc_doc/generated/html_public/dir_d1a5353b5ceb9e8de9acee201f2ed2e4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_d54aa94669c58d37a530f384e5a8d959.html b/doc/ipc_doc/generated/html_public/dir_d54aa94669c58d37a530f384e5a8d959.html index cb8c264d9..ca702bd0e 100644 --- a/doc/ipc_doc/generated/html_public/dir_d54aa94669c58d37a530f384e5a8d959.html +++ b/doc/ipc_doc/generated/html_public/dir_d54aa94669c58d37a530f384e5a8d959.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_d618e329fbb069400f9c6c11fc37efe1.html b/doc/ipc_doc/generated/html_public/dir_d618e329fbb069400f9c6c11fc37efe1.html index 2b8815d43..eb2bb3112 100644 --- a/doc/ipc_doc/generated/html_public/dir_d618e329fbb069400f9c6c11fc37efe1.html +++ b/doc/ipc_doc/generated/html_public/dir_d618e329fbb069400f9c6c11fc37efe1.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -99,7 +99,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_ddb0f12d0722949f40b2818843b69123.html b/doc/ipc_doc/generated/html_public/dir_ddb0f12d0722949f40b2818843b69123.html index 7e48d4e71..45741c7cc 100644 --- a/doc/ipc_doc/generated/html_public/dir_ddb0f12d0722949f40b2818843b69123.html +++ b/doc/ipc_doc/generated/html_public/dir_ddb0f12d0722949f40b2818843b69123.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_df5b0ac3fc1820ebfc25c1160f1f4b3a.html b/doc/ipc_doc/generated/html_public/dir_df5b0ac3fc1820ebfc25c1160f1f4b3a.html index 482f6c6c0..949c61bff 100644 --- a/doc/ipc_doc/generated/html_public/dir_df5b0ac3fc1820ebfc25c1160f1f4b3a.html +++ b/doc/ipc_doc/generated/html_public/dir_df5b0ac3fc1820ebfc25c1160f1f4b3a.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_e51dab5e9c0cdbd0180a6b7afdbe8a41.html b/doc/ipc_doc/generated/html_public/dir_e51dab5e9c0cdbd0180a6b7afdbe8a41.html index 37b54279a..060d8a183 100644 --- a/doc/ipc_doc/generated/html_public/dir_e51dab5e9c0cdbd0180a6b7afdbe8a41.html +++ b/doc/ipc_doc/generated/html_public/dir_e51dab5e9c0cdbd0180a6b7afdbe8a41.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/dir_ff5224d8270264443126f24ce9d073a6.html b/doc/ipc_doc/generated/html_public/dir_ff5224d8270264443126f24ce9d073a6.html index 7ea9c75cf..4ebcfed4e 100644 --- a/doc/ipc_doc/generated/html_public/dir_ff5224d8270264443126f24ce9d073a6.html +++ b/doc/ipc_doc/generated/html_public/dir_ff5224d8270264443126f24ce9d073a6.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -89,7 +89,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/files.html b/doc/ipc_doc/generated/html_public/files.html index 03bd7eceb..b237b1448 100644 --- a/doc/ipc_doc/generated/html_public/files.html +++ b/doc/ipc_doc/generated/html_public/files.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -211,7 +211,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/functions.html b/doc/ipc_doc/generated/html_public/functions.html index 7c8918e97..3b1170732 100644 --- a/doc/ipc_doc/generated/html_public/functions.html +++ b/doc/ipc_doc/generated/html_public/functions.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@

          - a -

          diff --git a/doc/ipc_doc/generated/html_public/functions_b.html b/doc/ipc_doc/generated/html_public/functions_b.html index 956431881..4b4b71480 100644 --- a/doc/ipc_doc/generated/html_public/functions_b.html +++ b/doc/ipc_doc/generated/html_public/functions_b.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -91,7 +91,7 @@

          - b -

          diff --git a/doc/ipc_doc/generated/html_public/functions_c.html b/doc/ipc_doc/generated/html_public/functions_c.html index 76734edb1..30faeb6f9 100644 --- a/doc/ipc_doc/generated/html_public/functions_c.html +++ b/doc/ipc_doc/generated/html_public/functions_c.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -84,7 +84,7 @@

          - c -

          diff --git a/doc/ipc_doc/generated/html_public/functions_d.html b/doc/ipc_doc/generated/html_public/functions_d.html index a4a5a28ea..4d74a7faf 100644 --- a/doc/ipc_doc/generated/html_public/functions_d.html +++ b/doc/ipc_doc/generated/html_public/functions_d.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@

          - d -

          diff --git a/doc/ipc_doc/generated/html_public/functions_e.html b/doc/ipc_doc/generated/html_public/functions_e.html index 04da89b57..f86c52f37 100644 --- a/doc/ipc_doc/generated/html_public/functions_e.html +++ b/doc/ipc_doc/generated/html_public/functions_e.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@

          - e -

          diff --git a/doc/ipc_doc/generated/html_public/functions_f.html b/doc/ipc_doc/generated/html_public/functions_f.html index 65e9fd46a..fdef723d4 100644 --- a/doc/ipc_doc/generated/html_public/functions_f.html +++ b/doc/ipc_doc/generated/html_public/functions_f.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -71,7 +71,7 @@

          - f -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func.html b/doc/ipc_doc/generated/html_public/functions_func.html index 32b0f4b43..0275d9ba7 100644 --- a/doc/ipc_doc/generated/html_public/functions_func.html +++ b/doc/ipc_doc/generated/html_public/functions_func.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -93,7 +93,7 @@

          - a -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_b.html b/doc/ipc_doc/generated/html_public/functions_func_b.html index 465082e69..1cf837638 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_b.html +++ b/doc/ipc_doc/generated/html_public/functions_func_b.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@

          - b -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_c.html b/doc/ipc_doc/generated/html_public/functions_func_c.html index c29c1003a..9609567a4 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_c.html +++ b/doc/ipc_doc/generated/html_public/functions_func_c.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@

          - c -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_d.html b/doc/ipc_doc/generated/html_public/functions_func_d.html index 3637189e0..63711bd17 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_d.html +++ b/doc/ipc_doc/generated/html_public/functions_func_d.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@

          - d -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_e.html b/doc/ipc_doc/generated/html_public/functions_func_e.html index c58927b02..fdbae73ef 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_e.html +++ b/doc/ipc_doc/generated/html_public/functions_func_e.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@

          - e -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_f.html b/doc/ipc_doc/generated/html_public/functions_func_f.html index 5a5ab1f6c..5435423a3 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_f.html +++ b/doc/ipc_doc/generated/html_public/functions_func_f.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -71,7 +71,7 @@

          - f -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_g.html b/doc/ipc_doc/generated/html_public/functions_func_g.html index 1946604d3..24561d1b2 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_g.html +++ b/doc/ipc_doc/generated/html_public/functions_func_g.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -74,7 +74,7 @@

          - g -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_h.html b/doc/ipc_doc/generated/html_public/functions_func_h.html index a2609864a..bd2412d59 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_h.html +++ b/doc/ipc_doc/generated/html_public/functions_func_h.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@

          - h -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_i.html b/doc/ipc_doc/generated/html_public/functions_func_i.html index 211611ff1..1eb51ec90 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_i.html +++ b/doc/ipc_doc/generated/html_public/functions_func_i.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -84,7 +84,7 @@

          - i -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_l.html b/doc/ipc_doc/generated/html_public/functions_func_l.html index 2a7d46dda..56608ae99 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_l.html +++ b/doc/ipc_doc/generated/html_public/functions_func_l.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -74,7 +74,7 @@

          - l -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_m.html b/doc/ipc_doc/generated/html_public/functions_func_m.html index aa295da17..d8174b443 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_m.html +++ b/doc/ipc_doc/generated/html_public/functions_func_m.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@

          - m -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_n.html b/doc/ipc_doc/generated/html_public/functions_func_n.html index 3dd42dc50..0e164dc20 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_n.html +++ b/doc/ipc_doc/generated/html_public/functions_func_n.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@

          - n -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_o.html b/doc/ipc_doc/generated/html_public/functions_func_o.html index d1a93a06b..21e4c446f 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_o.html +++ b/doc/ipc_doc/generated/html_public/functions_func_o.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@

          - o -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_p.html b/doc/ipc_doc/generated/html_public/functions_func_p.html index 95526f959..70a554bb1 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_p.html +++ b/doc/ipc_doc/generated/html_public/functions_func_p.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@

          - p -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_r.html b/doc/ipc_doc/generated/html_public/functions_func_r.html index 667658e24..6c68e930c 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_r.html +++ b/doc/ipc_doc/generated/html_public/functions_func_r.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@

          - r -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_s.html b/doc/ipc_doc/generated/html_public/functions_func_s.html index 07ecd222e..0229318c3 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_s.html +++ b/doc/ipc_doc/generated/html_public/functions_func_s.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@

          - s -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_t.html b/doc/ipc_doc/generated/html_public/functions_func_t.html index 572f9132d..eb2184727 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_t.html +++ b/doc/ipc_doc/generated/html_public/functions_func_t.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@

          - t -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_u.html b/doc/ipc_doc/generated/html_public/functions_func_u.html index 79007e8ee..ea14fea91 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_u.html +++ b/doc/ipc_doc/generated/html_public/functions_func_u.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@

          - u -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_w.html b/doc/ipc_doc/generated/html_public/functions_func_w.html index 0a652264f..1c5a53525 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_w.html +++ b/doc/ipc_doc/generated/html_public/functions_func_w.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -72,7 +72,7 @@

          - w -

          diff --git a/doc/ipc_doc/generated/html_public/functions_func_~.html b/doc/ipc_doc/generated/html_public/functions_func_~.html index 65eaae2fa..bb799012e 100644 --- a/doc/ipc_doc/generated/html_public/functions_func_~.html +++ b/doc/ipc_doc/generated/html_public/functions_func_~.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -97,7 +97,7 @@

          - ~ -

          diff --git a/doc/ipc_doc/generated/html_public/functions_g.html b/doc/ipc_doc/generated/html_public/functions_g.html index 8abfa1a5e..59da8bd90 100644 --- a/doc/ipc_doc/generated/html_public/functions_g.html +++ b/doc/ipc_doc/generated/html_public/functions_g.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -74,7 +74,7 @@

          - g -

          diff --git a/doc/ipc_doc/generated/html_public/functions_h.html b/doc/ipc_doc/generated/html_public/functions_h.html index 2e8f1b40f..0fe135fd6 100644 --- a/doc/ipc_doc/generated/html_public/functions_h.html +++ b/doc/ipc_doc/generated/html_public/functions_h.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@

          - h -

          diff --git a/doc/ipc_doc/generated/html_public/functions_i.html b/doc/ipc_doc/generated/html_public/functions_i.html index ed6d8b9ae..ca0648063 100644 --- a/doc/ipc_doc/generated/html_public/functions_i.html +++ b/doc/ipc_doc/generated/html_public/functions_i.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@

          - i -

          diff --git a/doc/ipc_doc/generated/html_public/functions_l.html b/doc/ipc_doc/generated/html_public/functions_l.html index c01abab59..0e80368ad 100644 --- a/doc/ipc_doc/generated/html_public/functions_l.html +++ b/doc/ipc_doc/generated/html_public/functions_l.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -74,7 +74,7 @@

          - l -

          diff --git a/doc/ipc_doc/generated/html_public/functions_m.html b/doc/ipc_doc/generated/html_public/functions_m.html index 0e0bc5572..be2ca7128 100644 --- a/doc/ipc_doc/generated/html_public/functions_m.html +++ b/doc/ipc_doc/generated/html_public/functions_m.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -116,7 +116,7 @@

          - m -

          diff --git a/doc/ipc_doc/generated/html_public/functions_n.html b/doc/ipc_doc/generated/html_public/functions_n.html index 60112039f..c700b1c13 100644 --- a/doc/ipc_doc/generated/html_public/functions_n.html +++ b/doc/ipc_doc/generated/html_public/functions_n.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@

          - n -

          diff --git a/doc/ipc_doc/generated/html_public/functions_o.html b/doc/ipc_doc/generated/html_public/functions_o.html index 958931747..5729d40a9 100644 --- a/doc/ipc_doc/generated/html_public/functions_o.html +++ b/doc/ipc_doc/generated/html_public/functions_o.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@

          - o -

          diff --git a/doc/ipc_doc/generated/html_public/functions_p.html b/doc/ipc_doc/generated/html_public/functions_p.html index e92524053..a003d0829 100644 --- a/doc/ipc_doc/generated/html_public/functions_p.html +++ b/doc/ipc_doc/generated/html_public/functions_p.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -83,7 +83,7 @@

          - p -

          diff --git a/doc/ipc_doc/generated/html_public/functions_r.html b/doc/ipc_doc/generated/html_public/functions_r.html index ecdc53a06..62c838370 100644 --- a/doc/ipc_doc/generated/html_public/functions_r.html +++ b/doc/ipc_doc/generated/html_public/functions_r.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@

          - r -

          diff --git a/doc/ipc_doc/generated/html_public/functions_rela.html b/doc/ipc_doc/generated/html_public/functions_rela.html index 9a05df374..fefcf4dc0 100644 --- a/doc/ipc_doc/generated/html_public/functions_rela.html +++ b/doc/ipc_doc/generated/html_public/functions_rela.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -70,7 +70,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/functions_s.html b/doc/ipc_doc/generated/html_public/functions_s.html index ed50645bf..02891f3db 100644 --- a/doc/ipc_doc/generated/html_public/functions_s.html +++ b/doc/ipc_doc/generated/html_public/functions_s.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -163,7 +163,7 @@

          - s -

          diff --git a/doc/ipc_doc/generated/html_public/functions_t.html b/doc/ipc_doc/generated/html_public/functions_t.html index 3418def5f..a96b1e560 100644 --- a/doc/ipc_doc/generated/html_public/functions_t.html +++ b/doc/ipc_doc/generated/html_public/functions_t.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@

          - t -

          diff --git a/doc/ipc_doc/generated/html_public/functions_type.html b/doc/ipc_doc/generated/html_public/functions_type.html index c76a24793..13d5a57a8 100644 --- a/doc/ipc_doc/generated/html_public/functions_type.html +++ b/doc/ipc_doc/generated/html_public/functions_type.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -184,7 +184,7 @@

          - v -

          diff --git a/doc/ipc_doc/generated/html_public/functions_u.html b/doc/ipc_doc/generated/html_public/functions_u.html index aef002dd5..78e68a721 100644 --- a/doc/ipc_doc/generated/html_public/functions_u.html +++ b/doc/ipc_doc/generated/html_public/functions_u.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@

          - u -

          diff --git a/doc/ipc_doc/generated/html_public/functions_v.html b/doc/ipc_doc/generated/html_public/functions_v.html index f742e0f63..0bda03baf 100644 --- a/doc/ipc_doc/generated/html_public/functions_v.html +++ b/doc/ipc_doc/generated/html_public/functions_v.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -73,7 +73,7 @@

          - v -

          diff --git a/doc/ipc_doc/generated/html_public/functions_vars.html b/doc/ipc_doc/generated/html_public/functions_vars.html index 0d71394a6..28acfdc94 100644 --- a/doc/ipc_doc/generated/html_public/functions_vars.html +++ b/doc/ipc_doc/generated/html_public/functions_vars.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -132,7 +132,7 @@

          - v -

          diff --git a/doc/ipc_doc/generated/html_public/functions_w.html b/doc/ipc_doc/generated/html_public/functions_w.html index cd2d6695e..63a7b97d2 100644 --- a/doc/ipc_doc/generated/html_public/functions_w.html +++ b/doc/ipc_doc/generated/html_public/functions_w.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -72,7 +72,7 @@

          - w -

          diff --git a/doc/ipc_doc/generated/html_public/functions_~.html b/doc/ipc_doc/generated/html_public/functions_~.html index 928a4e6fd..6afbe0969 100644 --- a/doc/ipc_doc/generated/html_public/functions_~.html +++ b/doc/ipc_doc/generated/html_public/functions_~.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -97,7 +97,7 @@

          - ~ -

          diff --git a/doc/ipc_doc/generated/html_public/globals.html b/doc/ipc_doc/generated/html_public/globals.html index 61a9ee0f9..c35e571c6 100644 --- a/doc/ipc_doc/generated/html_public/globals.html +++ b/doc/ipc_doc/generated/html_public/globals.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -108,7 +108,7 @@

          - t -

          diff --git a/doc/ipc_doc/generated/html_public/globals_defs.html b/doc/ipc_doc/generated/html_public/globals_defs.html index 30458d85b..df5ff0466 100644 --- a/doc/ipc_doc/generated/html_public/globals_defs.html +++ b/doc/ipc_doc/generated/html_public/globals_defs.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -108,7 +108,7 @@

          - t -

          diff --git a/doc/ipc_doc/generated/html_public/graph_legend.html b/doc/ipc_doc/generated/html_public/graph_legend.html index 604a27155..02c4ee8d3 100644 --- a/doc/ipc_doc/generated/html_public/graph_legend.html +++ b/doc/ipc_doc/generated/html_public/graph_legend.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -129,7 +129,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8cpp.html b/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8cpp.html index e108325b4..dd9872c9f 100644 --- a/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8cpp.html +++ b/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -88,7 +88,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8hpp.html b/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8hpp.html index 75ef271c1..104a2fc42 100644 --- a/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8hpp.html +++ b/doc/ipc_doc/generated/html_public/heap__fixed__builder__capnp__msg__builder_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/heap__serializer_8cpp.html b/doc/ipc_doc/generated/html_public/heap__serializer_8cpp.html index c96d40445..0dcb1f09a 100644 --- a/doc/ipc_doc/generated/html_public/heap__serializer_8cpp.html +++ b/doc/ipc_doc/generated/html_public/heap__serializer_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/heap__serializer_8hpp.html b/doc/ipc_doc/generated/html_public/heap__serializer_8hpp.html index 0f753767c..112ee20e3 100644 --- a/doc/ipc_doc/generated/html_public/heap__serializer_8hpp.html +++ b/doc/ipc_doc/generated/html_public/heap__serializer_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -115,7 +115,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/hierarchy.html b/doc/ipc_doc/generated/html_public/hierarchy.html index 5d67ecfb5..8cef138d7 100644 --- a/doc/ipc_doc/generated/html_public/hierarchy.html +++ b/doc/ipc_doc/generated/html_public/hierarchy.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -174,7 +174,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/index.html b/doc/ipc_doc/generated/html_public/index.html index 1721a19fe..211d68cee 100644 --- a/doc/ipc_doc/generated/html_public/index.html +++ b/doc/ipc_doc/generated/html_public/index.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/inherits.html b/doc/ipc_doc/generated/html_public/inherits.html index e1a8b0778..21d76d802 100644 --- a/doc/ipc_doc/generated/html_public/inherits.html +++ b/doc/ipc_doc/generated/html_public/inherits.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -231,7 +231,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8cpp.html index 8a68a4f52..24702281e 100644 --- a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -92,7 +92,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8hpp.html index 17e495a0e..4c74bee8d 100644 --- a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2channel_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -127,7 +127,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8cpp.html index 7c9c30537..835a0d83b 100644 --- a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -101,7 +101,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8hpp.html index 26b8c4f9a..d1f88c6ee 100644 --- a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2transport_2error_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -155,7 +155,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2util_2util_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2util_2util_8cpp.html index 48ffe3864..794f6dc73 100644 --- a/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2util_2util_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__core_2src_2ipc_2util_2util_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -127,7 +127,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2client__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2client__session_8hpp.html index 8d5f4bb36..52f50eed7 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2client__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2client__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8cpp.html index 61f90f65f..ab07d6c44 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -101,7 +101,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8hpp.html index a19dfd8b6..7df213c36 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2error_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -146,7 +146,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2server__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2server__session_8hpp.html index 35b611a6c..caf37dd82 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2server__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2server__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session_8hpp.html index 0c3b1360e..98871b180 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -115,7 +115,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session__server_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session__server_8hpp.html index 63c46ec01..bdba6f01f 100644 --- a/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session__server_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__session_2src_2ipc_2session_2session__server_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -112,7 +112,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2client__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2client__session_8hpp.html index 844273161..a05767e2c 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2client__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2client__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -73,7 +73,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2server__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2server__session_8hpp.html index 64e2cff70..6ab4ec97c 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2server__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2server__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session_8hpp.html index e1e9724cc..87071dcf7 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session__server_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session__server_8hpp.html index c3ea590eb..c543a9ca8 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session__server_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2session_2shm_2classic_2session__server_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8cpp.html index 98dd508f0..dfbb9f391 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -104,7 +104,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8hpp.html index 14d8faaa2..3db6f86bc 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2shm_2classic_2error_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -131,7 +131,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2serializer_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2serializer_8hpp.html index b14c15d9a..204156a6c 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2serializer_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2serializer_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -142,7 +142,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2util_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2util_8cpp.html index 8ed49f8c9..629e6e42d 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2util_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm_2src_2ipc_2transport_2struc_2shm_2util_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -101,7 +101,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2client__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2client__session_8hpp.html index ac4f2065d..144a108c2 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2client__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2client__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -73,7 +73,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8cpp.html index f947bc4e7..b801305c9 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -110,7 +110,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8hpp.html index 646517481..b93beea7e 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2error_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -139,7 +139,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2server__session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2server__session_8hpp.html index 646a0cb88..94279a30c 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2server__session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2server__session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -121,7 +121,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session_8hpp.html index 8da45c706..25543ee03 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -121,7 +121,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session__server_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session__server_8hpp.html index debd14034..6184dd465 100644 --- a/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session__server_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__shm__arena__lend_2src_2ipc_2session_2shm_2arena__lend_2jemalloc_2session__server_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -121,7 +121,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp.html index 7316d4766..b74586dd6 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8hpp.html index ae3028692..a1accc982 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2channel_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -110,7 +110,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8cpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8cpp.html index dc89b5fa4..80c43a8ab 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8cpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -104,7 +104,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html index c8a65b833..d8e2252e5 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2error_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -147,7 +147,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2serializer_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2serializer_8hpp.html index 8e52d94bc..0bb0fbbe9 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2serializer_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2serializer_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -104,7 +104,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2sync__io_2channel_8hpp.html b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2sync__io_2channel_8hpp.html index 7c78872ce..b7170114a 100644 --- a/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2sync__io_2channel_8hpp.html +++ b/doc/ipc_doc/generated/html_public/ipc__transport__structured_2src_2ipc_2transport_2struc_2sync__io_2channel_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -110,7 +110,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/msg_8hpp.html b/doc/ipc_doc/generated/html_public/msg_8hpp.html index a578d74df..1c056a807 100644 --- a/doc/ipc_doc/generated/html_public/msg_8hpp.html +++ b/doc/ipc_doc/generated/html_public/msg_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -130,7 +130,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/namespaceboost_1_1system.html b/doc/ipc_doc/generated/html_public/namespaceboost_1_1system.html index c4ea19570..a61839d6f 100644 --- a/doc/ipc_doc/generated/html_public/namespaceboost_1_1system.html +++ b/doc/ipc_doc/generated/html_public/namespaceboost_1_1system.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -100,7 +100,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespacecapnp.html b/doc/ipc_doc/generated/html_public/namespacecapnp.html index a80f8add4..cad821c81 100644 --- a/doc/ipc_doc/generated/html_public/namespacecapnp.html +++ b/doc/ipc_doc/generated/html_public/namespacecapnp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -126,7 +126,7 @@

          Rationale for existence

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc.html b/doc/ipc_doc/generated/html_public/namespaceipc.html index 11d91a1d0..ff16ae3d9 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -299,7 +299,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1bipc.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1bipc.html index cbeb62e62..90540321c 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1bipc.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1bipc.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -78,7 +78,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1fs.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1fs.html index 644e3a353..2b60a173f 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1fs.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1fs.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@

          Rationale for aliasing to boost::filesystem instead of st

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session.html index 0c2b8b8a7..fc956cb7e 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -687,7 +687,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1error.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1error.html index d5ebca81d..b81bacf62 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1error.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1error.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -294,7 +294,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm.html index e38cb229b..4f7f00e6a 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -211,7 +211,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend.html index c2ccc73f6..44b82b280 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc.html index 19f43f4ac..99243d799 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -275,7 +275,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error.html index d8969e7d2..03422cbda 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -255,7 +255,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1classic.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1classic.html index d50d4c200..3ded0c8b9 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1classic.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1shm_1_1classic.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -268,7 +268,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1sync__io.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1sync__io.html index d88784904..8c9118051 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1session_1_1sync__io.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -231,7 +231,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm.html index b676021ad..ac0bf554e 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -168,7 +168,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic.html index de29a8585..962f742f9 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -181,7 +181,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic_1_1error.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic_1_1error.html index 22bd47789..59822bf3e 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic_1_1error.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1classic_1_1error.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -248,7 +248,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1stl.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1stl.html index 65788abee..4417f3a2d 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1stl.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1shm_1_1stl.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -257,7 +257,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport.html index 6612683fe..19824150c 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -802,7 +802,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket.html index e380bb09f..650c87261 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -651,7 +651,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html index 8f8344d8c..fb69dbbed 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1asio__local__stream__socket_1_1local__ns.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1error.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1error.html index 16424aaf8..80f7dbaac 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1error.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1error.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -326,7 +326,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc.html index d679bf045..3c008b60e 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -462,7 +462,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1error.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1error.html index d95490051..f2811a643 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1error.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1error.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -286,7 +286,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm.html index 3baf9176b..04086976d 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -340,7 +340,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html index d4ca1a265..0f939878b 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html index 1e9ee0b8f..fde63cf8f 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1arena__lend_1_1jemalloc.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html index cfdc3b0a9..e8e46deaa 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1sync__io.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1sync__io.html index 426106aff..5a1a0209f 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1struc_1_1sync__io.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -138,7 +138,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1sync__io.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1sync__io.html index 632e843d5..0fe312382 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1transport_1_1sync__io.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -324,7 +324,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1util.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1util.html index caf902017..d7c3dcaef 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1util.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1util.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -425,7 +425,7 @@

          Permissions value in an array<Permissions, size_t(Permissions_level::S_END_SENTINEL)>.

          -

          While, unlike Permissions, this enum intends not be overtly based on a POSIX RWXRWXRWC model, it does still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd are likely universal, but the 2nd may not apply to all OS – through probably all POSIX/Unix ones – and even for something like Linux there could be different groupings such as ones based on OS ACL. As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing, but that could change to include, say, MacOS/BSD).

          +

          While, unlike Permissions, this enum intends not be overtly based on a POSIX RWXRWXRWX model, it does still assume the 3 user groupings are "user themselves," "user's group," and "everyone." The 1st and 3rd are likely universal, but the 2nd may not apply to all OS – through probably all POSIX/Unix ones – and even for something like Linux there could be different groupings such as ones based on OS ACL. As of this writing it's fine, as this is a POSIX-targeted library at least (in fact, Linux, as of this writing, but that could change to include, say, macOS/similar).

          @@ -1746,7 +1746,7 @@

          perms. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make any calls to change the umask to accomplish this.

          +

          It may seem unnecessary, particularly given that it sometimes (in our internal code, but I mention it publicly for exposition purposes) is placed right after the creation of the resource (file, SHM pool, POSIX MQ, shared mutex, etc.) – where the same perms is supplied to the creation-API, whichever is applicable. The reason is that those APIs tend to make the corresponding OS call (e.g., open()) which is bound by the "process umask" in POSIX/Linux; so for example if it's set to the typical 022 (octal), then it's impossible to make the resource group- or all-writable, regardless of perms. set_resource_permissions() uses a technique that bypasses the umask thing. Note that it does not make any calls to change the umask to accomplish this.

          Note 1: Sometimes there is not even the creation-API argument for perms; in which case the rationale is even more straightforward.

          Note 2: Sometimes there is that API... and (namely in boost.ipc at least) they actually took care to do this (what we do here) themselves (via fchmod() and such)... so we don't need to; in fact I (ygoldfel) treated it as valuable confirmation of the correctness of this maneuver.

          Parameters
          @@ -1882,7 +1882,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/namespaceipc_1_1util_1_1sync__io.html b/doc/ipc_doc/generated/html_public/namespaceipc_1_1util_1_1sync__io.html index 663bd2c49..69f712672 100644 --- a/doc/ipc_doc/generated/html_public/namespaceipc_1_1util_1_1sync__io.html +++ b/doc/ipc_doc/generated/html_public/namespaceipc_1_1util_1_1sync__io.html @@ -21,7 +21,7 @@

          @@ -138,7 +138,7 @@

          The async-I/O (default) pattern

          // We are in thread U.
          // ...handle it....
          }
          -
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:297
          +
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:298

          Alternatively:

          • Reactor pattern: Usually built on top of an OS-supplied blocking polling method of some kind – in POSIX nowadays usually at least poll(), in Linux possibly using the more advanced epoll_*() – which centers on an "FD-set" (native handle set), where one describes Native_handles (FDs) and the events one awaits (readable, writable) for each; and in each event loop iteration one runs a poll-wait operation (like poll() or epoll_wait()). This blocks until 1 or more events-of-interest are active; then wakes up and reports which ones they were. User code then synchronously invokes handling for each event of interest; such handling might modify the events-of-interest set, etc., until all such work is done, and the next poll-wait op executes. Thus in the reactor pattern methods like on_async_op_done() are invoked in a flow-control setup inverted versus the proactor pattern; but ultimately they're both doing the same thing. To integrate such a loop with this async-I/O pattern in Flow-IPC, a little extra work is required:
            • Sometimes event-loop libraries provide this as a built-in feature: a task queue. So a facility similar to post() above is supplied. Hence the code above would be adapted to a reactor-pattern loop and end up fairly similar: In F() do some equivalent to the post() in the snippet above. Internally it'll set up some "interrupter" handle in the central [e]poll*() handle-set and cause – from thread W – for thread U's poll-wait to wake up. Otherwise:
            • @@ -498,7 +498,7 @@

              Rationale

              diff --git a/doc/ipc_doc/generated/html_public/namespacemembers.html b/doc/ipc_doc/generated/html_public/namespacemembers.html index 239521f01..8765c2c88 100644 --- a/doc/ipc_doc/generated/html_public/namespacemembers.html +++ b/doc/ipc_doc/generated/html_public/namespacemembers.html @@ -21,7 +21,7 @@
          @@ -211,7 +211,7 @@

          - u -

            diff --git a/doc/ipc_doc/generated/html_public/namespacemembers_enum.html b/doc/ipc_doc/generated/html_public/namespacemembers_enum.html index 16afeddc8..363aa7dca 100644 --- a/doc/ipc_doc/generated/html_public/namespacemembers_enum.html +++ b/doc/ipc_doc/generated/html_public/namespacemembers_enum.html @@ -21,7 +21,7 @@
          @@ -71,7 +71,7 @@ diff --git a/doc/ipc_doc/generated/html_public/namespacemembers_func.html b/doc/ipc_doc/generated/html_public/namespacemembers_func.html index c48784365..9ad177c90 100644 --- a/doc/ipc_doc/generated/html_public/namespacemembers_func.html +++ b/doc/ipc_doc/generated/html_public/namespacemembers_func.html @@ -21,7 +21,7 @@ @@ -135,7 +135,7 @@

          - s -

            diff --git a/doc/ipc_doc/generated/html_public/namespacemembers_type.html b/doc/ipc_doc/generated/html_public/namespacemembers_type.html index 7007b8b84..9bf43ebb9 100644 --- a/doc/ipc_doc/generated/html_public/namespacemembers_type.html +++ b/doc/ipc_doc/generated/html_public/namespacemembers_type.html @@ -21,7 +21,7 @@
          @@ -167,7 +167,7 @@

          - u -

            diff --git a/doc/ipc_doc/generated/html_public/namespacemembers_vars.html b/doc/ipc_doc/generated/html_public/namespacemembers_vars.html index 443420db7..3a8b2ded2 100644 --- a/doc/ipc_doc/generated/html_public/namespacemembers_vars.html +++ b/doc/ipc_doc/generated/html_public/namespacemembers_vars.html @@ -21,7 +21,7 @@
          @@ -76,7 +76,7 @@ diff --git a/doc/ipc_doc/generated/html_public/namespaces.html b/doc/ipc_doc/generated/html_public/namespaces.html index c98099983..998e1cd88 100644 --- a/doc/ipc_doc/generated/html_public/namespaces.html +++ b/doc/ipc_doc/generated/html_public/namespaces.html @@ -21,7 +21,7 @@ @@ -186,7 +186,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__handle_8cpp.html b/doc/ipc_doc/generated/html_public/native__handle_8cpp.html index 51b6baa71..84b4e9b00 100644 --- a/doc/ipc_doc/generated/html_public/native__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_public/native__handle_8cpp.html @@ -21,7 +21,7 @@ @@ -104,7 +104,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__handle_8hpp.html b/doc/ipc_doc/generated/html_public/native__handle_8hpp.html index d71421ddc..813efc00a 100644 --- a/doc/ipc_doc/generated/html_public/native__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_public/native__handle_8hpp.html @@ -21,7 +21,7 @@ @@ -111,7 +111,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__handle__transport_8hpp.html b/doc/ipc_doc/generated/html_public/native__handle__transport_8hpp.html index ec5ea2cda..7b5c36068 100644 --- a/doc/ipc_doc/generated/html_public/native__handle__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_public/native__handle__transport_8hpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__socket__stream_8cpp.html b/doc/ipc_doc/generated/html_public/native__socket__stream_8cpp.html index 6237c3f8b..d95eeb44e 100644 --- a/doc/ipc_doc/generated/html_public/native__socket__stream_8cpp.html +++ b/doc/ipc_doc/generated/html_public/native__socket__stream_8cpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__socket__stream_8hpp.html b/doc/ipc_doc/generated/html_public/native__socket__stream_8hpp.html index a10a46b43..689c4b3b6 100644 --- a/doc/ipc_doc/generated/html_public/native__socket__stream_8hpp.html +++ b/doc/ipc_doc/generated/html_public/native__socket__stream_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8cpp.html b/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8cpp.html index c4fb96267..127b8ccc0 100644 --- a/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8cpp.html +++ b/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8cpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8hpp.html b/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8hpp.html index 64b1391f4..42d132c1d 100644 --- a/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8hpp.html +++ b/doc/ipc_doc/generated/html_public/native__socket__stream__acceptor_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/pages.html b/doc/ipc_doc/generated/html_public/pages.html index bfe928f2d..d427841dc 100644 --- a/doc/ipc_doc/generated/html_public/pages.html +++ b/doc/ipc_doc/generated/html_public/pages.html @@ -21,7 +21,7 @@ @@ -87,7 +87,7 @@ diff --git a/doc/ipc_doc/generated/html_public/persistent__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_public/persistent__mq__handle_8hpp.html index 9de6a9bf0..e1368b315 100644 --- a/doc/ipc_doc/generated/html_public/persistent__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_public/persistent__mq__handle_8hpp.html @@ -21,7 +21,7 @@ @@ -99,7 +99,7 @@ diff --git a/doc/ipc_doc/generated/html_public/pool__arena_8cpp.html b/doc/ipc_doc/generated/html_public/pool__arena_8cpp.html index 0bf06466f..e8f44306c 100644 --- a/doc/ipc_doc/generated/html_public/pool__arena_8cpp.html +++ b/doc/ipc_doc/generated/html_public/pool__arena_8cpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/pool__arena_8hpp.html b/doc/ipc_doc/generated/html_public/pool__arena_8hpp.html index aae2abd6b..5f469fdba 100644 --- a/doc/ipc_doc/generated/html_public/pool__arena_8hpp.html +++ b/doc/ipc_doc/generated/html_public/pool__arena_8hpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/posix__mq__handle_8cpp.html b/doc/ipc_doc/generated/html_public/posix__mq__handle_8cpp.html index 56c9402f6..39e6bef35 100644 --- a/doc/ipc_doc/generated/html_public/posix__mq__handle_8cpp.html +++ b/doc/ipc_doc/generated/html_public/posix__mq__handle_8cpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/posix__mq__handle_8hpp.html b/doc/ipc_doc/generated/html_public/posix__mq__handle_8hpp.html index 320b0aae7..aba2fe4cd 100644 --- a/doc/ipc_doc/generated/html_public/posix__mq__handle_8hpp.html +++ b/doc/ipc_doc/generated/html_public/posix__mq__handle_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/process__credentials_8cpp.html b/doc/ipc_doc/generated/html_public/process__credentials_8cpp.html index d44cec4e6..fab80390e 100644 --- a/doc/ipc_doc/generated/html_public/process__credentials_8cpp.html +++ b/doc/ipc_doc/generated/html_public/process__credentials_8cpp.html @@ -21,7 +21,7 @@ @@ -98,7 +98,7 @@ diff --git a/doc/ipc_doc/generated/html_public/process__credentials_8hpp.html b/doc/ipc_doc/generated/html_public/process__credentials_8hpp.html index 3f03e39ae..ddff88e10 100644 --- a/doc/ipc_doc/generated/html_public/process__credentials_8hpp.html +++ b/doc/ipc_doc/generated/html_public/process__credentials_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/process__credentials__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/process__credentials__fwd_8hpp.html index 6f4b8b3a1..70dff1919 100644 --- a/doc/ipc_doc/generated/html_public/process__credentials__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/process__credentials__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -98,7 +98,7 @@ diff --git a/doc/ipc_doc/generated/html_public/protocol__negotiator_8cpp.html b/doc/ipc_doc/generated/html_public/protocol__negotiator_8cpp.html index 90e044963..f53be3caa 100644 --- a/doc/ipc_doc/generated/html_public/protocol__negotiator_8cpp.html +++ b/doc/ipc_doc/generated/html_public/protocol__negotiator_8cpp.html @@ -21,7 +21,7 @@ @@ -85,7 +85,7 @@ diff --git a/doc/ipc_doc/generated/html_public/protocol__negotiator_8hpp.html b/doc/ipc_doc/generated/html_public/protocol__negotiator_8hpp.html index dee989663..9297252ef 100644 --- a/doc/ipc_doc/generated/html_public/protocol__negotiator_8hpp.html +++ b/doc/ipc_doc/generated/html_public/protocol__negotiator_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/safety_perms.html b/doc/ipc_doc/generated/html_public/safety_perms.html index 924b9d704..504fdf25a 100644 --- a/doc/ipc_doc/generated/html_public/safety_perms.html +++ b/doc/ipc_doc/generated/html_public/safety_perms.html @@ -21,7 +21,7 @@ @@ -147,7 +147,7 @@

          Permissions level: GROUP_ACCESS

          diff --git a/doc/ipc_doc/generated/html_public/server__session__adapter_8hpp.html b/doc/ipc_doc/generated/html_public/server__session__adapter_8hpp.html index 06281af3a..7faad8104 100644 --- a/doc/ipc_doc/generated/html_public/server__session__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_public/server__session__adapter_8hpp.html @@ -21,7 +21,7 @@ @@ -103,7 +103,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html index 5ac8e15da..98a5c8057 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html index f587e3521..7273a9af2 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -118,7 +118,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic_8hpp.html index 532f59f5b..aa701768a 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ @@ -95,7 +95,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic__fwd_8hpp.html index 50e27410f..6ec39ca93 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -115,7 +115,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2shm_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2shm_8hpp.html index a4b015234..cc5820ea8 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2shm_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2shm_8hpp.html @@ -21,7 +21,7 @@ @@ -103,7 +103,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_2shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/session_2shm_2shm__fwd_8hpp.html index bce9fc1d2..733099a98 100644 --- a/doc/ipc_doc/generated/html_public/session_2shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session_2shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -88,7 +88,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/session__fwd_8hpp.html index 0f94804c2..de40c04d4 100644 --- a/doc/ipc_doc/generated/html_public/session__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -155,7 +155,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session__server__adapter_8hpp.html b/doc/ipc_doc/generated/html_public/session__server__adapter_8hpp.html index 055285356..a4d9310a0 100644 --- a/doc/ipc_doc/generated/html_public/session__server__adapter_8hpp.html +++ b/doc/ipc_doc/generated/html_public/session__server__adapter_8hpp.html @@ -21,7 +21,7 @@ @@ -103,7 +103,7 @@ diff --git a/doc/ipc_doc/generated/html_public/session_app_org.html b/doc/ipc_doc/generated/html_public/session_app_org.html index bfcabfd87..dd164b8d5 100644 --- a/doc/ipc_doc/generated/html_public/session_app_org.html +++ b/doc/ipc_doc/generated/html_public/session_app_org.html @@ -21,7 +21,7 @@ @@ -262,7 +262,7 @@

          Organizing application code around sessions

          }; // class Process
          This is to vanilla Session_server what shm::classic::Server_session is to vanilla Server_session: it ...
          Definition: session_server.hpp:74
          @ S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER
          Async completion handler is being called prematurely, because underlying object is shutting down,...
          -
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:297
          +
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:298

          To summarize: There are concurrent algorithms in play here, executing in interleaved async fashion via thread U (m_worker):

          • First, initialize IPC universe description; and start Session_server m_session_srv. Then begin loop:
          • Algorithm 1 (one running throughout): Ask m_session_srv to accept the next session in the background. Once ready, give it to algorithm 2; and repeat.
              @@ -438,7 +438,7 @@

              Organizing application code around sessions

              m_worker->post([this]() { m_on_session_closed_func(); });
              }
              };
              -
              flow::async::Task Task
              Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
              Definition: util_fwd.hpp:116
              +
              flow::async::Task Task
              Short-hand for polymorphic function (a-la std::function<>) that takes no arguments and returns nothin...
              Definition: util_fwd.hpp:122

              Simple, really. So what's the big deal? Answer: Mainly the big deal is: the per-session objects (where it says ATTENTION!) are encapsulated cleanly at the same level as the Session: they are thus destroyed/nullified at the same time (in fact, the latter before the former).

              So now all that's left is to hook this up to the rest of Process, in each application: process_session(). That's where things are somewhat different – since the session is open almost-but-not-quite, and the API somewhat differs between the two. Client first:

              // In session-client app Bp.
              @@ -536,7 +536,7 @@

              What did we miss?

              diff --git a/doc/ipc_doc/generated/html_public/session_setup.html b/doc/ipc_doc/generated/html_public/session_setup.html index 8c1492610..89fcea19a 100644 --- a/doc/ipc_doc/generated/html_public/session_setup.html +++ b/doc/ipc_doc/generated/html_public/session_setup.html @@ -21,7 +21,7 @@
          @@ -168,7 +168,7 @@

          Client_session setup

          // By the way... for all future mentions of Error_code:
          Implements the SHM-related API common to shm::classic::Server_session and shm::classic::Client_sessio...
          Definition: session.hpp:44
          -
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:297
          +
          flow::Error_code Error_code
          Short-hand for flow::Error_code which is very common.
          Definition: common.hpp:298

          Next let's decide on the values for those 3 template parameters. The first two determine the concrete type of ipc::transport::Channel that shall be opened in this session. The last template parameter is used for certain advanced purposes around channel-opening. We'll talk about all of those topics in Sessions: Opening Channels. For now we'll forego the advanced-metadata stuff (leave that arg at default), and we'll choose a sufficiently powerful and performant setting for the former 2 params. Thus, again, we strongly recommend to define the concrete type in an alias, so that the details need not be repeated subsequently.

          // Each channel shall contain (only) a (bidirectional) Unix domain stream socket, capable of transmitting data and native handles.
          // This is sufficient for all purposes in terms of what it can transmit; and can only be potentially improved upon -- likely marginally
          @@ -280,7 +280,7 @@

          Client_session setup

          diff --git a/doc/ipc_doc/generated/html_public/setup.html b/doc/ipc_doc/generated/html_public/setup.html index 130590c00..f552797ea 100644 --- a/doc/ipc_doc/generated/html_public/setup.html +++ b/doc/ipc_doc/generated/html_public/setup.html @@ -21,7 +21,7 @@ @@ -70,7 +70,7 @@

          Here we discuss the environmental requirements for using Flow-IPC as well as quality-of-life setup basics including logging. (Or go back to preceding page: API Overview / Synopses.)

          OS and build environment

          Note
          In the short term (as of October 2023) this may become an open-source library with potentially wide distribution. Some of the below items may change in that case; for example it may become a header-only library or have that mode, and it may support additional OS rather than Linux. We would also include specific information on building it from source as befits a wide-release project. Until then we leave out specific instructions on building the library itself as outside the scope of the present document; while listing the environmental requirements/recommendations as follows. It is vaguely informational; until this is a wide-release library we stay away from rigorous build instructions here. Even once it becomes a wide-release product, possibly such instructions shall live outside this manual. Looking outside the src/ directory you'll certainly find the relevant build scripts which cover all that.
          -

          This is a Linux library (actually set of libraries, but in this Manual we treat Flow-IPC as a monolithic whole for simplicity). As of this writing it is to be built in 64-bit mode (x86-64 a/k/a AMD64). (Most code by far is not OS/architecture-specific, but at least certain aspects of the optionally-used SHM-jemalloc component are.) It is intended for use at least in a deployed server setting. As of this writing it relies on some Linux-specific techniques such as /proc/...pid.../ and /dev/shm/ semantics. In the future it is quite realistic it would be extended to other OS and architectures – possibly even Windows, but definitely MacOS/Darwin and FreeBSD and orthogonally perhaps ARM64 and so on.

          +

          This is a Linux library (actually set of libraries, but in this Manual we treat Flow-IPC as a monolithic whole for simplicity). As of this writing it is to be built in 64-bit mode (x86-64 a/k/a AMD64). (Most code by far is not OS/architecture-specific, but at least certain aspects of the optionally-used SHM-jemalloc component are.) It is intended for use at least in a deployed server setting. As of this writing it relies on some Linux-specific techniques such as /proc/...pid.../ and /dev/shm/ semantics. In the future it is quite realistic it would be extended to other OS and architectures – possibly even Windows, but definitely macOS/Darwin/similar and orthogonally perhaps ARM64 and so on.

          It is a linked library (libraries) that must be built in C++17 compiler mode, as must any of its #includers (translation units). It has been specifically tested (as of this writing) on a range of gcc and clang compilers/linkers. We omit details in this text, since this is likely to evolve over time. Generally such topics are well covered outside of src/ directories; start with the top-level README.md for an overview; it will point you to CMake scripts and so on – if there is interest.

          Regarding the briefly-mentioned-above testing: As of this writing there is an automated CI/CD test suite which checks the various combinations of compiler and build-type (debug, release, various sanitizers, etc.) – both building and functionality. Again we omit details here; but as of this writing you can see the details at the official open-source project (GitHub organization "Flow-IPC," as I write this). You'll likely find a few files like .github/..., conanfile.py, and sanitizer-specific .cfg files which control this stuff. This is well outside our scope in this Manual, but we wanted you to be aware of such things.

          Regarding test code itself: We do not talk about it in this Manual or Reference (again: out of scope); but it is in the same repo (repos). Some test code (of the unit-test variety) is in test/ subdirs at various levels near production code; other test code is outside src/ entirely – whether the unit test driver program(s) or the various integration-tests.

          @@ -122,7 +122,7 @@

          Logging verbosity setting

          diff --git a/doc/ipc_doc/generated/html_public/shared__name_8cpp.html b/doc/ipc_doc/generated/html_public/shared__name_8cpp.html index f14497cb2..71149663e 100644 --- a/doc/ipc_doc/generated/html_public/shared__name_8cpp.html +++ b/doc/ipc_doc/generated/html_public/shared__name_8cpp.html @@ -21,7 +21,7 @@ @@ -140,7 +140,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shared__name_8hpp.html b/doc/ipc_doc/generated/html_public/shared__name_8hpp.html index c418f651f..14d1c6bf9 100644 --- a/doc/ipc_doc/generated/html_public/shared__name_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shared__name_8hpp.html @@ -21,7 +21,7 @@ @@ -120,7 +120,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shared__name__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/shared__name__fwd_8hpp.html index d4f77fccb..36a1adddb 100644 --- a/doc/ipc_doc/generated/html_public/shared__name__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shared__name__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -164,7 +164,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_public/shm_2classic_2classic_8hpp.html index e788084b8..95c7cbd2a 100644 --- a/doc/ipc_doc/generated/html_public/shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ @@ -92,7 +92,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/shm_2classic_2classic__fwd_8hpp.html index 04d784895..39c03eff8 100644 --- a/doc/ipc_doc/generated/html_public/shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -111,7 +111,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shm_2shm_8hpp.html b/doc/ipc_doc/generated/html_public/shm_2shm_8hpp.html index 7a2aa75cc..4664b528e 100644 --- a/doc/ipc_doc/generated/html_public/shm_2shm_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shm_2shm_8hpp.html @@ -21,7 +21,7 @@ @@ -100,7 +100,7 @@ diff --git a/doc/ipc_doc/generated/html_public/shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/shm_2shm__fwd_8hpp.html index b4cfa31b7..841441837 100644 --- a/doc/ipc_doc/generated/html_public/shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -85,7 +85,7 @@ diff --git a/doc/ipc_doc/generated/html_public/stateless__allocator_8hpp.html b/doc/ipc_doc/generated/html_public/stateless__allocator_8hpp.html index 38e9a6d56..30d1237c7 100644 --- a/doc/ipc_doc/generated/html_public/stateless__allocator_8hpp.html +++ b/doc/ipc_doc/generated/html_public/stateless__allocator_8hpp.html @@ -21,7 +21,7 @@ @@ -107,7 +107,7 @@ diff --git a/doc/ipc_doc/generated/html_public/stl__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/stl__fwd_8hpp.html index cccd98f9f..e8e944e98 100644 --- a/doc/ipc_doc/generated/html_public/stl__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/stl__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -100,7 +100,7 @@ diff --git a/doc/ipc_doc/generated/html_public/struc__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/struc__fwd_8hpp.html index c3c0b403c..679a15850 100644 --- a/doc/ipc_doc/generated/html_public/struc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/struc__fwd_8hpp.html @@ -21,7 +21,7 @@ @@ -140,7 +140,7 @@ diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html index 3badad8b8..3f527e02a 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ @@ -77,7 +77,7 @@
          Enumerator
          S_NO_ACCESS 

          Forbids all access, even by the creator's user. Most likely this would be useful for testing or debugging.

          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.

          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html index 495885e02..2f94ccd52 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html index 1993a9b35..e81df8a61 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jema89097d597bd27584f63171a1c12516e7.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html index dfe3af91f..8592857ac 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1session_1_1shm_1_1arena__lend_1_1jemalloc_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html index c3c3dfba1..36b239fa8 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html index 7d1fb1b03..5e88d578d 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1shm_1_1classic_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html index baf3aead3..62c8ab661 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html index 6a51ea4c9..7882481b5 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html index e4efd44bc..edc8c85d2 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html index aa18ecb58..807e5db6d 100644 --- a/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html +++ b/doc/ipc_doc/generated/html_public/structboost_1_1system_1_1is__error__code__enum_3_1_1ipc_1_1transport_1_1struc_1_1error_1_1Code_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App-members.html index e378e1b9b..9f28d9da8 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -82,7 +82,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App.html index 79edaa69b..b377dbfba 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1App.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -274,7 +274,7 @@

          Conventions: Naming

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app-members.html index e7eff1407..962cca1fc 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -84,7 +84,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app.html index b8e651459..4217ccedd 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Client__app.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -197,7 +197,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app-members.html index db1e42f7d..18014142f 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -87,7 +87,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app.html index d2e31b9f8..328b165ed 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1Server__app.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -259,7 +259,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html index 04b02fefa..5dc661c46 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html index 74e776545..9069d5fcc 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html index 0738f342c..6b9ce04f5 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html index 651c90671..6323bc752 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1arena__lend_1_1jemalloc_1_1Ipc__arena_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html index 64f85785d..394547cde 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html index 08192afab..15fecb58e 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1session_1_1shm_1_1Arena__to__shm__session_3_01ipc_1_1shm_1_1classic_1_1Pool__arena_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html index 57e2ac70b..1c34a9343 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html index 606cd8e97..841ea94c5 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -96,7 +96,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html index a1327f57d..c96c63b62 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html index 0c9b06573..6999d76c1 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1shm_1_1Arena__to__borrower__allocator__arena_3_01classic_1_1Pool__arena_01_4.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -94,7 +94,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html index d1f6bb09e..01cdc3d1c 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -77,7 +77,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html index 0cad54abb..c973db1e5 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel_1_1Sync__op__state_1_1Request__result.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html index 27a8087a1..1ebb9c2a6 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__app__shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html index a08d725cc..0742f4534 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__heap.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -100,7 +100,7 @@

          Relative benefits/limitations (versus SHM-based Serializa_via_*_shm diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html index 5becfb929..4e6731f72 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Channel__base_1_1Serialize__via__session__shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -93,7 +93,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html index a6daa435b..2dc5616b2 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html index 825093d7d..4fc1549fc 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__fixed__builder_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -120,7 +120,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html index cec57e459..8034b6786 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html index d15166793..fb7c8dea0 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Heap__reader_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -123,7 +123,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Null__session.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Null__session.html index b5981e9a0..45c9efce3 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Null__session.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Null__session.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -84,7 +84,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html index 68c35cd2b..49f96a0b8 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html index 2f13ac2c2..0a0eeca28 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__builder_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -114,7 +114,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html index ef5d340e0..4b9498775 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -80,7 +80,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html index 12c9ede00..964f201e5 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1Struct__reader_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -111,7 +111,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html index a9b9b4705..b65cc13e2 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -81,7 +81,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html index 95c1dede6..983f1e858 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Builder_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -118,7 +118,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html index 4713c8dcc..bbe8d2f6b 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -79,7 +79,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html index e65933b63..b5a5d0a7f 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1transport_1_1struc_1_1shm_1_1Reader_1_1Config.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -126,7 +126,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle-members.html b/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle-members.html index f0ad7c437..4f5a840cd 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle-members.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle-members.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -90,7 +90,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle.html b/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle.html index 778131349..a7ceeccbe 100644 --- a/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle.html +++ b/doc/ipc_doc/generated/html_public/structipc_1_1util_1_1Native__handle.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -591,7 +591,7 @@

          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__rcv_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__rcv_8hpp.html index 37fd8edaf..940b5b91a 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__rcv_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__rcv_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -103,7 +103,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__snd_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__snd_8hpp.html index 64997c6df..75ecb3400 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__snd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2blob__stream__mq__snd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -103,7 +103,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2blob__transport_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2blob__transport_8hpp.html index 25a21eab8..0a6f9db4e 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2blob__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2blob__transport_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2native__handle__transport_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2native__handle__transport_8hpp.html index f335e4bfb..39b40264e 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2native__handle__transport_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2native__handle__transport_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8cpp.html b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8cpp.html index 6df05519b..122d20102 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8cpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8hpp.html index 89ac14a1e..84d4c1c9a 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8cpp.html b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8cpp.html index a03d5abf0..d2f58348b 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8cpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8hpp.html index 939a94f9f..6ea475a1c 100644 --- a/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io_2native__socket__stream__acceptor_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -95,7 +95,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/sync__io__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/sync__io__fwd_8hpp.html index 7be44dafb..0c91a9400 100644 --- a/doc/ipc_doc/generated/html_public/sync__io__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/sync__io__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -98,7 +98,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/todo.html b/doc/ipc_doc/generated/html_public/todo.html index 66b999dd9..9838d24e3 100644 --- a/doc/ipc_doc/generated/html_public/todo.html +++ b/doc/ipc_doc/generated/html_public/todo.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -113,7 +113,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html index 33a52aa61..a15dadf54 100644 --- a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -105,7 +105,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html index e86420440..1d99dcff2 100644 --- a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2arena__lend_2jemalloc_2jemalloc__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -109,7 +109,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic_8hpp.html b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic_8hpp.html index 739d677cf..69945f79b 100644 --- a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -102,7 +102,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html index 66f626809..b81f80615 100644 --- a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2classic_2classic__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -106,7 +106,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2shm__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2shm__fwd_8hpp.html index 0c92b2710..6d56b8c8f 100644 --- a/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2shm__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport_2struc_2shm_2shm__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -113,7 +113,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/transport__fwd_8hpp.html index 42876aa15..e8a2ec245 100644 --- a/doc/ipc_doc/generated/html_public/transport__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/transport__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -207,7 +207,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_core.html b/doc/ipc_doc/generated/html_public/transport_core.html index 17a973491..504ea48a6 100644 --- a/doc/ipc_doc/generated/html_public/transport_core.html +++ b/doc/ipc_doc/generated/html_public/transport_core.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/transport_shm.html b/doc/ipc_doc/generated/html_public/transport_shm.html index 052e7a3b2..b40e4e574 100644 --- a/doc/ipc_doc/generated/html_public/transport_shm.html +++ b/doc/ipc_doc/generated/html_public/transport_shm.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -398,7 +398,7 @@

          What can you do with a borrowed (received) data structured in SHM?

          diff --git a/doc/ipc_doc/generated/html_public/universes.html b/doc/ipc_doc/generated/html_public/universes.html index 24f1483b3..27ed49d03 100644 --- a/doc/ipc_doc/generated/html_public/universes.html +++ b/doc/ipc_doc/generated/html_public/universes.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -76,7 +76,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/use__counted__object_8cpp.html b/doc/ipc_doc/generated/html_public/use__counted__object_8cpp.html index 291b9f95f..db2e9f32b 100644 --- a/doc/ipc_doc/generated/html_public/use__counted__object_8cpp.html +++ b/doc/ipc_doc/generated/html_public/use__counted__object_8cpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -85,7 +85,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/use__counted__object_8hpp.html b/doc/ipc_doc/generated/html_public/use__counted__object_8hpp.html index 733c04fda..2f7ca7c83 100644 --- a/doc/ipc_doc/generated/html_public/use__counted__object_8hpp.html +++ b/doc/ipc_doc/generated/html_public/use__counted__object_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -92,7 +92,7 @@
          diff --git a/doc/ipc_doc/generated/html_public/util__fwd_8hpp.html b/doc/ipc_doc/generated/html_public/util__fwd_8hpp.html index f1528acdc..8bef68c5a 100644 --- a/doc/ipc_doc/generated/html_public/util__fwd_8hpp.html +++ b/doc/ipc_doc/generated/html_public/util__fwd_8hpp.html @@ -21,7 +21,7 @@ -
          Flow-IPC 1.0.1 +
          Flow-IPC 1.0.2
          Flow-IPC project: Public API.
          @@ -173,7 +173,7 @@