Skip to content

Commit

Permalink
fix(streamer-mode): destroy timer on correct thread (#5571)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nerixyz authored Aug 29, 2024
1 parent acdb84c commit ea1e432
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
17 changes: 10 additions & 7 deletions src/singletons/StreamerMode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ class StreamerModePrivate
StreamerMode *parent_;
pajlada::Signals::SignalHolder settingConnections_;

QTimer timer_;
QThread thread_;
QTimer *timer_;

std::atomic<bool> enabled_ = false;
mutable std::atomic<uint8_t> timeouts_ = 0;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -244,6 +245,8 @@ void StreamerModePrivate::start()

StreamerModePrivate::~StreamerModePrivate()
{
this->timer_->deleteLater();
this->timer_ = nullptr;
this->thread_.quit();
if (!this->thread_.wait(500))
{
Expand Down Expand Up @@ -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();
}
}
Expand Down

0 comments on commit ea1e432

Please sign in to comment.