SObjectizer  5.1
Открытые члены | Открытые статические члены | Защищенные члены | Закрытые типы | Закрытые члены | Закрытые данные | Друзья | Полный список членов класса
Класс so_5::rt::agent_t

Базовый класс агентов. Подробнее...

Граф наследования:so_5::rt::agent_t:
so_5::rt::atomic_refcounted_t gemont_2::a_retranslator_base_t so_5_transport::a_channel_base_t so_5_transport::a_transport_agent_t so_sysconf_4::breakflag_handler::a_handler_t so_sysconf_4::single_instance::a_single_instance_t so_sysconf_log_3::backend_keeper::a_backend_keeper_t so_sysconf_log_3::sysconf::a_fatal_error_logger_t so_5_transport::a_client_base_t so_5_transport::a_server_base_t so_5_transport::a_client_transport_agent_t so_5_transport::a_server_transport_agent_t mbapi_4::comm::a_mbapi_outgoing_channel_t mbapi_4::comm::a_mbapi_incoming_channel_t so_sysconf_4::ichannel::a_failure_handler_t

Открытые члены

 agent_t (so_environment_t &env)
 Конструктор агента. Подробнее...
 
const agent_tself_ptr () const
 Получить указатель на себя. Подробнее...
 
virtual void so_evt_start ()
 Начальное событие агента. Подробнее...
 
virtual void so_evt_finish ()
 Завершающее событие агента. Подробнее...
 
const state_tso_current_state () const
 Получить ссылку на текущее состояние.
 
const std::string & so_coop_name () const
 Имя кооперации, к которой принадлежит агент. Подробнее...
 
void so_add_nondestroyable_listener (agent_state_listener_t &state_listener)
 Добавить агенту слушателя, время жизни которого агент не контролирует.
 
void so_add_destroyable_listener (agent_state_listener_unique_ptr_t state_listener)
 Добавить агенту слушателся, владение которым передается агенту.
 
so_environment_tso_environment ()
 Получить ссылку на среду SO к которой принадлежит агент. Подробнее...
 

Открытые статические члены

static void call_push_event (agent_t &agent, const event_caller_block_ref_t &event_handler_caller, const message_ref_t &message)
 Поставить в очередь событие для выполнения агентом. Подробнее...
 
static void call_next_event (agent_t &agent)
 Инициировать выполнение очередного события. Подробнее...
 
static void call_bind_to_disp (agent_t &agent, dispatcher_t &disp)
 Привязать агента к диспетчеру. Подробнее...
 

Защищенные члены

bool so_was_defined () const
 Был ли агент определен? Подробнее...
 
const state_tso_default_state () const
 Работа с состояниями. Подробнее...
 
ret_code_t so_change_state (const state_t &new_state, throwing_strategy_t throwing_strategy=THROW_ON_ERROR)
 Сменить состояние. Подробнее...
 
subscription_bind_t so_subscribe (const mbox_ref_t &mbox_ref)
 Подписка и отписка от сообщения. Подробнее...
 
subscription_unbind_t so_unsubscribe (const mbox_ref_t &mbox_ref)
 Создать объект для изьятия подписки. Подробнее...
 
virtual void so_define_agent ()
 Первоначальная инициализация агента. Подробнее...
 

Закрытые типы

typedef std::map
< subscription_key_t,
impl::message_consumer_link_t * > 
consumers_map_t
 Тип карта привязок к обработчикам событий.
 

Закрытые члены

agent_ref_t create_ref ()
 Получить ссылку на агент. Внутренний метод SO. Вызывается только тогда - когда гарантированно агент еще нужен и его кто-то держит по ссылке.
 
void bind_to_coop (agent_coop_t &coop)
 Внедрение агента в действующий SO Runtime. Подробнее...
 
void bind_to_environment (impl::so_environment_impl_t &env_impl)
 Привязать агента к среде so_5. Подробнее...
 
void bind_to_disp (dispatcher_t &disp)
 Привязать агента к диспетчеру. Подробнее...
 
