пятница, 21 июля 2023 г.

[prog.c++] Тяжко это, разбираться с голой многопоточностью без SObjectizer-а

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

Давеча пришлось разбираться с кодом, который написан на голых нитях и мьютексах. Точнее даже на одном мьютексе...

В общем, есть объекты A, B и C. У объекта B есть мьютекс, который объект B использует совместно с объектами A и C. При этом объект C является подчиненным для B, т.е. B инициирует создание C и должен среагировать на исчезновение C.

У объектов B и C есть ссылка на объект A. У объекта A есть ссылки на B и C. Объекты A и C дергают методы друг друга. Объект A создает и уничтожает объект B.

И все эти объекты живут на разных нитях.

Вроде бы не должно быть сложно: всего три объекта, всего три нити, всего один мьютекс.

Но блин, у меня ушло несколько часов, чтобы вкурить эту кухню.

И то, спустя несколько дней копания в коде я все равно вынужден перепроверять себя, т.к. не уверен что в конкретном месте кода можно обойтись без захвата мьютекса (или, напротив, что захват мьютекса нужен). Бррр... 😉

Хотя, конечно, всегда есть шанс, что это я просто уже совсем старенький, мозги уже не те 🙁

четверг, 20 июля 2023 г.

[prog.c++.wtf] Голый владеющий указатель на shared_ptr?

Чего только в жизни не бывает! Похоже, что я оказываюсь в ситуации, когда потребуется поиметь голый владеющий указатель на std::shared_ptr. Что-то вроде (псевдокод для иллюстрации, не претендует на production readyness):

void ready_handler(const mg_connection * conn, void *) {
   auto shared_conn_data = std::make_shared<connection_data_t>(...);
   auto * owning_ptr = new std::shared_ptr<connection_data_t>{shared_conn_data};

   mg_set_user_connection_data(conn, owning_ptr); // Только за этим onwing_ptr и нужен был.
                                                  // Нельзя таким образом сохранить весь shared_ptr.

   send_to_external_thread(shared_conn_data);
}
...
void close_handler(const mg_connection * conn, void *) {
   auto * owning_ptr = reinterpret_cast<std::shared_ptr<connection_data_t>>(
         mg_get_user_connection_data(conn));
   // Этот экземпляр больше не нужен.
   // Если где-то на внешней нити остался свой shared_ptr, то connection_data_t продолжит
   // свое существование и после выхода из close_handler.
   // Если нет, то connection_data_t умрет прямо сейчас.
   delete owning_ptr;
}

Интеграция с написанным на чистом Си коде. Ничего лучшего пока не придумывается :)

[wow] LOR торт, а я ай-ти-голодранец!

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

цинк

Надеюсь люди, которые задавали мне вопросы по нашим OpenSource разработкам или открывали Issues на GitHub-е, смогут составить свое впечаление о том отвечаю ли я за что-то и исправляю ли ошибки.

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

вторник, 18 июля 2023 г.

[prog.c++] Мои собственные впечатления от работы над релизом SObjectizer-5.8.0

Состоялся релиз SObjectizer-5.8.0 и so5extra-1.6.0. Список изменений можно найти в Wiki проекта. На Хабре есть статья с более развернутым описанием некоторых из них. Здесь же я поплачусь про тяжелую жизнь поделюсь своими личными впечатлениями о работе над этим релизом, без формализма и официоза.