fix(streamer-mode): destroy timer on correct thread (#5571)

This commit is contained in:
nerix 2024-08-29 16:55:18 +02:00 committed by GitHub
parent acdb84c36e
commit ea1e432e4c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 7 deletions

View file

@ -79,6 +79,7 @@
- Dev: Fixed benchmarks segfaulting on run. (#5559)
- Dev: Refactored `MessageBuilder` to be a single class. (#5548)
- Dev: Recent changes are now shown in the nightly release description. (#5553, #5554)
- Dev: The timer for `StreamerMode` is now destroyed on the correct thread. (#5571)
## 2.5.1

View file

@ -177,8 +177,8 @@ private:
StreamerMode *parent_;
pajlada::Signals::SignalHolder settingConnections_;
QTimer timer_;
QThread thread_;
QTimer *timer_;
std::atomic<bool> enabled_ = false;
mutable std::atomic<uint8_t> timeouts_ = 0;
@ -209,10 +209,11 @@ void StreamerMode::start()
StreamerModePrivate::StreamerModePrivate(StreamerMode *parent)
: parent_(parent)
, timer_(new QTimer(&this->thread_))
{
this->thread_.setObjectName("StreamerMode");
this->timer_.moveToThread(&this->thread_);
QObject::connect(&this->timer_, &QTimer::timeout, [this] {
this->timer_->moveToThread(&this->thread_);
QObject::connect(this->timer_, &QTimer::timeout, [this] {
auto timeouts =
this->timeouts_.fetch_add(1, std::memory_order::relaxed);
if (timeouts < SKIPPED_TIMEOUTS)
@ -244,6 +245,8 @@ void StreamerModePrivate::start()
StreamerModePrivate::~StreamerModePrivate()
{
this->timer_->deleteLater();
this->timer_ = nullptr;
this->thread_.quit();
if (!this->thread_.wait(500))
{
@ -282,18 +285,18 @@ void StreamerModePrivate::settingChanged(StreamerModeSetting value)
{
case StreamerModeSetting::Disabled: {
this->setEnabled(false);
this->timer_.stop();
this->timer_->stop();
}
break;
case StreamerModeSetting::Enabled: {
this->setEnabled(true);
this->timer_.stop();
this->timer_->stop();
}
break;
case StreamerModeSetting::DetectStreamingSoftware: {
if (!this->timer_.isActive())
if (!this->timer_->isActive())
{
this->timer_.start(20s);
this->timer_->start(20s);
this->check();
}
}