DAP: Change unique_ptr to QObject parenting

Change-Id: I47f5db1823e69829294fb9f551a2edcb980d86dc
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Artem Sokolovskii
2023-08-17 13:32:55 +02:00
parent 17d8f61f93
commit e3808cf4f4
6 changed files with 43 additions and 29 deletions

View File

@@ -29,8 +29,9 @@ namespace Debugger::Internal {
class LocalSocketDataProvider : public IDataProvider class LocalSocketDataProvider : public IDataProvider
{ {
public: public:
LocalSocketDataProvider(const QString &socketName) LocalSocketDataProvider(const QString &socketName, QObject *parent = nullptr)
: m_socketName(socketName) : IDataProvider(parent)
, m_socketName(socketName)
{ {
connect(&m_socket, &QLocalSocket::connected, this, &IDataProvider::started); connect(&m_socket, &QLocalSocket::connected, this, &IDataProvider::started);
connect(&m_socket, &QLocalSocket::disconnected, this, &IDataProvider::done); connect(&m_socket, &QLocalSocket::disconnected, this, &IDataProvider::done);
@@ -74,8 +75,8 @@ private:
class CMakeDapClient : public DapClient class CMakeDapClient : public DapClient
{ {
public: public:
CMakeDapClient(std::unique_ptr<IDataProvider> provider) CMakeDapClient(IDataProvider *provider, QObject *parent = nullptr)
: DapClient(std::move(provider)) : DapClient(provider, parent)
{} {}
void sendInitialize() void sendInitialize()
@@ -102,14 +103,15 @@ void CMakeDapEngine::setupEngine()
qCDebug(dapEngineLog) << "build system name" qCDebug(dapEngineLog) << "build system name"
<< ProjectExplorer::ProjectTree::currentBuildSystem()->name(); << ProjectExplorer::ProjectTree::currentBuildSystem()->name();
std::unique_ptr<IDataProvider> dataProvider; IDataProvider *dataProvider;
if (TemporaryDirectory::masterDirectoryFilePath().osType() == Utils::OsType::OsTypeWindows) { if (TemporaryDirectory::masterDirectoryFilePath().osType() == Utils::OsType::OsTypeWindows) {
dataProvider = std::make_unique<LocalSocketDataProvider>("\\\\.\\pipe\\cmake-dap"); dataProvider = new LocalSocketDataProvider("\\\\.\\pipe\\cmake-dap", this);
} else { } else {
dataProvider = std::make_unique<LocalSocketDataProvider>( dataProvider = new LocalSocketDataProvider(TemporaryDirectory::masterDirectoryPath()
TemporaryDirectory::masterDirectoryPath() + "/cmake-dap.sock"); + "/cmake-dap.sock",
this);
} }
m_dapClient = std::make_unique<CMakeDapClient>(std::move(dataProvider)); m_dapClient = new CMakeDapClient(dataProvider, this);
connectDataGeneratorSignals(); connectDataGeneratorSignals();
connect(ProjectExplorer::ProjectTree::currentBuildSystem(), connect(ProjectExplorer::ProjectTree::currentBuildSystem(),

View File

@@ -17,20 +17,21 @@ static Q_LOGGING_CATEGORY(dapEngineLog, "qtc.dbg.dapengine", QtWarningMsg);
namespace Debugger::Internal { namespace Debugger::Internal {
DapClient::DapClient(std::unique_ptr<IDataProvider> dataProvider) DapClient::DapClient(IDataProvider *dataProvider, QObject *parent)
: m_dataProvider(std::move(dataProvider)) : QObject(parent)
, m_dataProvider(dataProvider)
{ {
connect(m_dataProvider.get(), connect(m_dataProvider,
&IDataProvider::readyReadStandardOutput, &IDataProvider::readyReadStandardOutput,
this, this,
&DapClient::readOutput); &DapClient::readOutput);
connect(m_dataProvider.get(), connect(m_dataProvider,
&IDataProvider::readyReadStandardError, &IDataProvider::readyReadStandardError,
this, this,
&DapClient::readyReadStandardError); &DapClient::readyReadStandardError);
connect(m_dataProvider.get(), &IDataProvider::done, this, &DapClient::done); connect(m_dataProvider, &IDataProvider::done, this, &DapClient::done);
connect(m_dataProvider.get(), &IDataProvider::started, this, &DapClient::started); connect(m_dataProvider, &IDataProvider::started, this, &DapClient::started);
} }
DapClient::~DapClient() = default; DapClient::~DapClient() = default;

View File

@@ -13,6 +13,8 @@ class IDataProvider : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
IDataProvider(QObject *parent = nullptr) : QObject(parent) {}
~IDataProvider() override = default;
virtual void start() = 0; virtual void start() = 0;
virtual bool isRunning() const = 0; virtual bool isRunning() const = 0;
virtual void writeRaw(const QByteArray &input) = 0; virtual void writeRaw(const QByteArray &input) = 0;
@@ -64,10 +66,10 @@ class DapClient : public QObject
Q_OBJECT Q_OBJECT
public: public:
DapClient(std::unique_ptr<IDataProvider> dataProvider); DapClient(IDataProvider *dataProvider, QObject *parent = nullptr);
~DapClient(); ~DapClient() override;
IDataProvider *dataProvider() const { return m_dataProvider.get(); } IDataProvider *dataProvider() const { return m_dataProvider; }
void postRequest(const QString &command, const QJsonObject &arguments = {}); void postRequest(const QString &command, const QJsonObject &arguments = {});
@@ -105,7 +107,7 @@ private:
void readOutput(); void readOutput();
private: private:
std::unique_ptr<IDataProvider> m_dataProvider = nullptr; IDataProvider *m_dataProvider = nullptr;
QByteArray m_inbuffer; QByteArray m_inbuffer;
}; };

View File

@@ -70,6 +70,11 @@ DapEngine::DapEngine()
m_currentWatchItem = m_rootWatchItem; m_currentWatchItem = m_rootWatchItem;
} }
DapEngine::~DapEngine()
{
delete m_rootWatchItem;
}
void DapEngine::executeDebuggerCommand(const QString &/*command*/) void DapEngine::executeDebuggerCommand(const QString &/*command*/)
{ {
QTC_ASSERT(state() == InferiorStopOk, qCDebug(dapEngineLog) << state()); QTC_ASSERT(state() == InferiorStopOk, qCDebug(dapEngineLog) << state());
@@ -787,15 +792,15 @@ void DapEngine::connectDataGeneratorSignals()
if (!m_dapClient) if (!m_dapClient)
return; return;
connect(m_dapClient.get(), &DapClient::started, this, &DapEngine::handleDapStarted); connect(m_dapClient, &DapClient::started, this, &DapEngine::handleDapStarted);
connect(m_dapClient.get(), &DapClient::done, this, &DapEngine::handleDapDone); connect(m_dapClient, &DapClient::done, this, &DapEngine::handleDapDone);
connect(m_dapClient.get(), connect(m_dapClient,
&DapClient::readyReadStandardError, &DapClient::readyReadStandardError,
this, this,
&DapEngine::readDapStandardError); &DapEngine::readDapStandardError);
connect(m_dapClient.get(), &DapClient::responseReady, this, &DapEngine::handleResponse); connect(m_dapClient, &DapClient::responseReady, this, &DapEngine::handleResponse);
connect(m_dapClient.get(), &DapClient::eventReady, this, &DapEngine::handleEvent); connect(m_dapClient, &DapClient::eventReady, this, &DapEngine::handleEvent);
} }
DebuggerEngine *createDapEngine(Utils::Id runMode) DebuggerEngine *createDapEngine(Utils::Id runMode)

View File

@@ -27,6 +27,7 @@ class DapEngine : public DebuggerEngine
{ {
public: public:
DapEngine(); DapEngine();
~DapEngine() override;
protected: protected:
void executeStepIn(bool) override; void executeStepIn(bool) override;
@@ -107,7 +108,7 @@ protected:
void connectDataGeneratorSignals(); void connectDataGeneratorSignals();
QByteArray m_inbuffer; QByteArray m_inbuffer;
std::unique_ptr<DapClient> m_dapClient = nullptr; DapClient *m_dapClient = nullptr;
int m_nextBreakpointId = 1; int m_nextBreakpointId = 1;
int m_currentThreadId = -1; int m_currentThreadId = -1;

View File

@@ -26,8 +26,11 @@ namespace Debugger::Internal {
class ProcessDataProvider : public IDataProvider class ProcessDataProvider : public IDataProvider
{ {
public: public:
ProcessDataProvider(const DebuggerRunParameters &rp, const CommandLine &cmd) ProcessDataProvider(const DebuggerRunParameters &rp,
: m_runParameters(rp) const CommandLine &cmd,
QObject *parent = nullptr)
: IDataProvider(parent)
, m_runParameters(rp)
, m_cmd(cmd) , m_cmd(cmd)
{ {
connect(&m_proc, &Process::started, this, &IDataProvider::started); connect(&m_proc, &Process::started, this, &IDataProvider::started);
@@ -89,8 +92,8 @@ void GdbDapEngine::setupEngine()
const DebuggerRunParameters &rp = runParameters(); const DebuggerRunParameters &rp = runParameters();
const CommandLine cmd{rp.debugger.command.executable(), {"-i", "dap"}}; const CommandLine cmd{rp.debugger.command.executable(), {"-i", "dap"}};
std::unique_ptr<IDataProvider> dataProvider = std::make_unique<ProcessDataProvider>(rp, cmd); IDataProvider *dataProvider = new ProcessDataProvider(rp, cmd, this);
m_dapClient = std::make_unique<DapClient>(std::move(dataProvider)); m_dapClient = new DapClient(dataProvider, this);
connectDataGeneratorSignals(); connectDataGeneratorSignals();
m_dapClient->dataProvider()->start(); m_dapClient->dataProvider()->start();