From e2547608c034ed4302eda5af4ac1d2c97105dec7 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 11 Oct 2024 08:42:31 +0200 Subject: [PATCH] Docker: Move some lambdas into normal functions Also, swap the branches of an 'if' to avoid a negation. Change-Id: I5191b2ebb13fb340b4bffe2f47bd027809111c64 Reviewed-by: Marcus Tillmanns --- src/plugins/docker/dockerdevice.cpp | 90 +++++++++++++++-------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 332146dd822..c7427e5fcb1 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -224,6 +224,51 @@ public: bool isImageAvailable() const; + expected_str> createBridgeFileAccess() + { + expected_str cmdBridgePath = getCmdBridgePath(); + + if (!cmdBridgePath) + return make_unexpected(cmdBridgePath.error()); + + auto fAccess = std::make_unique(this); + + Result initResult = Result::Ok; + if (cmdBridgePath->isSameDevice(Docker::Internal::settings().dockerBinaryPath())) + initResult = fAccess->init(q->rootPath().withNewPath("/tmp/_qtc_cmdbridge")); + else + initResult = fAccess->deployAndInit(Core::ICore::libexecPath(), q->rootPath()); + + if (!initResult) + return make_unexpected(initResult.error()); + + return fAccess; + } + + DeviceFileAccess *createFileAccess() + { + if (DeviceFileAccess *fileAccess = m_fileAccess.readLocked()->get()) + return fileAccess; + + SynchronizedValue>::unique_lock fileAccess + = m_fileAccess.writeLocked(); + if (*fileAccess) + return fileAccess->get(); + + expected_str> fAccess = createBridgeFileAccess(); + + if (fAccess) { + *fileAccess = std::move(*fAccess); + return fileAccess->get(); + } + + qCWarning(dockerDeviceLog).noquote() << "Failed to start CmdBridge:" << fAccess.error() + << ", falling back to slow direct access"; + + *fileAccess = std::make_unique(q->rootPath()); + return fileAccess->get(); + } + DockerDevice *const q; struct MountPair @@ -585,48 +630,7 @@ DockerDevice::DockerDevice() containerStatus.setText(Tr::tr("stopped")); - - auto createBridgeFileAccess = [this]() -> expected_str> { - expected_str cmdBridgePath = d->getCmdBridgePath(); - - if (!cmdBridgePath) - return make_unexpected(cmdBridgePath.error()); - - auto fAccess = std::make_unique(d); - Result initResult = Result::Ok; - if (!cmdBridgePath->isSameDevice(Docker::Internal::settings().dockerBinaryPath())) { - initResult = fAccess->deployAndInit(Core::ICore::libexecPath(), rootPath()); - } else { - initResult = fAccess->init(rootPath().withNewPath("/tmp/_qtc_cmdbridge")); - } - if (!initResult) - return make_unexpected(initResult.error()); - - return fAccess; - }; - - setFileAccessFactory([this, createBridgeFileAccess]() -> DeviceFileAccess * { - if (DeviceFileAccess *fileAccess = d->m_fileAccess.readLocked()->get()) - return fileAccess; - - SynchronizedValue>::unique_lock fileAccess - = d->m_fileAccess.writeLocked(); - if (*fileAccess) - return fileAccess->get(); - - expected_str> fAccess = createBridgeFileAccess(); - - if (fAccess) { - *fileAccess = std::move(*fAccess); - return fileAccess->get(); - } - - qCWarning(dockerDeviceLog).noquote() << "Failed to start CmdBridge:" << fAccess.error() - << ", falling back to slow direct access"; - - *fileAccess = std::make_unique(rootPath()); - return fileAccess->get(); - }); + allowEmptyCommand.setValue(true); setDisplayType(Tr::tr("Docker")); setOsType(OsTypeLinux); @@ -634,7 +638,7 @@ DockerDevice::DockerDevice() setType(Constants::DOCKER_DEVICE_TYPE); setMachineType(IDevice::Hardware); - allowEmptyCommand.setValue(true); + setFileAccessFactory([this] { return d->createFileAccess(); }); setOpenTerminal([this](const Environment &env, const FilePath &workingDir) -> expected_str {