Flow-IPC 1.0.0
Flow-IPC project: Public API.
|
A Channel with at least a blobs pipe consisting of two MQs of type Persistent_mq_handle (template arg 1); and possibly a handles pipe as governed by template args 2 and 3 which default to Null_peer (in which case the handles pipe is disabled). More...
#include <channel.hpp>
Public Types | |
using | Mq = Persistent_mq_handle |
Short-hand for the Persistent_mq_handle concrete type used for blobs pipe. | |
using | Base = Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Native_handle_sender, Native_handle_receiver > |
Short-hand for base class. | |
Public Types inherited from ipc::transport::Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Null_peer, Null_peer > | |
using | Blob_sender_obj = std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > > |
Alias for Blob_sender template parameter. | |
using | Blob_receiver_obj = std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > > |
Alias for Blob_receiver template parameter. | |
using | Native_handle_sender_obj = Null_peer |
Alias for Native_handle_sender template parameter. | |
using | Native_handle_receiver_obj = Null_peer |
Alias for Native_handle_receiver template parameter. | |
using | Async_io_obj = Channel< typename Blob_sender_obj::Async_io_obj, typename Blob_receiver_obj::Async_io_obj, typename Native_handle_sender_obj::Async_io_obj, typename Native_handle_receiver_obj::Async_io_obj > |
Assuming S_IS_SYNC_IO_OBJ yields async-I/O counterpart; else yields Channel<Null_peer, Null_peer, Null_peer, Null_peer> . | |
using | Sync_io_obj = Channel< typename Blob_sender_obj::Sync_io_obj, typename Blob_receiver_obj::Sync_io_obj, typename Native_handle_sender_obj::Sync_io_obj, typename Native_handle_receiver_obj::Sync_io_obj > |
Assuming S_IS_ASYNC_IO_OBJ yields sync_io counterpart; else yields Channel<Null_peer, Null_peer, Null_peer, Null_peer> . | |
Public Member Functions | |
Mqs_channel (flow::log::Logger *logger_ptr, util::String_view nickname_str, Mq &&mq_out, Mq &&mq_in, Error_code *err_code=0) | |
Constructs the Channel in PEER state. More... | |
Mqs_channel () | |
Identical to Channel default ctor. | |
Public Member Functions inherited from ipc::transport::Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Null_peer, Null_peer > | |
Channel () | |
Default ctor (Channel is in ??? state; intended to be move-assigned). More... | |
Channel (flow::log::Logger *logger_ptr, util::String_view nickname_str) | |
Constructs Channel in ??? state with the intention to continue initialization via init_blob_pipe() and/or init_native_handle_pipe() call(s). More... | |
Channel (Channel &&src) | |
Move-constructs from src ; src becomes as-if default-cted (therefore in ??? state). More... | |
Channel (const Channel &)=delete | |
Copy construction is disallowed. | |
~Channel () | |
Destructor: synchronously invokes the destructors for each peer object moved-into *this via init_blob_pipe() and/or init_native_handle_pipe(). More... | |
bool | initialized (bool suppress_log=false) const |
Returns true if and only if the required init_blob_pipe() and init_native_handle_pipe() calls have been made, loading exactly the expected peer objects as the template params Blob_sender_obj, Blob_receiver_obj, Native_handle_sender_obj, Native_handle_receiver_obj specify. More... | |
Channel & | operator= (Channel &&src) |
Move-assigns from src ; *this acts as if destructed; src becomes as-if default-cted (therefore in ??? state). More... | |
Channel & | operator= (const Channel &)=delete |
Copy assignment is disallowed. | |
Async_io_obj | async_io_obj () |
Converts a sync_io -peer-bearing *this to a returned async-I/O-peer-bearing new Channel, while *this becomes as-if default-cted. More... | |
const Blob_sender_obj * | blob_snd () const |
Pointer to the immutable owned Blob_sender_obj; null if yet initialized. More... | |
Blob_sender_obj * | blob_snd () |
Pointer to the mutable owned Blob_sender_obj; null if yet initialized. More... | |
const Blob_receiver_obj * | blob_rcv () const |
Pointer to the immutable owned Blob_receiver_obj; null if not yet initialized. More... | |
Blob_receiver_obj * | blob_rcv () |
Pointer to the mutable owned Blob_receiver_obj; null if not yet initialized. More... | |
const Native_handle_sender_obj * | hndl_snd () const |
Pointer to the immutable owned Native_handle_sender_obj; null if not yet initialized. More... | |
Native_handle_sender_obj * | hndl_snd () |
Pointer to the mutable owned Native_handle_sender_obj; null if not yet initialized. More... | |
const Native_handle_receiver_obj * | hndl_rcv () const |
Pointer to the immutable owned Native_handle_receiver_obj; null if not yet initialized. More... | |
Native_handle_receiver_obj * | hndl_rcv () |
Pointer to the mutable owned Native_handle_receiver_obj; null if not yet initialized. More... | |
bool | init_blob_pipe (Blob_sender_obj &&snd_and_rcv) |
Completes initialization of the blobs pipe by taking ownership (via move semantics) of an object that is simultaneously the Blob_sender_obj and Blob_receiver_obj for our end of the blobs pipe. More... | |
bool | init_blob_pipe (Blob_sender_obj &&snd, Blob_receiver_obj &&rcv) |
Completes initialization of the blobs pipe by taking ownership (via move semantics) of separate Blob_sender_obj and Blob_receiver_obj objects for our end of the blobs pipe. More... | |
bool | init_native_handle_pipe (Native_handle_sender_obj &&snd_and_rcv) |
Analogous to 1-arg init_blob_pipe() but as applied to the handles pipe. More... | |
bool | init_native_handle_pipe (Native_handle_sender_obj &&snd, Native_handle_receiver_obj &&rcv) |
Analogous to 2-arg init_blob_pipe() but as applied to the handles pipe. More... | |
size_t | send_blob_max_size () const |
Yields blob_snd()-> same method. More... | |
size_t | send_meta_blob_max_size () const |
Yields hndl_snd()-> same method. More... | |
size_t | receive_blob_max_size () const |
Yields blob_rcv()-> same method. More... | |
size_t | receive_meta_blob_max_size () const |
Yields hndl_rcv()-> same method. More... | |
bool | send_blob (const util::Blob_const &blob, Error_code *err_code=0) |
Yields blob_snd()-> same method. More... | |
bool | send_native_handle (Native_handle hndl_or_null, const util::Blob_const &meta_blob, Error_code *err_code=0) |
Yields hndl_snd()-> same method. More... | |
bool | async_end_sending (Task_err &&on_done_func) |
Performs hndl_snd()-> and/or blob_snd()-> same method, synthesizing completion handlers into one if applicable. More... | |
bool | async_end_sending (Error_code *sync_err_code, Task_err &&on_done_func) |
Performs hndl_snd()-> and/or blob_snd()-> same method, synthesizing completions into one if applicable. More... | |
bool | end_sending () |
Performs hndl_snd()-> and/or blob_snd()-> same method, returning true if all (1-2) invoked methods returned true ; false conversely. More... | |
bool | auto_ping (util::Fine_duration period=boost::chrono::seconds(2)) |
Performs hndl_snd()-> and/or blob_snd()-> same method, returning true if all (1-2) invoked methods returned true ; false conversely. More... | |
bool | async_receive_blob (Args &&... args) |
Yields blob_rcv()-> same method. More... | |
bool | async_receive_native_handle (Args &&... args) |
Yields hndl_rcv()-> same method. More... | |
bool | idle_timer_run (util::Fine_duration timeout=boost::chrono::seconds(5)) |
Performs hndl_rcv()-> and/or blob_rcv()-> same method, returning true if all (1-2) invoked methods returned true ; false conversely. More... | |
bool | replace_event_wait_handles (const Create_ev_wait_hndl_func &create_ev_wait_hndl_func) |
Executes same method on all unique stored peer objects; returns true if and only if they all did. More... | |
bool | start_send_blob_ops (Event_wait_func_t &&ev_wait_func) |
Yields blob_snd()-> same method. More... | |
bool | start_send_native_handle_ops (Event_wait_func_t &&ev_wait_func) |
Yields hndl_snd()-> same method. More... | |
bool | start_receive_blob_ops (Event_wait_func_t &&ev_wait_func) |
Yields blob_rcv()-> same method. More... | |
bool | start_receive_native_handle_ops (Event_wait_func_t &&ev_wait_func) |
Yields hndl_rcv()-> same method. More... | |
const std::string & | nickname () const |
Returns nickname, a brief string suitable for logging. More... | |
Additional Inherited Members | |
Static Public Attributes inherited from ipc::transport::Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Null_peer, Null_peer > | |
static constexpr bool | S_HAS_2_PIPES |
Useful for generic programming: true if and only if types imply both blobs and handles pipes are enabled. | |
static constexpr bool | S_HAS_BLOB_PIPE_ONLY |
Useful for generic programming: true if and only if types imply only the blobs pipe is enabled. | |
static constexpr bool | S_HAS_NATIVE_HANDLE_PIPE_ONLY |
Useful for generic programming: true if and only if types imply only the handles pipe is enabled. | |
static constexpr bool | S_HAS_BLOB_PIPE |
Useful for generic programming: true if and only if types imply at least the blobs pipe is enabled. | |
static constexpr bool | S_HAS_NATIVE_HANDLE_PIPE |
Useful for generic programming: true if and only if types imply at least the handles pipe is enabled. | |
static constexpr bool | S_IS_SYNC_IO_OBJ |
Useful for generic programming: true <=> each non-Null_peer peer type (Blob_sender_obj, Blob_receiver_obj, Native_handle_sender_obj, Native_handle_receiver_obj) implements the sync_io pattern (by convention living in namespace ipc::transport::sync_io). | |
static constexpr bool | S_IS_ASYNC_IO_OBJ |
It equals the reverse of S_IS_SYNC_IO_OBJ. More... | |
Related Functions inherited from ipc::transport::Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Null_peer, Null_peer > | |
std::ostream & | operator<< (std::ostream &os, const Channel< std::conditional_t< SIO, sync_io::Blob_stream_mq_sender< Persistent_mq_handle >, Blob_stream_mq_sender< Persistent_mq_handle > >, std::conditional_t< SIO, sync_io::Blob_stream_mq_receiver< Persistent_mq_handle >, Blob_stream_mq_receiver< Persistent_mq_handle > >, Null_peer, Null_peer > &val) |
Prints string representation of the given Channel to the given ostream . More... | |
A Channel with at least a blobs pipe consisting of two MQs of type Persistent_mq_handle (template arg 1); and possibly a handles pipe as governed by template args 2 and 3 which default to Null_peer (in which case the handles pipe is disabled).
To use:
*this
to own.As a result:
However it is likely more typical to use Mqs_socket_stream_channel (which extends Mqs_channel) or even more likely its two concrete-type aliases Posix_mqs_socket_stream_channel, Bipc_mqs_socket_stream_channel (and/or sync_io::Posix_mqs_socket_stream_channel, sync_io::Bipc_mqs_socket_stream_channel). Either way init_native_handle_pipe() is then done for the user. If no handles pipe is required, then it is likely one would use Posix_mqs_channel_of_blobs or Bipc_mqs_channel_of_blobs (aliases to Mqs_channel).
Persistent_mq_handle | Implements that concept. |
Native_handle_sender | Implements that concept (in transport:: or transport::sync_io:: ) if handles pipe enabled; otherwise Null_peer. |
Native_handle_receiver | Analogously. |
SIO | Selects between transport::sync_io:: and transport:: version of held type(s); hence between Channel::S_IS_SYNC_IO_OBJ and Channel::S_IS_ASYNC_IO_OBJ. |
|
explicit |
Constructs the Channel in PEER state.
mq_out
and mq_in
must be suitable for Persistent_mq_handle PEER-state ctor (see it doc header); else behavior is undefined.
If and only if you intend to equip *this
with a handles pipe as well, you must call init_native_handle_pipe() to complete initialization.
While the below formally outlines how it all works, informally using this is pretty simple:
err_code
), then by the nature of C++ *this
cannot exist <=> this throws.err_code
), then a truthy *err_code
<=> *this
is unusable (except to move-to).Formally though:
Firstly: See flow::Error_code
docs for error reporting semantics (including the exception/code dichotomy). The bottom line is: If err_code
is null, then success <=> this ctor does not throw. If err_code
is non-null, then success <=> *err_code
is falsy after return. If it is truthy, the *this
shall not be used except to invoke destructor or to be moved-to. Otherwise behavior is undefined.
Secondly: The source of error conditions is explicitly the following:
Blob_stream_mq_sender<Mq>(logger_ptr, nickname_str, std::move(mq_out), err_code)
may emit an error.Blob_stream_mq_receiver<Mq>(logger_ptr, nickname_str, std::move(mq_in), err_code)
may emit an error.Hence the eventualities are as follows:
*err_code
. Yay!*err_code
associated with the one that did fail. (You cannot know which. Sorry.) Just give up on *this
(though technically it can still be moved-to).logger_ptr | Logger to use for logging subsequently. |
nickname_str | See nickname(). |
mq_out | Open handle to the underlying MQ for traffic from *this to opposing peer. The peer object becomes owned by *this via move. mq_out becomes unusable for transmission. |
mq_in | Open handle to the underlying MQ for traffic to *this from opposing peer. The peer object becomes owned by *this via move. mq_in becomes unusable for transmission. |
err_code | See above. |