forked from qt-creator/qt-creator
Fix a crash on shutdown inside CallgrindTool
This is a quick fix for 6.0 branch. Fixes: QTCREATORBUG-26563 Change-Id: Ida0f99a90c2e8515a2ea2b89de7a666f3067f908 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -189,14 +189,14 @@ public:
|
|||||||
// Navigation
|
// Navigation
|
||||||
QAction *m_goBack = nullptr;
|
QAction *m_goBack = nullptr;
|
||||||
QAction *m_goNext = nullptr;
|
QAction *m_goNext = nullptr;
|
||||||
QLineEdit *m_searchFilter = nullptr;
|
QPointer<QLineEdit> m_searchFilter = nullptr;
|
||||||
|
|
||||||
// Cost formatting
|
// Cost formatting
|
||||||
QAction *m_filterProjectCosts = nullptr;
|
QAction *m_filterProjectCosts = nullptr;
|
||||||
QAction *m_costAbsolute = nullptr;
|
QAction *m_costAbsolute = nullptr;
|
||||||
QAction *m_costRelative = nullptr;
|
QAction *m_costRelative = nullptr;
|
||||||
QAction *m_costRelativeToParent = nullptr;
|
QAction *m_costRelativeToParent = nullptr;
|
||||||
QComboBox *m_eventCombo = nullptr;
|
QPointer<QComboBox> m_eventCombo;
|
||||||
|
|
||||||
QTimer m_updateTimer;
|
QTimer m_updateTimer;
|
||||||
|
|
||||||
@@ -546,8 +546,10 @@ void CallgrindToolPrivate::setBusyCursor(bool busy)
|
|||||||
void CallgrindToolPrivate::selectFunction(const Function *func)
|
void CallgrindToolPrivate::selectFunction(const Function *func)
|
||||||
{
|
{
|
||||||
if (!func) {
|
if (!func) {
|
||||||
m_flatView->clearSelection();
|
if (m_flatView)
|
||||||
m_visualization->setFunction(nullptr);
|
m_flatView->clearSelection();
|
||||||
|
if (m_visualization)
|
||||||
|
m_visualization->setFunction(nullptr);
|
||||||
m_callersModel.clear();
|
m_callersModel.clear();
|
||||||
m_calleesModel.clear();
|
m_calleesModel.clear();
|
||||||
return;
|
return;
|
||||||
@@ -555,15 +557,18 @@ void CallgrindToolPrivate::selectFunction(const Function *func)
|
|||||||
|
|
||||||
const QModelIndex index = m_dataModel.indexForObject(func);
|
const QModelIndex index = m_dataModel.indexForObject(func);
|
||||||
const QModelIndex proxyIndex = m_proxyModel.mapFromSource(index);
|
const QModelIndex proxyIndex = m_proxyModel.mapFromSource(index);
|
||||||
m_flatView->selectionModel()->clearSelection();
|
if (m_flatView) {
|
||||||
m_flatView->selectionModel()->setCurrentIndex(proxyIndex,
|
m_flatView->selectionModel()->clearSelection();
|
||||||
QItemSelectionModel::ClearAndSelect |
|
m_flatView->selectionModel()->setCurrentIndex(proxyIndex,
|
||||||
QItemSelectionModel::Rows);
|
QItemSelectionModel::ClearAndSelect |
|
||||||
m_flatView->scrollTo(proxyIndex);
|
QItemSelectionModel::Rows);
|
||||||
|
m_flatView->scrollTo(proxyIndex);
|
||||||
|
}
|
||||||
|
|
||||||
m_callersModel.setCalls(func->incomingCalls(), func);
|
m_callersModel.setCalls(func->incomingCalls(), func);
|
||||||
m_calleesModel.setCalls(func->outgoingCalls(), func);
|
m_calleesModel.setCalls(func->outgoingCalls(), func);
|
||||||
m_visualization->setFunction(func);
|
if (m_visualization)
|
||||||
|
m_visualization->setFunction(func);
|
||||||
|
|
||||||
const Function *item = m_stackBrowser.current();
|
const Function *item = m_stackBrowser.current();
|
||||||
if (!item || item != func)
|
if (!item || item != func)
|
||||||
@@ -688,7 +693,8 @@ void CallgrindToolPrivate::visualisationFunctionSelected(const Function *functio
|
|||||||
void CallgrindToolPrivate::setParseData(ParseData *data)
|
void CallgrindToolPrivate::setParseData(ParseData *data)
|
||||||
{
|
{
|
||||||
// we have new parse data, invalidate filters in the proxy model
|
// we have new parse data, invalidate filters in the proxy model
|
||||||
m_visualization->setFunction(nullptr);
|
if (m_visualization)
|
||||||
|
m_visualization->setFunction(nullptr);
|
||||||
|
|
||||||
// invalidate parse data in the data model
|
// invalidate parse data in the data model
|
||||||
delete m_dataModel.parseData();
|
delete m_dataModel.parseData();
|
||||||
@@ -704,7 +710,8 @@ void CallgrindToolPrivate::setParseData(ParseData *data)
|
|||||||
m_calleesModel.setParseData(data);
|
m_calleesModel.setParseData(data);
|
||||||
m_callersModel.setParseData(data);
|
m_callersModel.setParseData(data);
|
||||||
|
|
||||||
updateEventCombo();
|
if (m_eventCombo)
|
||||||
|
updateEventCombo();
|
||||||
|
|
||||||
// clear history for new data
|
// clear history for new data
|
||||||
m_stackBrowser.clear();
|
m_stackBrowser.clear();
|
||||||
|
Reference in New Issue
Block a user