diff --git a/src/libs/gocmdbridge/client/cmdbridgeclient.cpp b/src/libs/gocmdbridge/client/cmdbridgeclient.cpp index 1dacdc1d4fb..05ad3fc0d7d 100644 --- a/src/libs/gocmdbridge/client/cmdbridgeclient.cpp +++ b/src/libs/gocmdbridge/client/cmdbridgeclient.cpp @@ -239,8 +239,10 @@ Client::Client(const Utils::FilePath &remoteCmdBridgePath) Client::~Client() { - d->thread->quit(); - d->thread->wait(); + if (d->thread->isRunning()) { + exit(); + d->thread->wait(); + } } expected_str> Client::start() @@ -303,10 +305,14 @@ expected_str> Client::start() func(QVariantMap{ {"Type", "error"}, {"Id", id}, - {"Error", QString("Process exited: %1").arg(d->process->errorString())}}); + {"Error", QString("Process exited: %1").arg(d->process->errorString())}, + {"ErrorType", (d->process->exitCode() == 0 ? "NormalExit" : "ErrorExit")}}); } emit done(d->process->resultData()); + d->process->deleteLater(); + d->process = nullptr; + QThread::currentThread()->quit(); }); auto stateMachine = [state = int(0), packetSize(0), packetData = QByteArray(), this]( @@ -374,6 +380,9 @@ expected_str> Client::start() d->process->start(); + if (!d->process) + return make_unexpected(Tr::tr("Failed starting bridge process")); + if (!d->process->waitForStarted()) return make_unexpected( Tr::tr("Failed starting bridge process: %1").arg(d->process->errorString())); @@ -419,6 +428,10 @@ static Utils::expected_str> createJob( promise->setException( std::make_exception_ptr(std::system_error(ENOENT, std::generic_category()))); promise->finish(); + } else if (errType == "NormalExit") { + promise->setException( + std::make_exception_ptr(std::runtime_error(err.toStdString()))); + promise->finish(); } else { qCWarning(clientLog) << "Error (" << errType << "):" << err; promise->setException( @@ -799,6 +812,15 @@ Utils::expected_str> Client::signalProcess(int pid, Utils::Control "signalsuccess"); } +void Client::exit() +{ + try { + createVoidJob(d.get(), QCborMap{{"Type", "exit"}}, "exitres")->waitForFinished(); + } catch (...) { + return; + } +} + Utils::expected_str> Client::stat(const QString &path) { return createJob( diff --git a/src/libs/gocmdbridge/client/cmdbridgeclient.h b/src/libs/gocmdbridge/client/cmdbridgeclient.h index ed46949d4d1..1d6556d3234 100644 --- a/src/libs/gocmdbridge/client/cmdbridgeclient.h +++ b/src/libs/gocmdbridge/client/cmdbridgeclient.h @@ -112,6 +112,9 @@ public: Utils::expected_str> signalProcess(int pid, Utils::ControlSignal signal); +protected: + void exit(); + signals: void done(const Utils::ProcessResultData &resultData); diff --git a/src/libs/gocmdbridge/server/cmdbridge.go b/src/libs/gocmdbridge/server/cmdbridge.go index 39167226313..856c145ee9a 100644 --- a/src/libs/gocmdbridge/server/cmdbridge.go +++ b/src/libs/gocmdbridge/server/cmdbridge.go @@ -395,6 +395,8 @@ func processCommand(watcher *WatcherHandler, cmd command, out chan<- []byte) { Error: cmd.Error, }) out <- result + case "exit": + os.Exit(0) } }