-
Notifications
You must be signed in to change notification settings - Fork 5
so5extra 1.5 Mchains FixedSize
Yauheni Akhotnikau edited this page Dec 29, 2021
·
1 revision
Sometimes an mchain is created to receive a fixed number of messages. And this number is known at the compile time. Something like that:
auto reply_ch = so_5::create_mchain(env,
1u, // Just one message is expected.
so_5::mchain_props::memory_usage_t::preallocated,
so_5::mchain_props::overflow_reaction_t::abort_app);
so_5::send<request>(dest_mbox, reply_ch);
... // Do something...
// Wait and handle a reply from reply_ch.
so_5::receive(from(reply_ch).handle_n(1), [](const reply & r) {...});
The problem there is two allocations of memory in the call of create_mchain
:
- mchain instance is allocated dynamically;
- the message queue with capacity of just one item is allocated for that mchain instance.
It seems that those two allocations make usage of mchains for request-reply scenarios too expensive. Because of that so_5::extra::mchains::fixed_size
contains implementation of mchains with fixed-capacity message queue embedded into an mchain instance. Creation of such mchain lead to just one memory allocation instead of two.
Usage of such mchain looks like that:
#include <so_5_extra/mchains/fixed_size.hpp>
// The main SObjectizer's header file should be included separatelly.
#include <so_5/all.hpp>
...
// Just one message is expected.
auto reply_ch = so_5::extra::mchains::fixed_size::create_mchain<1>(env,
so_5::mchain_props::overflow_reaction_t::abort_app);
so_5::send<request>(dest_mbox, reply_ch);
... // Do something...
// Wait and handle a reply from reply_ch.
so_5::receive(from(reply_ch).handle_n(1), [](const reply & r) {...});
The so_5::extra::mchains::fixed_size
namespace contains the following create_mchain
functions:
// Create a mchain without waiting on attempt to send into the full mchain.
template< std::size_t Size >
[[nodiscard]] mchain_t create_mchain(
environment_t & env,
so_5::mchain_props::overflow_reaction_t overflow_reaction );
// Create a mchain with waiting on attempt to send into the full mchain.
template< std::size_t Size >
[[nodiscard]] mchain_t create_mchain(
environment_t & env,
so_5::mchain_props::duration_t wait_timeout,
so_5::mchain_props::overflow_reaction_t overflow_reaction );
// Create a mchain from existing mchain_params object.
// Note that some values from mchain_params will be ignored.
template< std::size_t Size >
[[nodiscard]] mchain_t create_mchain(
environment_t & env,
const so_5::mchain_params_t & params );