вторник, 17 мая 2016 г.

asio_samples 1.0.0 released

Первый релиз состоялся: asio_samples-1.0.0.

2 года прошло с тех пор, как проект переехал на GitGub. За это время я успел сменить место работы и полностью переехать на Git как дома, так и в офисе. Успел попробовать CMake и полностью перевел сборку "asio samples" на CMake, убрав из репозитория все другие проекты. Успел получить бесплатную Open Source лицензию для CLion. Ради CLion пришлось начать использовать MinGW и теперь основное время я провожу в CLion с MinGW, но иногда проверяю детали в MSVS 2015 Community Edition. С удовольствием ("джва года ждал") могу подтвердить, что CLion является IntelliJ IDEA для C++ (ну разве что медленнее - тут C++ виноват).

В последнее время в "asio samples" начали появляться unit-тесты (на Google Test - популярно / удобно и есть интеграция с CMake / CLion). В планах увеличить покрытие основных сценариев использования и наиболее критичных (самых неприятных и неочевидных) пограничных случаев.

пятница, 14 февраля 2014 г.

Asio samples were moved to GitHub

Для читателей блога и нелюбителей SourceForge (есть за что) перепечатываю эту запоздалую "новость":

Asio samples were moved to GitHub.
The SourceForge SVN repository and files won't get updates anymore.
There won't be any other announces in asio-samples mailing list, however I'll continue to answer questions posted there.
The preferred way for bug reporting is GitHub issues page.

суббота, 7 сентября 2013 г.

await добрался до C++

Смотрю GoingNative 2013.

Особенно интересно выступление по теме "Bringing await to C++". "Асинронность" (ожидаемо) идет в массы и становится трендом. Настолько, что ее поддержку внедряют в компилятор и в будущий стандарт C++ (надеюсь, что последнее все-таки свершится). Понятное дело, это все для того, чтобы сделать программирование "асинхронности" максимально удобным для обывателей "среднестатистического программиста" и лучше оптимизировать.

Stackfull coroutines (наконец-то) идут в массы. Всего какой-то год назад "текли слюни" при взгляде на поддержку await в C#! Видимо, компании, которые массово используют C++ и потому влияют на его развитие, действительно активно используют асинхронные алгоритмы и остро нуждаются в средствах, способных облегчить их реализацию на C++ (а заодно и лучше оптимизировать подобный код).

Кто еще сомневается в необходимости работать с вводом-выводом асинхронно даже в клиентской части (например, уеt another messenger)? На "рельсы асинхронности" уже планируют перевести не только сетевой ввод-вывод - смотрите, примеры-то у всех (кто говорит, про PPL, std::future::then и даже про уже существующий WinRT) работают со "старыми добрыми" файлами (а, может быть, просто у них пока нет чего-то более-менее стандартного и краткого для сетевого ввода вывода?). И не только (правда, там уже делают больший упор на lazy-вычисления).

P.S. Q&A Panel особенно порадовала. Определенно, нынешний GoingNative гораздо лучше предыдущего и лучше уже прошедшего C++Now. Отличные докладчики (хотя их состав почти не меняется) с неплохим чувством юмора!

воскресенье, 1 сентября 2013 г.

::boost::asio::io_service::strand и лишние проверки

Среди заголовочных файлов "asio samples" лежит "скромный" ma/strand_wrapped_handler.hpp. Когда-то, разбираясь с invocation strategy и io_service::strand, я наткнулся на то, что стандартно обернутый через asio::io_service::strand::wrap() функциональный объект делает проверку (на исполнение в контексте strand-а) и в asio_handler_invoke, и в своем operator(). Так вот, обычно достаточно делать такую проверку только в asio_handler_invoke. "Обычно" в этом предложении означает: для всех классов Boost.Asio и вообще везде, где вы сами не вызываете напрямую operator() у функционального объекта, "обернутого" через strand. В противном случае, при использовании asio_handler_invoke с таким образом обернутым функциональным объектом (вспоминаем, что Boost.Asio всегда вызывает все user-defined обработчики только так), проверка на исполнение в контексте strand будет выполняться дважды! Данная операция не такая уж и легкая (использует мютексы/критические секции). Кому интересно, загляните в исходники Asio.

С тех пор (давно) вместо asio::io_service::strand::wrap() везде в "asio samples" я использую свой макрос MA_STRAND_WRAP(strand, handler), определенный в том самом ma/strand_wrapped_handler.hpp. Моя strand-"обертка" для функционального объекта использует asio::io_service::strand::dispatch только в asio_handler_invoke.

