diff --git a/src/plugins/projectexplorer/applicationlauncher.cpp b/src/plugins/projectexplorer/applicationlauncher.cpp index 321230d40f6..2e492171210 100644 --- a/src/plugins/projectexplorer/applicationlauncher.cpp +++ b/src/plugins/projectexplorer/applicationlauncher.cpp @@ -462,12 +462,8 @@ void ApplicationLauncherPrivate::setFinished() return; int exitCode = 0; - if (m_deviceProcess) { + if (m_deviceProcess) exitCode = m_deviceProcess->exitCode(); - m_deviceProcess->disconnect(this); - m_deviceProcess->deleteLater(); - m_deviceProcess = nullptr; - } m_state = Inactive; emit q->processExited(exitCode, m_remoteExitStatus); diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp index 34861e1033b..3d558a4562a 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp @@ -119,16 +119,14 @@ void SshDeviceProcess::interrupt() void SshDeviceProcess::terminate() { + QTC_ASSERT(d->state == SshDeviceProcessPrivate::ProcessRunning, return); d->doSignal(Signal::Terminate); - if (runInTerminal()) - d->consoleProcess.stop(); } void SshDeviceProcess::kill() { + QTC_ASSERT(d->state == SshDeviceProcessPrivate::ProcessRunning, return); d->doSignal(Signal::Kill); - if (runInTerminal()) - d->consoleProcess.stop(); } QProcess::ProcessState SshDeviceProcess::state() const @@ -199,6 +197,8 @@ void SshDeviceProcess::handleConnected() this, &DeviceProcess::error); connect(&d->consoleProcess, &ConsoleProcess::processStarted, this, &SshDeviceProcess::handleProcessStarted); + connect(&d->consoleProcess, &ConsoleProcess::processStopped, + this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); connect(&d->consoleProcess, &ConsoleProcess::stubStopped, this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); d->consoleProcess.setAbortOnMetaChars(false); @@ -256,6 +256,8 @@ void SshDeviceProcess::handleProcessFinished(const QString &error) { d->errorMessage = error; d->exitCode = runInTerminal() ? d->consoleProcess.exitCode() : d->process->exitCode(); + if (d->killOperation && error.isEmpty()) + d->errorMessage = tr("The process was ended forcefully."); d->setState(SshDeviceProcessPrivate::Inactive); emit finished(); } @@ -357,6 +359,8 @@ void SshDeviceProcess::SshDeviceProcessPrivate::setState(SshDeviceProcess::SshDe if (killOperation) { killOperation->disconnect(q); killOperation.clear(); + if (q->runInTerminal()) + QMetaObject::invokeMethod(&consoleProcess, &ConsoleProcess::stop, Qt::QueuedConnection); } killTimer.stop(); consoleProcess.disconnect(); diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp index 2b582479036..cbe3b6f9d5e 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp @@ -40,12 +40,8 @@ RemoteLinuxSignalOperation::RemoteLinuxSignalOperation( RemoteLinuxSignalOperation::~RemoteLinuxSignalOperation() { - if (m_runner) { - connect(m_runner, &QSsh::SshRemoteProcessRunner::processClosed, - m_runner, &QSsh::SshRemoteProcessRunner::deleteLater); - connect(m_runner, &QSsh::SshRemoteProcessRunner::connectionError, - m_runner, &QSsh::SshRemoteProcessRunner::deleteLater); - } + if (m_runner) + m_runner->deleteLater(); } static QString signalProcessGroupByPidCommandLine(qint64 pid, int signal)