From 422511626038c38528c21d12c3338ba0f12e3cf0 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 28 Dec 2022 15:15:02 +0100 Subject: [PATCH] QJniHelpers: replace some Q_GLOBAL_STATIC with QBasic* statics For both QMutex and QAtomicInt, we have QBasic{Mutex,AtomicInt}, which are PODs, and therefore constant-initialized. Q_GLOBAL_STATIC, otoh, forces dynamic initialization, so don't use it. Raw pointers don't need Q_GLOBAL_STATIC, either. Patch up users. Instead of adding &'s to QMutexLocker arguments, port directly to qt_scoped_lock, which takes by reference. Change-Id: I1a13db2a5e88a52d4338a174a80522a3f5e58fa2 Reviewed-by: Fabian Kosmale Reviewed-by: Giuseppe D'Angelo --- src/corelib/kernel/qjnihelpers.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index 5981a085525..78d05261e5b 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -10,6 +10,7 @@ #include "qsemaphore.h" #include "qreadwritelock.h" #include +#include #include #include @@ -34,10 +35,10 @@ static jobject g_jActivity = nullptr; static jobject g_jService = nullptr; static jobject g_jClassLoader = nullptr; -Q_GLOBAL_STATIC(QtAndroidPrivate::OnBindListener *, g_onBindListener, nullptr); -Q_GLOBAL_STATIC(QMutex, g_onBindListenerMutex); +Q_CONSTINIT static QtAndroidPrivate::OnBindListener *g_onBindListener; +Q_CONSTINIT static QBasicMutex g_onBindListenerMutex; Q_GLOBAL_STATIC(QSemaphore, g_waitForServiceSetupSemaphore); -Q_GLOBAL_STATIC(QAtomicInt, g_serviceSetupLockers); +Q_CONSTINIT static QBasicAtomicInt g_serviceSetupLockers = Q_BASIC_ATOMIC_INITIALIZER(0); Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex); @@ -361,36 +362,36 @@ void QtAndroidPrivate::waitForServiceSetup() int QtAndroidPrivate::acuqireServiceSetup(int flags) { - g_serviceSetupLockers->ref(); + g_serviceSetupLockers.ref(); return flags; } void QtAndroidPrivate::setOnBindListener(QtAndroidPrivate::OnBindListener *listener) { - QMutexLocker lock(g_onBindListenerMutex()); - *g_onBindListener = listener; - if (!g_serviceSetupLockers->deref()) + const auto lock = qt_scoped_lock(g_onBindListenerMutex); + g_onBindListener = listener; + if (!g_serviceSetupLockers.deref()) g_waitForServiceSetupSemaphore->release(); } jobject QtAndroidPrivate::callOnBindListener(jobject intent) { - QMutexLocker lock(g_onBindListenerMutex()); - if (*g_onBindListener) - return (*g_onBindListener)->onBind(intent); + const auto lock = qt_scoped_lock(g_onBindListenerMutex); + if (g_onBindListener) + return g_onBindListener->onBind(intent); return nullptr; } -Q_GLOBAL_STATIC(QAtomicInt, g_androidDeadlockProtector); +Q_CONSTINIT static QBasicAtomicInt g_androidDeadlockProtector = Q_BASIC_ATOMIC_INITIALIZER(0); bool QtAndroidPrivate::acquireAndroidDeadlockProtector() { - return g_androidDeadlockProtector->testAndSetAcquire(0, 1); + return g_androidDeadlockProtector.testAndSetAcquire(0, 1); } void QtAndroidPrivate::releaseAndroidDeadlockProtector() { - g_androidDeadlockProtector->storeRelease(0); + g_androidDeadlockProtector.storeRelease(0); } QT_END_NAMESPACE