forked from qt-creator/qt-creator
Clangd: Fix possible crash in inspector
When fast switching between clients listed inside the inspector the message response for memory usage may arrive after the model has been destroyed. Change-Id: I0503bb334cf21b0919316f0ac2e731472f3433bd Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -1074,6 +1074,7 @@ class MemoryUsageWidget : public QWidget
|
|||||||
Q_DECLARE_TR_FUNCTIONS(MemoryUsageWidget)
|
Q_DECLARE_TR_FUNCTIONS(MemoryUsageWidget)
|
||||||
public:
|
public:
|
||||||
MemoryUsageWidget(ClangdClient *client);
|
MemoryUsageWidget(ClangdClient *client);
|
||||||
|
~MemoryUsageWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupUi();
|
void setupUi();
|
||||||
@@ -1082,6 +1083,7 @@ private:
|
|||||||
ClangdClient * const m_client;
|
ClangdClient * const m_client;
|
||||||
MemoryTreeModel * const m_model;
|
MemoryTreeModel * const m_model;
|
||||||
Utils::TreeView m_view;
|
Utils::TreeView m_view;
|
||||||
|
Utils::optional<MessageId> m_currentRequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ClangdClient::Private
|
class ClangdClient::Private
|
||||||
@@ -3959,6 +3961,12 @@ MemoryUsageWidget::MemoryUsageWidget(ClangdClient *client)
|
|||||||
getMemoryTree();
|
getMemoryTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MemoryUsageWidget::~MemoryUsageWidget()
|
||||||
|
{
|
||||||
|
if (m_currentRequest.has_value())
|
||||||
|
m_client->cancelRequest(m_currentRequest.value());
|
||||||
|
}
|
||||||
|
|
||||||
void MemoryUsageWidget::setupUi()
|
void MemoryUsageWidget::setupUi()
|
||||||
{
|
{
|
||||||
const auto layout = new QVBoxLayout(this);
|
const auto layout = new QVBoxLayout(this);
|
||||||
@@ -3978,11 +3986,13 @@ void MemoryUsageWidget::getMemoryTree()
|
|||||||
{
|
{
|
||||||
Request<MemoryTree, std::nullptr_t, JsonObject> request("$/memoryUsage", {});
|
Request<MemoryTree, std::nullptr_t, JsonObject> request("$/memoryUsage", {});
|
||||||
request.setResponseCallback([this](decltype(request)::Response response) {
|
request.setResponseCallback([this](decltype(request)::Response response) {
|
||||||
|
m_currentRequest.reset();
|
||||||
qCDebug(clangdLog) << "received memory usage response";
|
qCDebug(clangdLog) << "received memory usage response";
|
||||||
if (const auto result = response.result())
|
if (const auto result = response.result())
|
||||||
m_model->update(*result);
|
m_model->update(*result);
|
||||||
});
|
});
|
||||||
qCDebug(clangdLog) << "sending memory usage request";
|
qCDebug(clangdLog) << "sending memory usage request";
|
||||||
|
m_currentRequest = request.id();
|
||||||
m_client->sendContent(request, ClangdClient::SendDocUpdates::Ignore);
|
m_client->sendContent(request, ClangdClient::SendDocUpdates::Ignore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user