[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdev-valgrind] /: Check for errors during visualizer process execution
From:       Anton Anikin <null () kde ! org>
Date:       2017-03-01 3:31:22
Message-ID: E1ciuz4-0001fq-Fg () code ! kde ! org
[Download RAW message or body]

Git commit c64bf0ca1b056f6247f7e89832dfac96025b821c by Anton Anikin.
Committed on 01/03/2017 at 03:29.
Pushed by antonanikin into branch 'master'.

Check for errors during visualizer process execution

M  +9    -0    include/utils.h
M  +1    -1    tools/callgrind/configpage.ui
M  +9    -18   tools/callgrind/view.cpp
M  +0    -2    tools/callgrind/view.h
M  +47   -0    tools/generic/core/utils.cpp
M  +1    -1    tools/massif/configpage.ui
M  +10   -18   tools/massif/view.cpp
M  +0    -2    tools/massif/view.h

https://commits.kde.org/kdev-valgrind/c64bf0ca1b056f6247f7e89832dfac96025b821c

diff --git a/include/utils.h b/include/utils.h
index cefedc4..63badd4 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -21,7 +21,11 @@
 
 #include <QString>
 
+#include <functional>
+
 class QAbstractTableModel;
+class QProcess;
+class QPushButton;
 
 namespace Valgrind
 {
@@ -40,4 +44,9 @@ QString displayValue(double value);
 
 void emitDataChanged(QAbstractTableModel* model);
 
+void setupVisualizerProcess(QProcess* visualizerProcess,
+                            QPushButton* startButton,
+                            std::function<void()> startFunction,
+                            bool startImmediately);
+
 }
diff --git a/tools/callgrind/configpage.ui b/tools/callgrind/configpage.ui
index ab35fc8..c0bd7b4 100644
--- a/tools/callgrind/configpage.ui
+++ b/tools/callgrind/configpage.ui
@@ -112,7 +112,7 @@
       <item>
        <widget class="QCheckBox" name="launchKCachegrind">
         <property name="text">
-         <string>Launch KCachegrind after finish</string>
+         <string>Launch KCachegrind after analysis finish</string>
         </property>
        </widget>
       </item>
diff --git a/tools/callgrind/view.cpp b/tools/callgrind/view.cpp
index 45592e6..eeadf37 100644
--- a/tools/callgrind/view.cpp
+++ b/tools/callgrind/view.cpp
@@ -126,35 +126,26 @@ View::View(KConfigGroup config, QTemporaryFile* outputFile, \
                FunctionsModel* mode
         ui->functionsView->setCurrentIndex(functionsProxyModel->index(0,0));
     }
 
-    connect(ui->launchKCachegrindButton, &QPushButton::clicked,
-            this, [this, outputFile]() {
-                launchKCachegrind(outputFile->fileName());
-            });
-
-    connect(m_kcachegrindProcess, static_cast<void(QProcess::*)(int, \
                QProcess::ExitStatus)>(&QProcess::finished),
-            this, [this]() {
-                ui->launchKCachegrindButton->setEnabled(true);
-            });
+    auto startVisualizer = [this, outputFile]() {
+        m_kcachegrindProcess->start(Settings::kcachegrindExecutablePath(),
+                                    { outputFile->fileName() });
+    };
 
     Settings settings;
     settings.load(config);
-    if (settings.launchKCachegrind) {
-        launchKCachegrind(outputFile->fileName());
-    }
+
+    setupVisualizerProcess(m_kcachegrindProcess,
+                           ui->launchKCachegrindButton,
+                           startVisualizer, settings.launchKCachegrind);
 }
 
 View::~View()
 {
+    m_kcachegrindProcess->disconnect();
     delete m_kcachegrindProcess;
     delete ui;
 }
 
-void View::launchKCachegrind(const QString& outputFile)
-{
-    m_kcachegrindProcess->start(Settings::kcachegrindExecutablePath(), { outputFile \
                });
-    ui->launchKCachegrindButton->setEnabled(false);
-}
-
 }
 
 }
diff --git a/tools/callgrind/view.h b/tools/callgrind/view.h
index 6a9ea2f..81bc37e 100644
--- a/tools/callgrind/view.h
+++ b/tools/callgrind/view.h
@@ -51,8 +51,6 @@ public:
     ~View() override;
 
 private:
-    void launchKCachegrind(const QString& outputFile);
-
     Ui::View* ui;
     QProcess* m_kcachegrindProcess;
 };
diff --git a/tools/generic/core/utils.cpp b/tools/generic/core/utils.cpp
index 9fea3c8..112b36e 100644
--- a/tools/generic/core/utils.cpp
+++ b/tools/generic/core/utils.cpp
@@ -20,9 +20,12 @@
 #include "utils.h"
 
 #include <klocalizedstring.h>
+#include <kmessagebox.h>
 
 #include <QAbstractTableModel>
 #include <QMap>
