diff options
Diffstat (limited to 'src/plugins/perfprofiler')
-rw-r--r-- | src/plugins/perfprofiler/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfconfigeventsmodel.cpp | 18 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfconfigwidget.cpp | 136 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfconfigwidget.h | 15 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfconfigwidget.ui | 135 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfdatareader.cpp | 6 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfprofiler.pro | 1 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfprofiler.qbs | 1 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfprofilerconstants.h | 15 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfprofilerruncontrol.cpp | 4 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfsettings.cpp | 155 | ||||
-rw-r--r-- | src/plugins/perfprofiler/perfsettings.h | 31 |
12 files changed, 148 insertions, 370 deletions
diff --git a/src/plugins/perfprofiler/CMakeLists.txt b/src/plugins/perfprofiler/CMakeLists.txt index 97f82871f0..b7644fb3fc 100644 --- a/src/plugins/perfprofiler/CMakeLists.txt +++ b/src/plugins/perfprofiler/CMakeLists.txt @@ -5,7 +5,6 @@ add_qtc_plugin(PerfProfiler SOURCES perfconfigeventsmodel.cpp perfconfigeventsmodel.h perfconfigwidget.cpp perfconfigwidget.h - perfconfigwidget.ui perfdatareader.cpp perfdatareader.h perfevent.h perfeventtype.h diff --git a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp index 744885f3de..9b5763c228 100644 --- a/src/plugins/perfprofiler/perfconfigeventsmodel.cpp +++ b/src/plugins/perfprofiler/perfconfigeventsmodel.cpp @@ -40,7 +40,7 @@ PerfConfigEventsModel::PerfConfigEventsModel(PerfSettings *settings, QObject *pa int PerfConfigEventsModel::rowCount(const QModelIndex &parent) const { - return parent.isValid() ? 0 : m_settings->events().length(); + return parent.isValid() ? 0 : m_settings->events.value().length(); } int PerfConfigEventsModel::columnCount(const QModelIndex &parent) const @@ -58,7 +58,7 @@ QVariant PerfConfigEventsModel::data(const QModelIndex &index, int role) const return QVariant(); // ignore } - QString event = m_settings->events().value(index.row()); + QString event = m_settings->events.value().value(index.row()); const EventDescription description = parseEvent(event); switch (index.column()) { case ColumnEventType: { @@ -142,7 +142,7 @@ bool PerfConfigEventsModel::setData(const QModelIndex &dataIndex, const QVariant const int row = dataIndex.row(); const int column = dataIndex.column(); - QStringList events = m_settings->events(); + QStringList events = m_settings->events.value(); EventDescription description = parseEvent(events[row]); switch (column) { case ColumnEventType: @@ -176,7 +176,7 @@ bool PerfConfigEventsModel::setData(const QModelIndex &dataIndex, const QVariant break; } events[row] = generateEvent(description); - m_settings->setEvents(events); + m_settings->events.setValue(events); emit dataChanged(index(row, ColumnEventType), index(row, ColumnResult)); return true; } @@ -201,11 +201,11 @@ bool PerfConfigEventsModel::insertRows(int row, int count, const QModelIndex &pa if (parent.isValid()) return false; - QStringList events = m_settings->events(); + QStringList events = m_settings->events.value(); for (int i = 0; i < count; ++i) events.insert(row, "dummy"); beginInsertRows(parent, row, row + count - 1); - m_settings->setEvents(events); + m_settings->events.setValue(events); endInsertRows(); return true; } @@ -215,17 +215,17 @@ bool PerfConfigEventsModel::removeRows(int row, int count, const QModelIndex &pa if (parent.isValid()) return false; - QStringList events = m_settings->events(); + QStringList events = m_settings->events.value(); for (int i = 0; i < count; ++i) events.removeAt(row); beginRemoveRows(parent, row, row + count - 1); - m_settings->setEvents(events); + m_settings->events.setValue(events); endRemoveRows(); if (events.isEmpty()) { beginInsertRows(parent, 0, 0); events.append("dummy"); - m_settings->setEvents(events); + m_settings->events.setValue(events); endInsertRows(); } diff --git a/src/plugins/perfprofiler/perfconfigwidget.cpp b/src/plugins/perfprofiler/perfconfigwidget.cpp index 273194de06..9381f1e147 100644 --- a/src/plugins/perfprofiler/perfconfigwidget.cpp +++ b/src/plugins/perfprofiler/perfconfigwidget.cpp @@ -26,7 +26,6 @@ #include "perfconfigeventsmodel.h" #include "perfconfigwidget.h" #include "perfprofilerconstants.h" -#include "ui_perfconfigwidget.h" #include <coreplugin/messagebox.h> @@ -36,11 +35,17 @@ #include <projectexplorer/runcontrol.h> #include <projectexplorer/target.h> +#include <utils/aspects.h> +#include <utils/layoutbuilder.h> #include <utils/qtcprocess.h> +#include <QComboBox> +#include <QHeaderView> +#include <QMessageBox> #include <QMetaEnum> #include <QStyledItemDelegate> -#include <QMessageBox> + +using namespace Utils; namespace PerfProfiler { namespace Internal { @@ -63,85 +68,60 @@ public: }; PerfConfigWidget::PerfConfigWidget(PerfSettings *settings, QWidget *parent) - : m_settings(settings), m_ui(new Ui::PerfConfigWidget) + : m_settings(settings) { setParent(parent); - m_ui->setupUi(this); - m_ui->useTracePointsButton->setVisible(false); - - m_ui->callgraphMode->addItem(tr("dwarf"), QLatin1String(Constants::PerfCallgraphDwarf)); - m_ui->callgraphMode->addItem(tr("frame pointer"), QLatin1String(Constants::PerfCallgraphFP)); - m_ui->callgraphMode->addItem(tr("last branch record"), - QLatin1String(Constants::PerfCallgraphLBR)); - - m_ui->sampleMode->addItem(tr("frequency (Hz)"), QLatin1String(Constants::PerfSampleFrequency)); - m_ui->sampleMode->addItem(tr("event count"), QLatin1String(Constants::PerfSampleCount)); - - auto comboboxChangedSignal = QOverload<int>::of(&QComboBox::currentIndexChanged); - connect(m_ui->callgraphMode, comboboxChangedSignal, this, [this](int index) { - QString mode = m_ui->callgraphMode->itemData(index).toString(); - m_settings->setCallgraphMode(mode); - m_ui->stackSize->setEnabled(mode == QLatin1String(Constants::PerfCallgraphDwarf)); - }); - - auto spinBoxChangedSignal = QOverload<int>::of(&QSpinBox::valueChanged); - connect(m_ui->stackSize, spinBoxChangedSignal, m_settings, &PerfSettings::setStackSize); - connect(m_ui->period, spinBoxChangedSignal, m_settings, &PerfSettings::setPeriod); - connect(m_ui->sampleMode, comboboxChangedSignal, this, [this](int index) { - QString sampleMode = m_ui->sampleMode->itemData(index).toString(); - m_settings->setSampleMode(sampleMode); - }); - connect(m_ui->extraArguments, &QLineEdit::textEdited, this, [this](const QString &text) { - m_settings->setExtraArguments(Utils::QtcProcess::splitArgs(text)); - }); + eventsView = new QTableView(this); + eventsView->setMinimumSize(QSize(0, 300)); + eventsView->setEditTriggers(QAbstractItemView::AllEditTriggers); + eventsView->setSelectionMode(QAbstractItemView::SingleSelection); + eventsView->setSelectionBehavior(QAbstractItemView::SelectRows); + eventsView->setModel(new PerfConfigEventsModel(m_settings, this)); + eventsView->setItemDelegate(new SettingsDelegate(this)); + eventsView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + useTracePointsButton = new QPushButton(this); + useTracePointsButton->setText(tr("Use Trace Points")); + useTracePointsButton->setVisible(false); + connect(useTracePointsButton, &QPushButton::pressed, + this, &PerfConfigWidget::readTracePoints); - m_ui->eventsView->setModel(new PerfConfigEventsModel(m_settings, this)); - m_ui->eventsView->setItemDelegate(new SettingsDelegate(this)); - m_ui->eventsView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - connect(m_ui->addEventButton, &QPushButton::pressed, this, [this]() { - auto model = m_ui->eventsView->model(); + addEventButton = new QPushButton(this); + addEventButton->setText(tr("Add Event")); + connect(addEventButton, &QPushButton::pressed, this, [this]() { + auto model = eventsView->model(); model->insertRow(model->rowCount()); }); - connect(m_ui->removeEventButton, &QPushButton::pressed, this, [this]() { - QModelIndex index = m_ui->eventsView->currentIndex(); + + removeEventButton = new QPushButton(this); + removeEventButton->setText(tr("Remove Event")); + connect(removeEventButton, &QPushButton::pressed, this, [this]() { + QModelIndex index = eventsView->currentIndex(); if (index.isValid()) - m_ui->eventsView->model()->removeRow(index.row()); + eventsView->model()->removeRow(index.row()); }); - connect(m_settings, &PerfSettings::changed, this, &PerfConfigWidget::updateUi); - connect(m_ui->useTracePointsButton, &QPushButton::pressed, - this, &PerfConfigWidget::readTracePoints); - connect(m_ui->resetButton, &QPushButton::pressed, m_settings, &PerfSettings::resetToDefault); - updateUi(); -} + resetButton = new QPushButton(this); + resetButton->setText(tr("Reset")); + connect(resetButton, &QPushButton::pressed, m_settings, &PerfSettings::resetToDefault); -PerfConfigWidget::~PerfConfigWidget() -{ - delete m_ui; -} + using namespace Layouting; + const Break nl; -void PerfConfigWidget::updateUi() -{ - for (int index = 0, end = m_ui->callgraphMode->count(); index != end; ++index) { - if (m_ui->callgraphMode->itemData(index) == m_settings->callgraphMode()) { - m_ui->callgraphMode->setCurrentIndex(index); - break; - } - } + Column { + Row { Stretch(), useTracePointsButton, addEventButton, removeEventButton, resetButton }, - for (int index = 0, end = m_ui->sampleMode->count(); index != end; ++index) { - if (m_ui->sampleMode->itemData(index) == m_settings->sampleMode()) { - m_ui->sampleMode->setCurrentIndex(index); - break; - } - } + eventsView, + + Grid { + m_settings->callgraphMode, m_settings->stackSize, nl, + m_settings->sampleMode, m_settings->period, nl, + m_settings->extraArguments, + }, - m_ui->stackSize->setEnabled(m_settings->callgraphMode() - == QLatin1String(Constants::PerfCallgraphDwarf)); - m_ui->stackSize->setValue(m_settings->stackSize()); - m_ui->period->setValue(m_settings->period()); - m_ui->extraArguments->setText(m_settings->extraArguments().join(QLatin1Char(' '))); + Stretch() + }.attachTo(this); } void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) @@ -153,7 +133,7 @@ void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) } if (device.isNull()) { - m_ui->useTracePointsButton->setEnabled(false); + useTracePointsButton->setEnabled(false); return; } @@ -162,7 +142,7 @@ void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) m_process.reset(device->createProcess(nullptr)); if (!m_process) { - m_ui->useTracePointsButton->setEnabled(false); + useTracePointsButton->setEnabled(false); return; } @@ -172,12 +152,12 @@ void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) connect(m_process.get(), &ProjectExplorer::DeviceProcess::error, this, &PerfConfigWidget::handleProcessError); - m_ui->useTracePointsButton->setEnabled(true); + useTracePointsButton->setEnabled(true); } void PerfConfigWidget::setTracePointsButtonVisible(bool visible) { - m_ui->useTracePointsButton->setVisible(visible); + useTracePointsButton->setVisible(visible); } void PerfConfigWidget::apply() @@ -198,7 +178,7 @@ void PerfConfigWidget::readTracePoints() runnable.commandLineArguments = QLatin1String("probe -l"); m_process->start(runnable); - m_ui->useTracePointsButton->setEnabled(false); + useTracePointsButton->setEnabled(false); } } @@ -207,7 +187,7 @@ void PerfConfigWidget::handleProcessFinished() const QList<QByteArray> lines = m_process->readAllStandardOutput().append(m_process->readAllStandardError()) .split('\n'); - auto model = m_ui->eventsView->model(); + auto model = eventsView->model(); const int previousRows = model->rowCount(); QHash<QByteArray, QByteArray> tracePoints; for (const QByteArray &line : lines) { @@ -234,10 +214,10 @@ void PerfConfigWidget::handleProcessFinished() QString::fromUtf8(event)); } model->removeRows(0, previousRows); - m_ui->sampleMode->setCurrentText(tr("event count")); - m_ui->period->setValue(1); + m_settings->sampleMode.setVolatileValue(1); + m_settings->period.setVolatileValue(1); } - m_ui->useTracePointsButton->setEnabled(true); + useTracePointsButton->setEnabled(true); } void PerfConfigWidget::handleProcessError(QProcess::ProcessError error) @@ -246,7 +226,7 @@ void PerfConfigWidget::handleProcessError(QProcess::ProcessError error) Core::AsynchronousMessageBox::warning( tr("Cannot List Trace Points"), tr("\"perf probe -l\" failed to start. Is perf installed?")); - m_ui->useTracePointsButton->setEnabled(true); + useTracePointsButton->setEnabled(true); } } diff --git a/src/plugins/perfprofiler/perfconfigwidget.h b/src/plugins/perfprofiler/perfconfigwidget.h index 4ff5064db9..bb4795a791 100644 --- a/src/plugins/perfprofiler/perfconfigwidget.h +++ b/src/plugins/perfprofiler/perfconfigwidget.h @@ -29,17 +29,19 @@ #include <coreplugin/dialogs/ioptionspage.h> +#include <projectexplorer/devicesupport/deviceprocess.h> + +#include <QPushButton> +#include <QTableView> + namespace PerfProfiler { namespace Internal { -namespace Ui { class PerfConfigWidget; } - class PerfConfigWidget : public Core::IOptionsPageWidget { Q_OBJECT public: explicit PerfConfigWidget(PerfSettings *settings, QWidget *parent = nullptr); - ~PerfConfigWidget(); void updateUi(); void setTarget(ProjectExplorer::Target *target); @@ -53,8 +55,13 @@ private: void handleProcessError(QProcess::ProcessError error); PerfSettings *m_settings; - Ui::PerfConfigWidget *m_ui; std::unique_ptr<ProjectExplorer::DeviceProcess> m_process; + + QTableView *eventsView; + QPushButton *useTracePointsButton; + QPushButton *addEventButton; + QPushButton *removeEventButton; + QPushButton *resetButton; }; } // namespace Internal diff --git a/src/plugins/perfprofiler/perfconfigwidget.ui b/src/plugins/perfprofiler/perfconfigwidget.ui deleted file mode 100644 index 8db310714c..0000000000 --- a/src/plugins/perfprofiler/perfconfigwidget.ui +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>PerfProfiler::Internal::PerfConfigWidget</class> - <widget class="QWidget" name="PerfProfiler::Internal::PerfConfigWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>560</width> - <height>500</height> - </rect> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="4" column="1"> - <widget class="QComboBox" name="sampleMode"/> - </item> - <item row="3" column="3"> - <widget class="QSpinBox" name="stackSize"> - <property name="maximum"> - <number>65536</number> - </property> - <property name="value"> - <number>4096</number> - </property> - </widget> - </item> - <item row="3" column="2"> - <widget class="QLabel" name="stackSizeLabel"> - <property name="text"> - <string>Stack snapshot size (kB):</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="sampleModeLabel"> - <property name="text"> - <string>Sample mode:</string> - </property> - </widget> - </item> - <item row="4" column="2"> - <widget class="QLabel" name="periodLabel"> - <property name="text"> - <string>Sample period:</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="callgraphLabel"> - <property name="text"> - <string>Call graph mode:</string> - </property> - </widget> - </item> - <item row="5" column="1" colspan="3"> - <widget class="QLineEdit" name="extraArguments"/> - </item> - <item row="3" column="1"> - <widget class="QComboBox" name="callgraphMode"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="extraArgumentsLabel"> - <property name="text"> - <string>Additional arguments:</string> - </property> - </widget> - </item> - <item row="4" column="3"> - <widget class="QSpinBox" name="period"> - <property name="maximum"> - <number>2147483647</number> - </property> - <property name="value"> - <number>250</number> - </property> - </widget> - </item> - <item row="2" column="0" colspan="4"> - <widget class="QTableView" name="eventsView"> - <property name="minimumSize"> - <size> - <height>300</height> - </size> - </property> - <property name="editTriggers"> - <set>QAbstractItemView::AllEditTriggers</set> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QPushButton" name="useTracePointsButton"> - <property name="text"> - <string>Use Trace Points</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QPushButton" name="addEventButton"> - <property name="text"> - <string>Add Event</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QPushButton" name="removeEventButton"> - <property name="text"> - <string>Remove Event</string> - </property> - </widget> - </item> - <item row="1" column="3"> - <widget class="QPushButton" name="resetButton"> - <property name="text"> - <string>Reset</string> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/perfprofiler/perfdatareader.cpp b/src/plugins/perfprofiler/perfdatareader.cpp index f9f32a7df3..80d4734f6d 100644 --- a/src/plugins/perfprofiler/perfdatareader.cpp +++ b/src/plugins/perfprofiler/perfdatareader.cpp @@ -405,10 +405,8 @@ QStringList PerfDataReader::findTargetArguments(const ProjectExplorer::RunContro QString PerfDataReader::findPerfParser() { QString filePath = QString::fromLocal8Bit(qgetenv("PERFPROFILER_PARSER_FILEPATH")); - if (filePath.isEmpty()) { - filePath = QString::fromLatin1("%1/perfparser%2").arg(Core::ICore::libexecPath(), - QString(QTC_HOST_EXE_SUFFIX)); - } + if (filePath.isEmpty()) + filePath = Core::ICore::libexecPath("perfparser" QTC_HOST_EXE_SUFFIX).toString(); return QDir::toNativeSeparators(QDir::cleanPath(filePath)); } diff --git a/src/plugins/perfprofiler/perfprofiler.pro b/src/plugins/perfprofiler/perfprofiler.pro index 9e076ec4c0..c7c22022f9 100644 --- a/src/plugins/perfprofiler/perfprofiler.pro +++ b/src/plugins/perfprofiler/perfprofiler.pro @@ -69,7 +69,6 @@ OTHER_FILES += \ PerfProfiler.json.in FORMS += \ - perfconfigwidget.ui \ perfloaddialog.ui \ perftracepointdialog.ui diff --git a/src/plugins/perfprofiler/perfprofiler.qbs b/src/plugins/perfprofiler/perfprofiler.qbs index 762c57ceb2..24cadd13e4 100644 --- a/src/plugins/perfprofiler/perfprofiler.qbs +++ b/src/plugins/perfprofiler/perfprofiler.qbs @@ -21,7 +21,6 @@ QtcPlugin { "perfconfigeventsmodel.h", "perfconfigwidget.cpp", "perfconfigwidget.h", - "perfconfigwidget.ui", "perfdatareader.cpp", "perfdatareader.h", "perfevent.h", diff --git a/src/plugins/perfprofiler/perfprofilerconstants.h b/src/plugins/perfprofiler/perfprofilerconstants.h index f29cecc7ca..013f46dd54 100644 --- a/src/plugins/perfprofiler/perfprofilerconstants.h +++ b/src/plugins/perfprofiler/perfprofilerconstants.h @@ -49,22 +49,9 @@ const char TraceFileExtension[] = ".data"; const char PerfProfilerPerspectiveId[] = "PerfProfiler.Perspective"; const char PerfProfilerLocalActionId[] = "PerfProfiler.Local"; const char AnalyzerSettingsGroupId[] = "Analyzer"; -const char PerfSampleModeId[] = "Analyzer.Perf.SampleMode"; -const char PerfFrequencyId[] = "Analyzer.Perf.Frequency"; -const char PerfStackSizeId[] = "Analyzer.Perf.StackSize"; -const char PerfCallgraphModeId[] = "Analyzer.Perf.CallgraphMode"; -const char PerfEventsId[] = "Analyzer.Perf.Events"; -const char PerfExtraArgumentsId[] = "Analyzer.Perf.ExtraArguments"; -const char PerfSettingsId[] = "Analyzer.Perf.Settings"; -const char PerfRecordArgumentsId[] = "Analyzer.Perf.RecordArguments"; -const unsigned int PerfDefaultPeriod = 250; -const unsigned int PerfDefaultStackSize = 4096; +const char PerfSettingsId[] = "Analyzer.Perf.Settings"; const char PerfCallgraphDwarf[] = "dwarf"; -const char PerfCallgraphFP[] = "fp"; -const char PerfCallgraphLBR[] = "lbr"; -const char PerfSampleFrequency[] = "-F"; -const char PerfSampleCount[] = "-c"; const char PerfStreamMagic[] = "QPERFSTREAM"; const char PerfZqfileMagic[] = "PTQFILE4.10"; diff --git a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp index dfccc06d2c..48bb6cd4bc 100644 --- a/src/plugins/perfprofiler/perfprofilerruncontrol.cpp +++ b/src/plugins/perfprofiler/perfprofilerruncontrol.cpp @@ -151,11 +151,11 @@ public: arguments << "record"; arguments += m_perfRecordArguments; arguments << "-o" << "-" << "--" << perfRunnable.executable.toString() - << Utils::QtcProcess::splitArgs(perfRunnable.commandLineArguments, + << Utils::ProcessArgs::splitArgs(perfRunnable.commandLineArguments, Utils::OsTypeLinux); perfRunnable.executable = FilePath::fromString("perf"); - perfRunnable.commandLineArguments = Utils::QtcProcess::joinArgs(arguments, + perfRunnable.commandLineArguments = Utils::ProcessArgs::joinArgs(arguments, Utils::OsTypeLinux); m_process->start(perfRunnable); } diff --git a/src/plugins/perfprofiler/perfsettings.cpp b/src/plugins/perfprofiler/perfsettings.cpp index b58e377ad3..9ac361961b 100644 --- a/src/plugins/perfprofiler/perfsettings.cpp +++ b/src/plugins/perfprofiler/perfsettings.cpp @@ -31,6 +31,10 @@ #include <QSettings> +#include <utils/qtcprocess.h> + +using namespace Utils; + namespace PerfProfiler { PerfSettings::PerfSettings(ProjectExplorer::Target *target) @@ -42,6 +46,51 @@ PerfSettings::PerfSettings(ProjectExplorer::Target *target) return widget; }); + registerAspect(&period); + period.setSettingsKey("Analyzer.Perf.Frequency"); + period.setRange(250, 2147483647); + period.setDefaultValue(250); + period.setLabelText(tr("Sample period:")); + + registerAspect(&stackSize); + stackSize.setSettingsKey("Analyzer.Perf.StackSize"); + stackSize.setRange(4096, 65536); + stackSize.setDefaultValue(4096); + stackSize.setLabelText(tr("Stack snapshot size (kB):")); + + registerAspect(&sampleMode); + sampleMode.setSettingsKey("Analyzer.Perf.SampleMode"); + sampleMode.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + sampleMode.setLabelText(tr("Sample mode:")); + sampleMode.addOption({tr("frequency (Hz)"), {}, QString("-F")}); + sampleMode.addOption({tr("event count"), {}, QString("-c")}); + sampleMode.setDefaultValue(0); + + registerAspect(&callgraphMode); + callgraphMode.setSettingsKey("Analyzer.Perf.CallgraphMode"); + callgraphMode.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + callgraphMode.setLabelText(tr("Call graph mode:")); + callgraphMode.addOption({tr("dwarf"), {}, QString(Constants::PerfCallgraphDwarf)}); + callgraphMode.addOption({tr("frame pointer"), {}, QString("fp")}); + callgraphMode.addOption({tr("last branch record"), {}, QString("lbr")}); + callgraphMode.setDefaultValue(0); + + registerAspect(&events); + events.setSettingsKey("Analyzer.Perf.Events"); + events.setDefaultValue({"cpu-cycles"}); + + registerAspect(&extraArguments); + extraArguments.setSettingsKey("Analyzer.Perf.ExtraArguments"); + extraArguments.setDisplayStyle(StringAspect::DisplayStyle::LineEditDisplay); + extraArguments.setLabelText(tr("Additional arguments:")); + extraArguments.setSpan(4); + + connect(&callgraphMode, &SelectionAspect::volatileValueChanged, this, [this](int index) { + stackSize.setEnabled(index == 0); + }); + + connect(this, &AspectContainer::fromMapFinished, this, &PerfSettings::changed); + readGlobalSettings(); } @@ -52,13 +101,6 @@ PerfSettings::~PerfSettings() void PerfSettings::readGlobalSettings() { QVariantMap defaults; - defaults.insert(QLatin1String(Constants::PerfEventsId), QStringList({"cpu-cycles"})); - defaults.insert(QLatin1String(Constants::PerfSampleModeId), Constants::PerfSampleFrequency); - defaults.insert(QLatin1String(Constants::PerfFrequencyId), Constants::PerfDefaultPeriod); - defaults.insert(QLatin1String(Constants::PerfStackSizeId), Constants::PerfDefaultStackSize); - defaults.insert(QLatin1String(Constants::PerfCallgraphModeId), - QLatin1String(Constants::PerfCallgraphDwarf)); - defaults.insert(QLatin1String(Constants::PerfExtraArgumentsId), QStringList()); // Read stored values QSettings *settings = Core::ICore::settings(); @@ -82,53 +124,14 @@ void PerfSettings::writeGlobalSettings() const settings->endGroup(); } -void PerfSettings::toMap(QVariantMap &map) const -{ - map[QLatin1String(Constants::PerfSampleModeId)] = m_sampleMode; - map[QLatin1String(Constants::PerfFrequencyId)] = m_period; - map[QLatin1String(Constants::PerfStackSizeId)] = m_stackSize; - map[QLatin1String(Constants::PerfCallgraphModeId)] = m_callgraphMode; - map[QLatin1String(Constants::PerfEventsId)] = m_events; - map[QLatin1String(Constants::PerfExtraArgumentsId)] = m_extraArguments; - map[QLatin1String(Constants::PerfRecordArgumentsId)] = perfRecordArguments(); -} - -void PerfSettings::fromMap(const QVariantMap &map) -{ - m_sampleMode = map.value(QLatin1String(Constants::PerfSampleModeId), m_sampleMode).toString(); - m_period = map.value(QLatin1String(Constants::PerfFrequencyId), m_period).toInt(); - m_stackSize = map.value(QLatin1String(Constants::PerfStackSizeId), m_stackSize).toInt(); - m_callgraphMode = map.value(QLatin1String(Constants::PerfCallgraphModeId), - m_callgraphMode).toString(); - m_events = map.value(QLatin1String(Constants::PerfEventsId), m_events).toStringList(); - m_extraArguments = map.value(QLatin1String(Constants::PerfExtraArgumentsId), - m_extraArguments).toStringList(); - emit changed(); -} - -QString PerfSettings::callgraphMode() const -{ - return m_callgraphMode; -} - -QStringList PerfSettings::events() const -{ - return m_events; -} - -QStringList PerfSettings::extraArguments() const -{ - return m_extraArguments; -} - QStringList PerfSettings::perfRecordArguments() const { - QString callgraphArg = m_callgraphMode; - if (m_callgraphMode == QLatin1String(Constants::PerfCallgraphDwarf)) - callgraphArg += "," + QString::number(m_stackSize); + QString callgraphArg = callgraphMode.itemValue().toString(); + if (callgraphArg == Constants::PerfCallgraphDwarf) + callgraphArg += "," + QString::number(stackSize.value()); QString events; - for (const QString &event : m_events) { + for (const QString &event : this->events.value()) { if (!event.isEmpty()) { if (!events.isEmpty()) events.append(','); @@ -136,23 +139,11 @@ QStringList PerfSettings::perfRecordArguments() const } } - return QStringList({"-e", events, "--call-graph", callgraphArg, m_sampleMode, - QString::number(m_period)}) + m_extraArguments; -} - -void PerfSettings::setCallgraphMode(const QString &callgraphMode) -{ - m_callgraphMode = callgraphMode; -} - -void PerfSettings::setEvents(const QStringList &events) -{ - m_events = events; -} - -void PerfSettings::setExtraArguments(const QStringList &args) -{ - m_extraArguments = args; + return QStringList({"-e", events, + "--call-graph", callgraphArg, + sampleMode.itemValue().toString(), + QString::number(period.value())}) + + ProcessArgs::splitArgs(extraArguments.value()); } void PerfSettings::resetToDefault() @@ -163,34 +154,4 @@ void PerfSettings::resetToDefault() fromMap(map); } -int PerfSettings::stackSize() const -{ - return m_stackSize; -} - -QString PerfSettings::sampleMode() const -{ - return m_sampleMode; -} - -void PerfSettings::setStackSize(int stackSize) -{ - m_stackSize = stackSize; -} - -void PerfSettings::setSampleMode(const QString &sampleMode) -{ - m_sampleMode = sampleMode; -} - -int PerfSettings::period() const -{ - return m_period; -} - -void PerfSettings::setPeriod(int period) -{ - m_period = period; -} - } // namespace PerfProfiler diff --git a/src/plugins/perfprofiler/perfsettings.h b/src/plugins/perfprofiler/perfsettings.h index c586cd8e71..839f4df689 100644 --- a/src/plugins/perfprofiler/perfsettings.h +++ b/src/plugins/perfprofiler/perfsettings.h @@ -45,36 +45,19 @@ public: void readGlobalSettings(); void writeGlobalSettings() const; - int period() const; - int stackSize() const; - QString sampleMode() const; - QString callgraphMode() const; - QStringList events() const; - QStringList extraArguments() const; - QStringList perfRecordArguments() const; - void setPeriod(int period); - void setStackSize(int stackSize); - void setSampleMode(const QString &sampleMode); - void setCallgraphMode(const QString &callgraphMode); - void setEvents(const QStringList &events); - void setExtraArguments(const QStringList &args); void resetToDefault(); + Utils::IntegerAspect period; + Utils::IntegerAspect stackSize; + Utils::SelectionAspect sampleMode; + Utils::SelectionAspect callgraphMode; + Utils::StringListAspect events; + Utils::StringAspect extraArguments; + signals: void changed(); - -protected: - void toMap(QVariantMap &map) const final; - void fromMap(const QVariantMap &map) final; - - int m_period; - int m_stackSize; - QString m_sampleMode; - QString m_callgraphMode; - QStringList m_events; - QStringList m_extraArguments; }; } // namespace PerfProfiler |