void define_agent ()
 Внутренний метод определения агента. Подробнее...
 
void undefine_agent ()
 Метод изьятия агента из системы. Подробнее...
 
ret_code_t create_event_subscription (const type_wrapper_t &type_wrapper, mbox_ref_t &mbox_ref, const event_handler_caller_ref_t &ehc, throwing_strategy_t throwing_strategy)
 Добавление/удаление привязок для обработки сообщений. Подробнее...
 
ret_code_t destroy_event_subscription (const type_wrapper_t &type_wrapper, mbox_ref_t &mbox_ref, const event_handler_caller_ref_t &ehc, throwing_strategy_t throwing_strategy)
 Уничтожить привязку между агентом и mbox-ом для обработки сообщений. Подробнее...
 
void destroy_all_subscriptions ()
 Уничтожить все подписки.
 
void push_event (const event_caller_block_ref_t &event_handler_caller, const message_ref_t &message)
 Постановка событий в очередь и их выполнение. Подробнее...
 
void exec_next_event ()
 Выполнить очередное событие. Подробнее...
 
- Закрытые члены inherited from so_5::rt::atomic_refcounted_t
 atomic_refcounted_t ()
 Конструктор по умолчанию. Устанавливает количество ссылок в 0.
 
void inc_ref_count ()
 Увеличить количество ссылок.
 
unsigned long dec_ref_count ()
 Уменьшить количество ссылок. Подробнее...
 

Закрытые данные

const state_t m_default_state
 Состояние по умолчанию.
 
const state_tm_current_state_ptr
 Текущее состояние агента.
 
bool m_was_defined
 Был ли агент определен.
 
std::unique_ptr
< impl::state_listener_controller_t
m_state_listener_controller
 Контроллер слушателей агента.
 
consumers_map_t m_event_consumers_map
 Потребители сообщения, которые являются обработчиками событий.
 
std::unique_ptr
< impl::local_event_queue_t
m_local_event_queue
 Локальная очередь событий.
 
impl::so_environment_impl_tm_so_environment_impl
 Среда so_5 которой принадлежит агент.
 
dispatcher_tm_dispatcher
 Диспетчер который занимается вызывом агента. Подробнее...
 
agent_coop_tm_agent_coop
 Кооперация которой принадлежит агент.
 
bool m_is_coop_deregistered
 Флаг помечена ли кооперация, как удаляемая?
 

Друзья

class subscription_bind_t
 
class subscription_unbind_t
 
class agent_ref_t
 
class agent_coop_t
 

Подробное описание

Базовый класс агентов.

Либой агент в SObjectizer-е должен быть производным от agent_t.

Базовый класс агента предоставляет различные методы, которые можно выделить в следующие основные группы:

Методы для взаимодействия с SObjectizer.

Метод so_5::rt::agent_t::so_environment() служит для получения доступа к SObjectizer Environment, а следовательно и ко всем методам SObjectizer Environment. Обращаться к методу можно сразу после создания агента, потому что агент привязывается к SObjectizer Environment в конструкторе базового класса so_5::rt::agent_t.

Хук-методы.

В базовом классе агента определены хук-методы для обработки различных ситуаций, которые по умолчанию ничего не делают.

Метод определения агента – agent_t::so_define_agent(), который вызывается до того как агент начнет работать в SO, т.е. до того, как начнется его работа на рабочей нити. Вызов этого метода осуществляется в процессе регистрации агента. Служит для начальной подписки агента на сообщения.

Во время жизненного цикла агента можно выделить два события: начала работы агента (когда кооперация успешно зарегистрирована и все агенты привязаны к диспетчерам) и завершения работы агента, когда кооперация дерегистрируется и агент завершил обработку последней заявки на обработку сообщения. Для обработки начала работы агента и завершения работы агента служат следующие хук-методы: agent_t::so_evt_start() и agent_t::so_evt_finish(). О вызове этих методов заботится SObjectizer, а пользователю остается только определить логику работы этих методов.

Методы подписки на сообщения и отмены подписок.

Механизм обработчиков сообщений строится на понятиях сообщения, mbox-а (ящик сообщений), обработчика сообщения (метода агента с особой сигнатурой) и на понятии состояния агента.

Обработчиком сообщения может считаться любой метод агента с сигнатурой аналогичной следующей:

void
evt_handler(

Где evt_handler — имя обработчика события, а MESSAGE — тип сообщения.

Класс so_5::rt::event_data_t является оберткой над указателем на объект типа MESSAGE, который предоставляет доступ к объекту аналогично std::unique_ptr. Причем самого объекта может и не существовать, когда отправитель сообщения не имеет намерения отправлять в сообщении никакой дополнительной информации, кроме типа сообщения, в таком случае сообщение представляет собой сигнал определенного типа и ничего более.

Подписка агента на сообщения осуществляется с помощью метода so_5::rt::agent_t::so_subscribe(). В результате создается объект класса so_5::rt::subscription_bind_t, который уже знает агента подписчика и mbox, к которому происходит подписка, а также в качестве состояния подписки выбрано состояние агента по умолчанию.

Методы работы с состояниями агента

Для смены состояния агента служит метод so_5::rt::agent_t::so_change_state(). Ошибка, при смене состояния, может возникнуть только тогда, когда производится попытка перевести агента в состояние, которым он не владеет. В некоторых случаях нужно определять моменты смены состояния агента. Например, при создании средств мониторинга приложения. Для этих случаев предназначены "слушатели"состояния агента. Агенту может быть назначено любое количество "слушателей". Для добавления слушателя, владение которым контролирует прикладной программист, служит метод so_5::rt::agent_t::so_add_nondestroyable_listener(). Для добавления слушателя, владение которым передается агенту, служит метод so_5::rt::sgent_t::so_add_destroyable_listener().

Примеры:
mbapi_4/binary_messages, mbapi_4/ping, mbapi_4/stages, so_5/chstate, so_5/coop_listener, so_5/disp, so_5/exception_handler, so_5/exception_logger, so_5/hello_all, so_5/hello_delay, so_5/hello_evt_handler, so_5/hello_periodic, so_5/hello_world, so_5/layer и so_5/mboxes.

Конструктор(ы)

so_5::rt::agent_t::agent_t ( so_environment_t env)
explicit

Конструктор агента.

При создании объекта-агента, он в обязательном порядке должен быть привязан к SObjectizer Environment, и эта привязка не может быть изменена в дальнейшем.

Аргументы
envСреда SO, для которой создается агент.

Перекрестные ссылки bind_to_environment() и so_5::rt::so_environment_t::so_environment_impl().

Методы

void so_5::rt::agent_t::bind_to_coop ( agent_coop_t coop)
private

Внедрение агента в действующий SO Runtime.

Привязать агента к кооперации.

Инициализирует внутренний указатель на кооперацию, а также взводит флаг что кооперация, которой принадлежит агент не является помеченной на дерегистрацию.

Аргументы
coopКооперация агентов.

Перекрестные ссылки m_agent_coop и m_is_coop_deregistered.

void so_5::rt::agent_t::bind_to_disp ( dispatcher_t disp)
private

Привязать агента к диспетчеру.

Определяет диспетчер, который будет являться реальным диспетчером агента. Если в локальной очереди что-то накопилось, то рельному диспетчеру будет поставлен запрос на выполнение всего количества накопившихся событий ко времени начала работы агента на данном диспетчере.

Аргументы
dispДиспетчер.

Перекрестные ссылки create_ref(), m_dispatcher, m_local_event_queue, so_5::rt::dispatcher_t::put_event_execution_request() и so_5::rc_agent_is_already_bind_to_disp.

Используется в call_bind_to_disp().

void so_5::rt::agent_t::bind_to_environment ( impl::so_environment_impl_t env_impl)
inlineprivate

Привязать агента к среде so_5.

Инициализирует внутренний указатель на среду SO и получает свою локальную очередь. Вызывается из конструктора агента.

Аргументы
env_implСреда so_5.

Перекрестные ссылки so_5::rt::impl::so_environment_impl_t::create_local_queue(), so_5::rt::event_caller_block_t::insert(), m_local_event_queue и m_so_environment_impl.

Используется в agent_t().

static void so_5::rt::agent_t::call_bind_to_disp ( agent_t agent,
dispatcher_t disp 
)
inlinestatic

Привязать агента к диспетчеру.

Аргументы
agentАгент.
dispДиспетчер.

Перекрестные ссылки bind_to_disp().

Используется в so_5::disp::active_group::impl::disp_binder_t::bind_agent(), so_5::disp::active_obj::impl::disp_binder_t::bind_agent() и so_5::disp::one_thread::impl::disp_binder_t::bind_agent().

static void so_5::rt::agent_t::call_next_event ( agent_t agent)
inlinestatic

Инициировать выполнение очередного события.

Метод который используется диспетчерами (рабочими нитями), для выполнения событий агента.

Аргументы
agentАгент, у которого в очереди есть события, и очередное событие которого надо выполнить.

Перекрестные ссылки exec_next_event().

Используется в so_5::disp::reuse::work_thread::work_thread_t::serve_demands_block().

static void so_5::rt::agent_t::call_push_event ( agent_t agent,
const event_caller_block_ref_t event_handler_caller,
const message_ref_t message 
)
inlinestatic

Поставить в очередь событие для выполнения агентом.

Метод который используется для планирования событий агента.

Аргументы
event_handler_callerВызыватель обработичика.
messageЭкземпляр сообщения, которое будет параметром обработчика событие, которое должен будет выполнить агент.

Перекрестные ссылки push_event().

Используется в so_5::rt::impl::message_consumer_link_t::dispatch().

ret_code_t so_5::rt::agent_t::create_event_subscription ( const type_wrapper_t type_wrapper,
mbox_ref_t mbox_ref,
const event_handler_caller_ref_t ehc,
throwing_strategy_t  throwing_strategy 
)
private

Добавление/удаление привязок для обработки сообщений.

Создать привязку между агентом и mbox-ом для обработки сообщений.

Аргументы
type_wrapperТип сообщения.
mbox_refСсылка на mbox.
ehcВызыватель обработчика.
throwing_strategyФлаг - бросать ли исключение в случае ошибки.

Перекрестные ссылки create_ref(), m_agent_coop, so_5::rt::agent_coop_t::m_agents_are_undefined, m_event_consumers_map, so_5::rt::agent_coop_t::m_lock, so_5::rt::mbox_t::subscribe_first_event_handler() и so_5::rt::mbox_t::subscribe_more_event_handler().

void so_5::rt::agent_t::define_agent ( )
private

Внутренний метод определения агента.

Вызывает so_define_agent(), после чего устанавливает флаг, что агент определен.

Перекрестные ссылки m_was_defined и so_define_agent().

ret_code_t so_5::rt::agent_t::destroy_event_subscription ( const type_wrapper_t type_wrapper,
mbox_ref_t mbox_ref,
const event_handler_caller_ref_t ehc,
throwing_strategy_t  throwing_strategy 
)
private

Уничтожить привязку между агентом и mbox-ом для обработки сообщений.

Аргументы
type_wrapperТип сообщения.
mbox_refMbox.
ehcВызыватель обработчика.
throwing_strategyФлаг - бросать ли исключение в случае ошибки.

Перекрестные ссылки m_agent_coop, m_event_consumers_map, so_5::rt::agent_coop_t::m_lock, so_5::rt::type_wrapper_t::query_type_info(), so_5::rc_no_event_handler_provided и so_5::rt::mbox_t::unsubscribe_event_handler().

Используется в so_5::rt::subscription_unbind_t::destroy_event_subscription().

void so_5::rt::agent_t::exec_next_event ( )
private

Выполнить очередное событие.

Должно вызываться только на контексте рабоченй нити.

Заметки
Полагается, что в очереди событий есть элементы.

Перекрестные ссылки so_5::rt::event_caller_block_t::call(), m_agent_coop, so_5::rt::impl::event_item_t::m_event_caller_block, m_is_coop_deregistered, m_local_event_queue и so_5::rt::impl::event_item_t::m_message_ref.

Используется в call_next_event().

void so_5::rt::agent_t::push_event ( const event_caller_block_ref_t event_handler_caller,
const message_ref_t message 
)
private

Постановка событий в очередь и их выполнение.

Поставить в очередь локальное событие.

Аргументы
event_handler_callerВызыватель обработичика
messageЭкземпляр сообщения.

Перекрестные ссылки create_ref(), m_dispatcher, m_is_coop_deregistered, m_local_event_queue и so_5::rt::dispatcher_t::put_event_execution_request().

Используется в call_push_event().

const agent_t * so_5::rt::agent_t::self_ptr ( ) const

Получить указатель на себя.

Для того, чтобы избежать многословных предупреждений от компилятора, когда в списке инициализации требуется испобльзовать this. Например, при инициализации состояний агента.

class a_sample_t
:
{
typedef so_5::rt::agent_t base_type_t;
// Состояние агента.
const so_5::rt::state_t m_sample_state;
public:
a_sample_t( so_5::rt::so_environment_t & env )
:
base_type_t( env ),
m_sample_state( self_ptr() )
{
// ...
}
// ...
};
ret_code_t so_5::rt::agent_t::so_change_state ( const state_t new_state,
throwing_strategy_t  throwing_strategy = THROW_ON_ERROR 
)
protected

Сменить состояние.

void
a_sample_t::evt_smth(
{
// Если с сообщение что-то не так, то
// переходим в сотояние "ошибка".
if( error_in_data( *msg ) )
so_change_state( m_error_state );
}
Аргументы
new_stateНовое состояние агента.
throwing_strategyФлаг - бросать ли исключение в случае ошибки.

Перекрестные ссылки so_5::rt::state_t::is_target(), m_current_state_ptr, m_state_listener_controller и so_5::rc_agent_unknown_state.

Используется в so_5_transport::a_client_transport_agent_t::do_reconnect() и so_5_transport::a_server_transport_agent_t::so_evt_start().

const std::string & so_5::rt::agent_t::so_coop_name ( ) const

Имя кооперации, к которой принадлежит агент.

Возвращает
Если агент принадлежит какой-либо кооперации, то вернет имя кооперации. Если же агент не является членом какой-либо кооперации, то выбросывается исключение.

Перекрестные ссылки m_agent_coop, so_5::rt::agent_coop_t::query_coop_name() и so_5::rc_agent_has_no_cooperation.

Используется в so_5::disp::reuse::work_thread::work_thread_t::handle_exception() и so_5_transport::a_server_base_t::so_handle_create_server_socket_result().

const state_t & so_5::rt::agent_t::so_default_state ( ) const
protected

Работа с состояниями.

Получить ссылку на состояние по умолчанию.

Перекрестные ссылки m_default_state.

Используется в so_5_transport::a_channel_base_t::a_channel_base_t().

void so_5::rt::agent_t::so_define_agent ( )
protectedvirtual

Первоначальная инициализация агента.

Метод определения агента.

Метод, который вызывается до того как агент начнет работать в SO, т.е. до того как начнется его работа на рабочей нити.

class a_sample_t
:
{
// ...
virtual void
void
evt_handler_1(
// ...
void
evt_handler_N(
};
void
a_sample_t::so_define_agent()
{
// Подписываемся на сообщения.
so_subscribe( m_mbox1 )
.in( m_state_1 )
.event( &a_sample_t::evt_handler_1 );
// ...
so_subscribe( m_mboxN )
.in( m_state_N )
.event( &a_sample_t::evt_handler_N );
}

Переопределяется в so_5_transport::a_client_transport_agent_t, so_sysconf_log_3::sysconf::a_fatal_error_logger_t, gemont_2::a_retranslator_base_t, so_5_transport::a_channel_base_t, so_sysconf_4::breakflag_handler::a_handler_t, so_5_transport::a_transport_agent_t и so_5_transport::a_server_base_t.

Примеры:
so_5/chstate, so_5/hello_all, so_5/hello_delay, so_5/hello_evt_handler, so_5/hello_periodic, so_5/layer и so_5/mboxes.

Используется в define_agent().

so_environment_t & so_5::rt::agent_t::so_environment ( )

Получить ссылку на среду SO к которой принадлежит агент.

Метод служит для получения доступа к SObjectizer Environment, а следовательно и ко всем методам SObjectizer Environment. Это, например позволяет агенту создать кооперации лругих агентов.

void
a_sample_t::evt_on_smth(
{
so_5::rt::nonempty_name_t( "first_coop" ) );
// Добавляем в кооперацию агентов.
coop->add_agent( so_5::rt::agent_ref_t(
new a_another_t( ... ) ) );
// ...
// Регистрируем кооперацию.
}

Или, например, инициировать завершение работы.

void
a_sample_t::evt_last_event(
{
// Обрабатываем сообщение.
process( msg );
// Останавливаемся.
}
Примеры:
so_5/exception_handler, so_5/exception_logger и so_5/hello_world.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::query_public_so_environment().

Используется в mbapi_4::comm::a_mbapi_incoming_channel_t::check_sync_necessity(), so_5_transport::a_client_transport_agent_t::do_reconnect(), so_sysconf_4::breakflag_handler::a_handler_t::evt_check_time(), so_5_transport::a_client_transport_agent_t::on_lost(), gemont_2::a_retranslator_base_t::so_define_agent(), so_sysconf_log_3::sysconf::a_fatal_error_logger_t::so_define_agent(), so_sysconf_log_3::backend_keeper::a_backend_keeper_t::so_evt_finish(), so_sysconf_4::single_instance::a_single_instance_t::so_evt_start(), so_sysconf_4::breakflag_handler::a_handler_t::so_evt_start(), so_sysconf_log_3::backend_keeper::a_backend_keeper_t::so_evt_start(), mbapi_4::comm::a_mbapi_outgoing_channel_t::so_handle_client_connected(), so_5_transport::a_server_base_t::so_handle_create_server_socket_result() и so_sysconf_4::ichannel::a_failure_handler_t::so_handle_create_server_socket_result().

void so_5::rt::agent_t::so_evt_finish ( )
virtual

Завершающее событие агента.

Т.е. то событие, которое гарантировано будет вызвано последним, до того момента, как агент будет отвязан к диспетчеру.

Метод играет роль своеобразного деструктора, в контексте SObjectizer, когда агент может выполнить какие-то действия на своей нити, еще до того, как будет вызван деструктор агента.

class a_sample_t
:
{
// ...
virtual void
// ...
};
a_sample_t::so_evt_finish()
{
std::cout << "last agent activity";
if( so_current_state() == m_db_error_happened )
{
// Уничтожаем подключение к БД
// в том же потоке в котором работали и
// в котором произошла ошибка
m_db.release();
}
}

Переопределяется в so_5_transport::a_client_transport_agent_t, so_5_transport::a_server_transport_agent_t, so_sysconf_log_3::backend_keeper::a_backend_keeper_t, mbapi_4::comm::a_mbapi_incoming_channel_t, mbapi_4::comm::a_mbapi_outgoing_channel_t, so_5_transport::a_transport_agent_t и so_sysconf_4::single_instance::a_single_instance_t.

Примеры:
so_5/disp, so_5/exception_logger и so_5/hello_world.
void so_5::rt::agent_t::so_evt_start ( )
virtual

Начальное событие агента.

Т.е. то событие, которое гарантировано будет вызвано первым, в тот момент когда, агент будет привязан к диспетчеру.

Метод играет роль своеобразного конструктора, в контексте SObjectizer, когда сначала конструируется сам объект агента, затем он привязывается к своему диспетчеру и начинает работу на нити диспетчера с вызова \с so_evt_start().

class a_sample_t
:
{
// ...
virtual void
// ...
};
a_sample_t::so_evt_start()
{
std::cout << "first agent action on binded"
" dispatcher" << std::endl;
// Отправить инициирующие сообщение.
m_mbox->deliver_message( ... );
}

Переопределяется в so_5_transport::a_client_transport_agent_t, so_5_transport::a_server_transport_agent_t, so_sysconf_log_3::backend_keeper::a_backend_keeper_t, so_sysconf_4::breakflag_handler::a_handler_t, mbapi_4::comm::a_mbapi_incoming_channel_t, mbapi_4::comm::a_mbapi_outgoing_channel_t и so_sysconf_4::single_instance::a_single_instance_t.

Примеры:
so_5/chstate, so_5/disp, so_5/exception_handler, so_5/exception_logger, so_5/hello_all, so_5/hello_delay, so_5/hello_evt_handler, so_5/hello_periodic, so_5/hello_world, so_5/layer и so_5/mboxes.
subscription_bind_t so_5::rt::agent_t::so_subscribe ( const mbox_ref_t mbox_ref)
protected

Подписка и отписка от сообщения.

Создать объект для выполнения подписки.

void
a_sample_t::so_define_agent()
{
// Подписаться на сообщения.
so_subscribe( m_mbox_target )
.in( m_state_one )
.event( &a_sample_t::evt_sample_handler );
}
Аргументы
mbox_refMbox на сообщение которого подписывать.

Используется в so_5_transport::a_server_base_t::so_define_agent(), so_5_transport::a_transport_agent_t::so_define_agent(), so_sysconf_4::breakflag_handler::a_handler_t::so_define_agent(), so_5_transport::a_channel_base_t::so_define_agent(), gemont_2::a_retranslator_base_t::so_define_agent(), so_sysconf_log_3::sysconf::a_fatal_error_logger_t::so_define_agent(), so_5_transport::a_client_transport_agent_t::so_define_agent(), mbapi_4::comm::a_mbapi_outgoing_channel_t::so_evt_start() и mbapi_4::comm::a_mbapi_incoming_channel_t::so_evt_start().

subscription_unbind_t so_5::rt::agent_t::so_unsubscribe ( const mbox_ref_t mbox_ref)
protected

Создать объект для изьятия подписки.

void
a_sample_t::evt_smth(
{
// Отписаться от сообщения.
so_unsubscribe( m_mbox_target )
.in( m_state_one )
.event( &a_sample_t::evt_sample_handler );
}
Аргументы
mbox_refmbox от сообщений которого отписывать.
bool so_5::rt::agent_t::so_was_defined ( ) const
protected

Был ли агент определен?

Когда надо определить определен ли агент уже.

class a_sample_t
:
{
// ...
public:
void
set_target_mbox(
const so_5::rt::mbox_ref_t & mbox )
{
// mbox для подписки нельзя менять
// после того как агент на него подписался.
if( !so_was_defined() && mbox.get() )
{
m_target_mbox = mbox;
}
}
private:
so_5::rt::mbox_ref_t m_target_mbox;
};

Перекрестные ссылки m_was_defined.

Используется в so_5_transport::a_channel_base_t::so_add_state_for_channel_events().

void so_5::rt::agent_t::undefine_agent ( )
private

Метод изьятия агента из системы.

Метод который изымает все подписки агента.

Заметки
Внутренний метод SO.

Перекрестные ссылки create_ref(), destroy_all_subscriptions(), so_5::rt::event_caller_block_t::insert(), m_dispatcher, m_is_coop_deregistered, m_local_event_queue и so_5::rt::dispatcher_t::put_event_execution_request().

Данные класса

dispatcher_t* so_5::rt::agent_t::m_dispatcher
private

Диспетчер который занимается вызывом агента.

По умолчанию получает заглушку, которая ничего не делает, а просто поглащает вызовы постановки агента в очередь на вызов. После привязки агента к реальному диспетчеру сменить его нельзя, и при попытке это сделать произойдет ошибка.

Владение над m_dispatcher агент не имеет.

Используется в bind_to_disp(), push_event() и undefine_agent().


Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:22. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo