diff --git a/README-RU.md b/README-RU.md index d560515..a107500 100644 --- a/README-RU.md +++ b/README-RU.md @@ -242,8 +242,8 @@ path, который запрашивает stop. долгий блокирующий `process()` может отложить обработку SIGINT/SIGTERM до возврата управления в runner loop. -Для POSIX-приложений с длинными throttle delays добавьте opt-in self-pipe -component до компонентов, которые могут блокировать loop: +Для POSIX-приложений с длинными задержками throttle добавьте опциональный +компонент self-pipe wake до компонентов, которые могут блокировать цикл: ```cpp consolix::add(); @@ -252,10 +252,10 @@ consolix::add( std::chrono::seconds(10)); ``` -POSIX handler по-прежнему только сохраняет сигнал и пишет один байт в pipe. -Watcher thread будит `LoopWakeService` уже из обычного C++ кода, поэтому +POSIX-обработчик по-прежнему только сохраняет сигнал и пишет один байт в pipe. +Поток-наблюдатель будит `LoopWakeService` уже из обычного C++-кода, поэтому SIGINT/SIGTERM может прервать ожидание `LoopThrottleComponent` без mutex/CV -работы внутри signal handler. На Windows этот component является no-op. +работы внутри signal handler. На Windows этот компонент является no-op. ## Documentation diff --git a/include/consolix/components/PosixSignalWakeComponent.hpp b/include/consolix/components/PosixSignalWakeComponent.hpp index 406affc..20fb920 100644 --- a/include/consolix/components/PosixSignalWakeComponent.hpp +++ b/include/consolix/components/PosixSignalWakeComponent.hpp @@ -66,8 +66,11 @@ namespace consolix { private: void stop_service() { - if (m_service) { - m_service->stop(); + auto service = m_service; + m_service.reset(); + + if (service) { + service->stop(); } m_initialized.store(false); } diff --git a/include/consolix/core/PosixSignalWakeService.hpp b/include/consolix/core/PosixSignalWakeService.hpp index cf04e2e..ede3800 100644 --- a/include/consolix/core/PosixSignalWakeService.hpp +++ b/include/consolix/core/PosixSignalWakeService.hpp @@ -270,6 +270,9 @@ namespace consolix { } static volatile std::sig_atomic_t& signal_wake_fd() { + // Store the pipe fd as sig_atomic_t so the signal handler can read it + // without locks or C++ runtime calls. On supported POSIX targets, + // process-local file descriptors fit in this value. static volatile std::sig_atomic_t fd = -1; return fd; }