From ad419754a951028d5ec4708d4f3f5ec89d6d5c1b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 28 Apr 2020 17:40:22 +1000 Subject: [PATCH] waveformscope: fixed double free on close --- app/panel/panelmanager.cpp | 2 ++ app/widget/scope/waveform/waveform.cpp | 19 ++++++++++++++----- app/widget/scope/waveform/waveform.h | 2 ++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/panel/panelmanager.cpp b/app/panel/panelmanager.cpp index f85e6824f..252deae05 100644 --- a/app/panel/panelmanager.cpp +++ b/app/panel/panelmanager.cpp @@ -36,6 +36,8 @@ PanelManager::PanelManager(QObject *parent) : void PanelManager::DeleteAllPanels() { foreach (PanelWidget* panel, focus_history_) { + // We don't need to run this signal anymore since we're destroying and clearing everything + disconnect(panel, &PanelWidget::destroyed, this, &PanelManager::PanelDestroyed); delete panel; } focus_history_.clear(); diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index 64c71004d..d8f6b6e71 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -33,6 +33,15 @@ WaveformScope::WaveformScope(QWidget* parent) : EnableDefaultContextMenu(); } +WaveformScope::~WaveformScope() +{ + CleanUp(); + + if (context()) { + disconnect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &WaveformScope::CleanUp); + } +} + void WaveformScope::SetBuffer(Frame *frame) { buffer_ = frame; @@ -54,9 +63,7 @@ void WaveformScope::initializeGL() connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &WaveformScope::CleanUp, Qt::DirectConnection); - if (buffer_) { - UploadTextureFromBuffer(); - } + UploadTextureFromBuffer(); } void WaveformScope::paintGL() @@ -86,6 +93,10 @@ void WaveformScope::paintGL() void WaveformScope::UploadTextureFromBuffer() { + if (!buffer_) { + return; + } + makeCurrent(); if (!texture_.IsCreated() @@ -105,8 +116,6 @@ void WaveformScope::UploadTextureFromBuffer() void WaveformScope::CleanUp() { - qDebug() << "Cleaned up..."; - makeCurrent(); pipeline_ = nullptr; diff --git a/app/widget/scope/waveform/waveform.h b/app/widget/scope/waveform/waveform.h index efb7a08b4..dd9d40452 100644 --- a/app/widget/scope/waveform/waveform.h +++ b/app/widget/scope/waveform/waveform.h @@ -35,6 +35,8 @@ class WaveformScope : public ManagedDisplayWidget public: WaveformScope(QWidget* parent = nullptr); + virtual ~WaveformScope() override; + public slots: void SetBuffer(Frame* frame);