Версия 5.2.2 фреймворка SObjectizer зафиксирована в svn-репозитории на SourceForge в виде тега.
Главное дополнение в версии 5.2.2 -- это возможность перепослать или сохранить для перепосылки тот же самый экземпляр сообщения. Т.е., если раньше для посылки полученного сообщения другому агенту нужно было делать копию:
void evt_some_info( const so_5::rt::event_data_t< msg_info > & evt ) { ... // какие-то действия в результате которых выясняется, // что сообщение должно быть отослано другому агенту... m_other_mbox->deliver_message( // Посредством копирования экземпляра. new msg_info( *evt ) ); } |
То теперь можно отослать именно тот самый экземпляр сообщения:
void evt_some_info( const so_5::rt::event_data_t< msg_info > & evt ) { ... // какие-то действия в результате которых выясняется, // что сообщение должно быть отослано другому агенту... m_other_mbox->deliver_message( // Отсылается тот же самый экземпляр. evt.make_reference() ); } |
Метод шаблонного класса event_data_t<MSG>::make_reference() возвращает экземпляр умного указателя smart_atomic_reference_t<MSG>. Этот экземпляр может быть либо передан в deliver_message() сразу, либо же можно сохранить его и отослать сохраненный экземпляр сообщения позднее.
Данную функциональность (т.е. возможность перепосылки того же самого экземпляра сообщения) я хотел реализовать еще в SO4. Но там это было несколько сложнее, т.к. необходимая системная информация (включая счетчик ссылок на сообщение) хранилась внутри SO и пользователю не показывалась. В SO5 же введен специальный базовый тип message_t, от которого должны наследоваться все классы сообщений. Служебная информация, включая счетчик ссылок, находится в message_t. Поэтому в появляется простая возможность сохранить его или же отослать другому получателю. Для этого нужно всего лишь получить умный указатель на экземпляр сообщения (т.е. объект smart_atomic_reference_t, возвращаемый методом event_data_t::make_reference()).
Эту возможность мы закладывали в SO5 изначально. Но реализована она была только сейчас из-за того, что все время находились какие-то более приоритетные и срочные работы.
Класс smart_atomic_reference_t в SO5 -- это интрузивный умный указатель, использующий atomic-counter-ы из библиотеки ACE (он похож на boost::intrusive_ptr, но т.к. Boost в SO5 не используется, то в SO5 на основе ACE сделан собственный вариант).
PS. В последнее время я закопался с приведением в порядок одного из SO-проектов, so_sysconf, поэтому релиз пакета SO-библиотек затянулся. Но, вроде бы, недоделок становится все меньше и меньше. Так что релиз осенней сборки SO5 уже выглядит вполне реальным :)
Комментариев нет:
Отправить комментарий