LinuxDevice: Fix stopping remote app when run in terminal

Before, the SshProcessInterface was trying to run kill
command (on remote host) for the running processId. However,
in case of terminal process the returned processId is an id
of ssh running through creator process stub, not the id of
remote process. The fix is to redirect a call to sendControlSignal
into the internal terminal process.

Change-Id: I57509fd61a54c335ab0a34f8ca0dffb3d75da696
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2022-11-14 15:23:01 +01:00
parent 35a37c3450
commit adac83367c
5 changed files with 22 additions and 7 deletions

View File

@@ -5,7 +5,6 @@
#include "qdbutils.h"
#include "qdbconstants.h"
#include "qdbdevicedebugsupport.h"
#include <coreplugin/icore.h>
@@ -18,6 +17,7 @@
#include <utils/portlist.h>
#include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <utils/theme/theme.h>
#include <QFormLayout>
#include <QLabel>
@@ -39,7 +39,7 @@ public:
~QdbProcessImpl() { killIfRunning(); }
private:
void sendControlSignal(ControlSignal controlSignal) final
void handleSendControlSignal(ControlSignal controlSignal) final
{
QTC_ASSERT(controlSignal != ControlSignal::Interrupt, return);
QTC_ASSERT(controlSignal != ControlSignal::KickOff, return);

View File

@@ -33,7 +33,7 @@ public:
private:
QString fullCommandLine(const CommandLine &commandLine) const final;
void sendControlSignal(Utils::ControlSignal controlSignal) final;
void handleSendControlSignal(Utils::ControlSignal controlSignal) final;
const QString m_pidFile;
};
@@ -71,7 +71,7 @@ QString QnxProcessImpl::fullCommandLine(const CommandLine &commandLine) const
return fullCommandLine;
}
void QnxProcessImpl::sendControlSignal(Utils::ControlSignal controlSignal)
void QnxProcessImpl::handleSendControlSignal(Utils::ControlSignal controlSignal)
{
QTC_ASSERT(controlSignal != ControlSignal::KickOff, return);
const QString args = QString::fromLatin1("-%1 `cat %2`")

View File

@@ -496,6 +496,20 @@ qint64 SshProcessInterface::write(const QByteArray &data)
return d->m_process.writeRaw(data);
}
void SshProcessInterface::sendControlSignal(Utils::ControlSignal controlSignal)
{
if (d->m_process.usesTerminal()) {
switch (controlSignal) {
case Utils::ControlSignal::Terminate: d->m_process.terminate(); break;
case Utils::ControlSignal::Kill: d->m_process.kill(); break;
case Utils::ControlSignal::Interrupt: d->m_process.interrupt(); break;
case Utils::ControlSignal::KickOff: d->m_process.kickoffProcess(); break;
}
return;
}
handleSendControlSignal(controlSignal);
}
LinuxProcessInterface::LinuxProcessInterface(const LinuxDevice *linuxDevice)
: SshProcessInterface(linuxDevice)
{
@@ -506,7 +520,7 @@ LinuxProcessInterface::~LinuxProcessInterface()
killIfRunning();
}
void LinuxProcessInterface::sendControlSignal(ControlSignal controlSignal)
void LinuxProcessInterface::handleSendControlSignal(ControlSignal controlSignal)
{
QTC_ASSERT(controlSignal != ControlSignal::KickOff, return);
const qint64 pid = processId();

View File

@@ -19,7 +19,7 @@ public:
~LinuxProcessInterface();
private:
void sendControlSignal(Utils::ControlSignal controlSignal) override;
void handleSendControlSignal(Utils::ControlSignal controlSignal) override;
void handleStarted(qint64 processId) final;
void handleDone(const Utils::ProcessResultData &resultData) final;

View File

@@ -31,12 +31,13 @@ private:
virtual void handleDone(const Utils::ProcessResultData &resultData);
virtual void handleReadyReadStandardOutput(const QByteArray &outputData);
virtual void handleReadyReadStandardError(const QByteArray &errorData);
virtual void handleSendControlSignal(Utils::ControlSignal controlSignal) = 0;
virtual QString fullCommandLine(const Utils::CommandLine &commandLine) const = 0;
void start() final;
qint64 write(const QByteArray &data) final;
void sendControlSignal(Utils::ControlSignal controlSignal) override = 0;
void sendControlSignal(Utils::ControlSignal controlSignal) final;
friend class SshProcessInterfacePrivate;
SshProcessInterfacePrivate *d = nullptr;