forked from qt-creator/qt-creator
Docker: Guard m_fileAccess
Change-Id: Ic7df2d44d39ba54b15ad24181bfcddcc13c6d02b Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -49,10 +49,11 @@
|
|||||||
#include <utils/overridecursor.h>
|
#include <utils/overridecursor.h>
|
||||||
#include <utils/pathlisteditor.h>
|
#include <utils/pathlisteditor.h>
|
||||||
#include <utils/port.h>
|
#include <utils/port.h>
|
||||||
#include <utils/qtcprocess.h>
|
|
||||||
#include <utils/processinterface.h>
|
#include <utils/processinterface.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
#include <utils/qtcprocess.h>
|
||||||
#include <utils/sortfiltermodel.h>
|
#include <utils/sortfiltermodel.h>
|
||||||
|
#include <utils/synchronizedvalue.h>
|
||||||
#include <utils/temporaryfile.h>
|
#include <utils/temporaryfile.h>
|
||||||
#include <utils/terminalhooks.h>
|
#include <utils/terminalhooks.h>
|
||||||
#include <utils/treemodel.h>
|
#include <utils/treemodel.h>
|
||||||
@@ -357,7 +358,7 @@ public:
|
|||||||
|
|
||||||
std::optional<Environment> m_cachedEnviroment;
|
std::optional<Environment> m_cachedEnviroment;
|
||||||
bool m_isShutdown = false;
|
bool m_isShutdown = false;
|
||||||
std::unique_ptr<DeviceFileAccess> m_fileAccess;
|
SynchronizedValue<std::unique_ptr<DeviceFileAccess>> m_fileAccess;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DockerProcessImpl : public ProcessInterface
|
class DockerProcessImpl : public ProcessInterface
|
||||||
@@ -594,19 +595,27 @@ DockerDevice::DockerDevice(std::unique_ptr<DockerDeviceSettings> deviceSettings)
|
|||||||
, d(new DockerDevicePrivate(this))
|
, d(new DockerDevicePrivate(this))
|
||||||
{
|
{
|
||||||
setFileAccess([this]() -> DeviceFileAccess * {
|
setFileAccess([this]() -> DeviceFileAccess * {
|
||||||
if (!d->m_fileAccess) {
|
if (DeviceFileAccess *fileAccess = d->m_fileAccess.readLocked()->get())
|
||||||
auto fileAccess = std::make_unique<DockerDeviceFileAccess>(d);
|
return fileAccess;
|
||||||
auto initResult = fileAccess->init(rootPath().withNewPath("/tmp/_qtc_cmdbridge"));
|
|
||||||
QTC_CHECK(initResult);
|
|
||||||
if (initResult) {
|
|
||||||
d->m_fileAccess = std::move(fileAccess);
|
|
||||||
return d->m_fileAccess.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
d->m_fileAccess = std::make_unique<DockerFallbackFileAccess>(rootPath());
|
SynchronizedValue<std::unique_ptr<DeviceFileAccess>>::unique_lock fileAccess
|
||||||
|
= d->m_fileAccess.writeLocked();
|
||||||
|
if (*fileAccess)
|
||||||
|
return fileAccess->get();
|
||||||
|
|
||||||
|
auto fAccess = std::make_unique<DockerDeviceFileAccess>(d);
|
||||||
|
expected_str<void> initResult = fAccess->init(
|
||||||
|
rootPath().withNewPath("/tmp/_qtc_cmdbridge"));
|
||||||
|
QTC_CHECK_EXPECTED(initResult);
|
||||||
|
if (initResult) {
|
||||||
|
*fileAccess = std::move(fAccess);
|
||||||
|
return fileAccess->get();
|
||||||
}
|
}
|
||||||
return d->m_fileAccess.get();
|
|
||||||
|
*fileAccess = std::make_unique<DockerFallbackFileAccess>(rootPath());
|
||||||
|
return fileAccess->get();
|
||||||
});
|
});
|
||||||
|
|
||||||
setDisplayType(Tr::tr("Docker"));
|
setDisplayType(Tr::tr("Docker"));
|
||||||
setOsType(OsTypeLinux);
|
setOsType(OsTypeLinux);
|
||||||
setupId(IDevice::ManuallyAdded);
|
setupId(IDevice::ManuallyAdded);
|
||||||
@@ -735,6 +744,10 @@ void DockerDevicePrivate::stopCurrentContainer()
|
|||||||
if (!DockerApi::isDockerDaemonAvailable(false).value_or(false))
|
if (!DockerApi::isDockerDaemonAvailable(false).value_or(false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
auto fileAccess = m_fileAccess.writeLocked();
|
||||||
|
if (*fileAccess)
|
||||||
|
fileAccess->reset();
|
||||||
|
|
||||||
Process proc;
|
Process proc;
|
||||||
proc.setCommand({settings().dockerBinaryPath(), {"container", "stop", m_container}});
|
proc.setCommand({settings().dockerBinaryPath(), {"container", "stop", m_container}});
|
||||||
|
|
||||||
@@ -1071,8 +1084,8 @@ expected_str<void> DockerDevicePrivate::fetchSystemEnviroment()
|
|||||||
if (m_cachedEnviroment)
|
if (m_cachedEnviroment)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
if (m_fileAccess) {
|
if (auto fileAccess = m_fileAccess.readLocked()->get()) {
|
||||||
m_cachedEnviroment = m_fileAccess->deviceEnvironment();
|
m_cachedEnviroment = fileAccess->deviceEnvironment();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user