четверг, 7 ноября 2013 г.

[prog.c++] Зафиксирована версия SObjectizer-5.2.2

Версия 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 уже выглядит вполне реальным :)

Отправить комментарий