Автору Asio я писал (давно, в список рассылки). Он ответил, что те, кого волнуют подобные двойные проверки (я согласен с тем, что еще не известно, как/насколько они скажутся на производительности) смогут аналогично мне сами написать свою обертку. Кхм... В свете того, что Asio все чаще используется даже высоконагруженными гигантами вроде Mail.ru (и, кажется, уже давно в Yandex), хотел бы порекомендовать пользователям Asio по-чаще смотреть в исходники самой библиотеки Asio.

среда, 31 июля 2013 г.

Ожидаемая C++ IDE от создателей замечательной IntelliJ IDEA

Давно ждал новостей о C++ IDE от гениальных JetBrains. Сожалел, что не смог попасть на день открытых дверей JetBrains. А недавно наткнулся в RSS Хабра на "Видео с дня открытых дверей JetBrains", где есть видео презентации "C++ IDE и как с ней бороться":



Чтож, c нетерпением жду ReSharper с поддержкой C++ и саму С++ IDE. Жизнь в мире C++ становится все более комфортной и все менее олдскульной (Far Manager + Colorer Plugin!?).

Asio samples 0.6.0 is out

Вышла очередная бета asio samples 0.6.0. Приведу здесь только основные изменения:
  • Класс ma::console_controller переименован в ma::console_close_guard и реализован через boost::asio::signal_set для *nix и через ma::windows::console_signal (см. ниже) для Windows.
  • Представлен класс (расширение Boost.Asio) ma::windows::console_signal (+ ma::windows::console_signal_service). Данный класс может использоваться как каркас для расширений Boost.Asio, использующих внутренние потоки. Он будет подробнее освещен в отдельной статье позже. Пока же скажу лишь, что класс ma::windows::console_signal (определен только при сборке для Windows 2000 и выше) позволяет асинхронно ожидать сигнала к закрытию консольного приложения пользователем (путем использования комбинации клавиш Ctrl+C/Ctrl+Break, закрытия окна или выхода из системы/завершения работы компьютера)
  • Выделены отдельно и изменены классы ma::detail::intrusive_list и ma::detail::intrusive_slist: добавлены ссылки на конец списка, которые позволили реализовать конкатенацию списков со сложностью O(1).
  • Добавлена поддержка Qt 5, Boost C++ Libraries 1.53/1.54.

Остальные детали беты 0.6.0 можно прочитать в списке рассылки.

Updated
Исправление ошибок в классах ma::console_close_guard и ma::windows::console_signal_service вылилось в asio samples 0.6.1.

понедельник, 29 октября 2012 г.

Asio samples 0.5.0 is out

Вышла очередная бета asio samples 0.5.0. Приведу здесь основные изменения, которых хватило аж на смену среднего номера версии.

Во-первых, сильно изменился (в лучшую сторону) класс ma::handler_storage. Теперь он поддерживает функциональные объекты с operator()(void) при специализации ma::handler_storage<void>.

Кроме того, наконец-то, метод ma::handler_storage::target() стал типизированным, что избавляет его пользователей (см. проект nmea_client) от неприятных reinterpret_cast. По умолчанию ma::handler_storage::target() возвращает void*, но теперь, при желании, этот тип можно специфицировать указав его в качестве второго шаблонного аргумента ma::handler_storage.

При такой специализации для класса ma::handler_storage_service должно быть доступно преобразование static_cast<Target*>(Handler*), где
  • Target - специфицированный для ma::handler_storage::target() тип (т.е. Target* ma::handler_storage<Arg, Target>::target()).
  • Handler - тип функционального объекта, хранимого в ma::handler_storage.

Второе крупное нововведение заключается в поддержке проектами qt_echo_server, echo_server, async_connect и asio_performance_test_client режима io_service-per-work-thread (по аналогии с HTTP Server 2 из примеров Asio). Для CLI за этот режим отвечает параметр demux_per_work_thread. Для Windows режим io_service-per-work-thread по умолчанию отлючен (--demux_per_work_thread=0, false, off). Для других платформ - по умолчанию включен (--demux_per_work_thread=1, true, on).

Остальные детали беты 0.5.0 можно прочитать в списке рассылки.

Updated
Исправление ошибок и расширение поддержки лямбд вылилось в asio samples 0.5.1.