+#include <QProcess>
+#include <QPushButton>
 
 namespace Valgrind
 {
@@ -85,4 +88,48 @@ void emitDataChanged(QAbstractTableModel* model)
                             { Qt::DisplayRole });
 }
 
+void setupVisualizerProcess(
+    QProcess* visualizerProcess,
+    QPushButton* startButton,
+    std::function<void()> startFunction,
+    bool startImmediately)
+{
+    Q_ASSERT(visualizerProcess);
+    Q_ASSERT(startButton);
+
+    QObject::connect(startButton, &QPushButton::clicked,
+                     startButton, [startFunction]() {
+                         startFunction();
+                    });
+
+    QObject::connect(visualizerProcess, &QProcess::started, startButton, \
[startButton]() { +        startButton->setEnabled(false);
+    });
+
+    QObject::connect(visualizerProcess, &QProcess::errorOccurred, startButton, \
[visualizerProcess, startButton]() { +        QString errorMessage;
+        if (visualizerProcess->error() == QProcess::FailedToStart) {
+            errorMessage += i18n("Failed to start visualizer from \"%1\".", \
visualizerProcess->program()); +            errorMessage += QStringLiteral("\n\n");
+            errorMessage += i18n("Check your settings and install the visualizer if \
necessary."); +        } else {
+            errorMessage += i18n("Error during visualizer execution:");
+            errorMessage += QStringLiteral("\n\n");
+            errorMessage = visualizerProcess->errorString();
+        }
+        KMessageBox::error(startButton, errorMessage, i18n("Valgrind Error"));
+
+        startButton->setEnabled(true);
+    });
+
+    QObject::connect(visualizerProcess, static_cast<void(QProcess::*)(int, \
QProcess::ExitStatus)>(&QProcess::finished), +                     startButton, \
[startButton]() { +                         startButton->setEnabled(true);
+                    });
+
+    if (startImmediately) {
+        startFunction();
+    }
+}
+
 }
diff --git a/tools/massif/configpage.ui b/tools/massif/configpage.ui
index 8fad4bb..7a136a6 100644
--- a/tools/massif/configpage.ui
+++ b/tools/massif/configpage.ui
@@ -278,7 +278,7 @@
       <item>
        <widget class="QCheckBox" name="launchMassifVisualizer">
         <property name="text">
-         <string>Launch Massif Visualizer after finish</string>
+         <string>Launch Massif Visualizer after analysis finish</string>
         </property>
        </widget>
       </item>
diff --git a/tools/massif/view.cpp b/tools/massif/view.cpp
index 120452e..8502221 100644
--- a/tools/massif/view.cpp
+++ b/tools/massif/view.cpp
@@ -26,6 +26,7 @@
 #include "model.h"
 #include "settings.h"
 #include "snapshot.h"
+#include "utils.h"
 
 #include <QStringListModel>
 #include <QProcess>
@@ -62,35 +63,26 @@ View::View(KConfigGroup config, QTemporaryFile* outputFile, \
SnapshotsModel* mode  treesModel->setStringList(snapshot->heapTree);
     });
 
-    connect(ui->launchVisualizerButton, &QPushButton::clicked,
-            this, [this, outputFile]() {
-                launchVisualizer(outputFile->fileName());
-            });
-
-    connect(m_visualizerProcess, static_cast<void(QProcess::*)(int, \
                QProcess::ExitStatus)>(&QProcess::finished),
-            this, [this]() {
-                ui->launchVisualizerButton->setEnabled(true);
-            });
+    auto startVisualizer = [this, outputFile]() {
+        m_visualizerProcess->start(Settings::visualizerExecutablePath(),
+                                   { outputFile->fileName() });
+    };
 
     Settings settings;
     settings.load(config);
-    if (settings.launchVisualizer) {
-        launchVisualizer(outputFile->fileName());
-    }
+
+    setupVisualizerProcess(m_visualizerProcess,
+                           ui->launchVisualizerButton,
+                           startVisualizer, settings.launchVisualizer);
 }
 
 View::~View()
 {
+    m_visualizerProcess->disconnect();
     delete m_visualizerProcess;
     delete ui;
 }
 
-void View::launchVisualizer(const QString& outputFile)
-{
-    m_visualizerProcess->start(Settings::visualizerExecutablePath(), { outputFile \
                });
-    ui->launchVisualizerButton->setEnabled(false);
-}
-
 }
 
 }
diff --git a/tools/massif/view.h b/tools/massif/view.h
index be5c08a..18528cf 100644
--- a/tools/massif/view.h
+++ b/tools/massif/view.h
@@ -49,8 +49,6 @@ public:
     ~View() override;
 
 private:
-    void launchVisualizer(const QString& outputFile);
-
     Ui::View* ui;
     QProcess* m_visualizerProcess;
 };


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic