struct msg_client_logged_in { // Идентификатор клиента. // Не может быть пустым. const std::string m_name; // Канал, через которое произошло подключение. // Не может быть пустым. const so_4::rt::comm_channel_t m_channel; ... };
struct msg_client_logged_in { ... static bool check( const msg_client_logged_in * cmd ) { // Сообщение должно содержать данные... return ( cmd != 0 && // ...имя клиента не должно быть пустым... !cmd->m_name.empty() && // ...идентификатор канала не может быть пустым... !cmd->m_channel.is_null() ); } }; ... // ...где-то в описании класса агента для SObjectizer... SOL4_MSG_START( msg_client_logged_in, a_some_agent_t::msg_client_logged_in ) ... SOL4_MSG_CHECKER( a_some_agent_t::msg_client_logged_in::check ) SOL4_MSG_FINISH()
До версии 4.4.0 SObjectizer вызывал message checker внутри so_4::api::send_msg() перед выполнением диспетчеризации сообщения. Т.е. сколько бы событий не было сгенерированно в результате send_msg(), message checker вызывался всего один раз на контексте той нити, на которой была вызвана функция send_msg().
В версии 4.4.0-beta6 изменился момент вызова message checker-а. Теперь он вызывается перед запуском сгенерированного сообщением события на контексте той нити, на которой производится запуск события. Запуск message checker-а производится для каждого события, сгенерированного данным сообщением. Это значит, что если сообщение привело к возникновению нескольких событий, то message checker будет вызван для каждого из них.
Такое положение вещей означает, что message checker должен быть thread safe. В идеале, message checker должен быть небольшой реентерабильной функцией без побочных эффектов, не нуждающейся в синхронизации.
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой 1.5.6 |