forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
|
@@ -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`")
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user