#include <so_5/all.hpp>
struct child_started_t final : public so_5::signal_t {};
class child_t final : public so_5::agent_t
{
public:
child_t(context_t ctx, so_5::mbox_t ready_mbox)
, m_ready_mbox(
std::move(ready_mbox))
{}
virtual void so_evt_start() override
{
so_5::send<child_started_t>(m_ready_mbox);
}
private:
const so_5::mbox_t m_ready_mbox;
};
class sample_performer_t final : public so_5::agent_t
{
using child_started_mbox_t =
public:
sample_performer_t(context_t ctx, std::size_t child_count)
, m_child_count(child_count)
{
so_subscribe_self()
.event(&sample_performer_t::on_all_child_started);
}
virtual void so_evt_start() override
{
so_direct_mbox(),
m_child_count);
so_environment(),
3 );
for(std::size_t i = 0; i != m_child_count; ++i)
{
introduce_child_coop(*this,
tp_disp.binder(so_5::disp::thread_pool::bind_params_t{}),
[&ready_mbox](so_5::coop_t & coop) {
coop.make_agent<child_t>(ready_mbox);
});
}
std::cout << "All children agents are created" << std::endl;
}
private:
const std::size_t m_child_count;
void on_all_child_started(mhood_t<child_started_mbox_t::messages_collected_t>)
{
std::cout << "All children agents are started" << std::endl;
so_deregister_agent_coop_normally();
}
};
int main()
{
try
{
so_5::launch([](so_5::environment_t & env) {
env.introduce_coop([&](so_5::coop_t & coop) {
coop.make_agent<sample_performer_t>(25u);
});
});
}
catch(const std::exception & x)
{
std::cerr << "Exception caught: " << x.what() << std::endl;
}
}