summaryrefslogtreecommitdiffstats
path: root/src/client/qwaylandintegration.cpp
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2019-08-28 07:37:19 +0200
committerJohan Klokkhammer Helsing <johan.helsing@qt.io>2019-08-29 14:11:20 +0200
commitc4318f7b831778acf385cad99f33f000f2a9e045 (patch)
treef9411c6e86bbd9d446383bb9c5068612f441e801 /src/client/qwaylandintegration.cpp
parentfc9c4a04d7359cb00a733c56cf85fc9737c9886d (diff)
parentf5a28afe4c2cb82540c94616e7a9e3e72e0e8327 (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
Conflicts: src/client/qwaylandinputdevice.cpp src/client/qwaylandintegration.cpp src/client/qwaylandwindow_p.h src/shared/qwaylandxkb.cpp Change-Id: Ibac7998502351e93c71c9b786536298657afe3d0
Diffstat (limited to 'src/client/qwaylandintegration.cpp')
-rw-r--r--src/client/qwaylandintegration.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp
index ea2b50b4a..85fcef43f 100644
--- a/src/client/qwaylandintegration.cpp
+++ b/src/client/qwaylandintegration.cpp
@@ -310,11 +310,14 @@ QPlatformTheme *QWaylandIntegration::createPlatformTheme(const QString &name) co
return GenericWaylandTheme::createUnixTheme(name);
}
+// May be called from non-GUI threads
QWaylandClientBufferIntegration *QWaylandIntegration::clientBufferIntegration() const
{
- if (!mClientBufferIntegrationInitialized)
+ // Do an inexpensive check first to avoid locking whenever possible
+ if (Q_UNLIKELY(!mClientBufferIntegrationInitialized))
const_cast<QWaylandIntegration *>(this)->initializeClientBufferIntegration();
+ Q_ASSERT(mClientBufferIntegrationInitialized);
return mClientBufferIntegration && mClientBufferIntegration->isValid() ? mClientBufferIntegration.data() : nullptr;
}
@@ -334,9 +337,12 @@ QWaylandShellIntegration *QWaylandIntegration::shellIntegration() const
return mShellIntegration.data();
}
+// May be called from non-GUI threads
void QWaylandIntegration::initializeClientBufferIntegration()
{
- mClientBufferIntegrationInitialized = true;
+ QMutexLocker lock(&mClientBufferInitLock);
+ if (mClientBufferIntegrationInitialized)
+ return;
QString targetKey = QString::fromLocal8Bit(qgetenv("QT_WAYLAND_CLIENT_BUFFER_INTEGRATION"));
@@ -352,22 +358,25 @@ void QWaylandIntegration::initializeClientBufferIntegration()
if (targetKey.isEmpty()) {
qWarning("Failed to determine what client buffer integration to use");
- return;
- }
-
- QStringList keys = QWaylandClientBufferIntegrationFactory::keys();
- qCDebug(lcQpaWayland) << "Available client buffer integrations:" << keys;
+ } else {
+ QStringList keys = QWaylandClientBufferIntegrationFactory::keys();
+ qCDebug(lcQpaWayland) << "Available client buffer integrations:" << keys;
- if (keys.contains(targetKey))
- mClientBufferIntegration.reset(QWaylandClientBufferIntegrationFactory::create(targetKey, QStringList()));
+ if (keys.contains(targetKey))
+ mClientBufferIntegration.reset(QWaylandClientBufferIntegrationFactory::create(targetKey, QStringList()));
- if (mClientBufferIntegration) {
- qCDebug(lcQpaWayland) << "Initializing client buffer integration" << targetKey;
- mClientBufferIntegration->initialize(mDisplay.data());
- } else {
- qCWarning(lcQpaWayland) << "Failed to load client buffer integration:" << targetKey;
- qCWarning(lcQpaWayland) << "Available client buffer integrations:" << keys;
+ if (mClientBufferIntegration) {
+ qCDebug(lcQpaWayland) << "Initializing client buffer integration" << targetKey;
+ mClientBufferIntegration->initialize(mDisplay.data());
+ } else {
+ qCWarning(lcQpaWayland) << "Failed to load client buffer integration:" << targetKey;
+ qCWarning(lcQpaWayland) << "Available client buffer integrations:" << keys;
+ }
}
+
+ // This must be set last to make sure other threads don't use the
+ // integration before initialization is complete.
+ mClientBufferIntegrationInitialized = true;
}
void QWaylandIntegration::initializeServerBufferIntegration()