#include <so_5/all.hpp>
#include <array>
using namespace std::chrono_literals;
class worker_t final : public so_5::agent_t
{
public :
struct start final : public so_5::signal_t {};
struct stop final : public so_5::signal_t {};
worker_t( context_t ctx, std::string name )
: so_5::agent_t{ std::move(ctx) }
, m_name{ std::move(name) }
{}
void so_define_agent() override
{
so_subscribe_self()
.event( &worker_t::on_start )
.event( &worker_t::on_stop );
}
private :
const std::string m_name;
void on_start( mhood_t<start> )
{
std::cout << m_name << ": starting..." << std::endl;
}
void on_stop( mhood_t<stop> )
{
std::cout << m_name << ": stopping..." << std::endl;
}
};
class manager_t final : public so_5::agent_t
{
struct time_to_stop final : public so_5::signal_t {};
public :
manager_t( context_t ctx, so_5::mbox_t worker )
:
so_5::agent_t{ std::move(ctx) }
, m_worker{ std::move(worker) }
{}
void so_define_agent() override
{
so_subscribe_self().event( &manager_t::on_stop );
}
void so_evt_start() override
{
so_5::send_delayed< time_to_stop >( *this, 250ms );
so_5::send< worker_t::start >( m_worker );
}
public :
const so_5::mbox_t m_worker;
void on_stop( mhood_t<time_to_stop> )
{
so_5::send< worker_t::stop >( m_worker );
so_deregister_agent_coop_normally();
}
};
int main()
{
so_5::launch( []( so_5::environment_t & env ) {
env.introduce_coop( [&]( so_5::coop_t & coop ) {
std::array< so_5::mbox_t, 3 > worker_mboxes{
coop.make_agent< worker_t >( "First" )->so_direct_mbox(),
coop.make_agent< worker_t >( "Second" )->so_direct_mbox(),
coop.make_agent< worker_t >( "Third" )->so_direct_mbox()
};
coop.make_agent< manager_t >( std::move(broadcast_mbox) );
} );
} );
return 0;
}
Ranges for error codes of each submodules.