From 1ed5a32fd1a33771f12f0eb3329727a3425ed2f3 Mon Sep 17 00:00:00 2001 From: pajlada Date: Sun, 20 Jul 2025 12:13:41 +0200 Subject: [PATCH] fix: eventsub stopped flag join (#6136) --- CHANGELOG.md | 1 + src/providers/twitch/eventsub/Controller.cpp | 25 ++++++++++++++------ src/providers/twitch/eventsub/Controller.hpp | 2 ++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcc9e9be..ca00fef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ - Dev: Refactored `Notebook`-related enums into their own file. (#6220) - Dev: Refactored `SettingWidget::dropdown` for string enums to the source file. (#6293) - Dev: Don't try to save emote popup bounds if we're quitting. (#6292) +- Dev: Only carefully join EventSub controller thread. (#6136) - Dev: Remove `ChannelPageView::addCheckbox`. (#6305) - Dev: Remove `ChannelPageView::addIntInput`. (#6306) - Dev: Implemented customizable display names for enums. (#6238) diff --git a/src/providers/twitch/eventsub/Controller.cpp b/src/providers/twitch/eventsub/Controller.cpp index 91f140e4..f0774b46 100644 --- a/src/providers/twitch/eventsub/Controller.cpp +++ b/src/providers/twitch/eventsub/Controller.cpp @@ -40,6 +40,8 @@ const auto &LOG = chatterinoTwitchEventSub; namespace chatterino::eventsub { +using namespace std::literals::chrono_literals; + class QLogProxy : public lib::Logger { public: @@ -79,6 +81,11 @@ Controller::Controller() std::tie(this->eventSubHost, this->eventSubPort, this->eventSubPath) = getEventSubHost(); this->thread = std::make_unique([this] { + // make sure we set in any case, even exceptions + auto guard = qScopeGuard([&] { + this->stoppedFlag.set(); + }); + this->ioContext.run(); }); renameThread(*this->thread, "C2EventSub"); @@ -111,16 +118,20 @@ Controller::~Controller() this->work.reset(); - if (this->thread->joinable()) + if (!this->thread->joinable()) { - this->thread->join(); - } - else - { - qCWarning(LOG) << "Thread not joinable"; + qCInfo(LOG) << "Controller dtor end (not joinable)"; + return; } - qCInfo(LOG) << "Controller dtor end"; + if (this->stoppedFlag.waitFor(250ms)) + { + this->thread->join(); + qCInfo(LOG) << "Controller dtor end (joined)"; + return; + } + + qCWarning(LOG) << "Controller dtor end (stopped flag didn't stop)"; } void Controller::removeRef(const SubscriptionRequest &request) diff --git a/src/providers/twitch/eventsub/Controller.hpp b/src/providers/twitch/eventsub/Controller.hpp index 0b878610..123a0afa 100644 --- a/src/providers/twitch/eventsub/Controller.hpp +++ b/src/providers/twitch/eventsub/Controller.hpp @@ -5,6 +5,7 @@ #include "twitch-eventsub-ws/logger.hpp" #include "twitch-eventsub-ws/session.hpp" #include "util/ExponentialBackoff.hpp" +#include "util/OnceFlag.hpp" #include "util/ThreadGuard.hpp" #include @@ -149,6 +150,7 @@ private: std::unordered_map subscriptions; std::atomic quitting = false; + OnceFlag stoppedFlag; }; class DummyController : public IController