diff options
author | Juha Vuolle <juha.vuolle@qt.io> | 2023-10-12 11:15:25 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-10-19 08:15:05 +0000 |
commit | b8a42e0d46350f4800d37f1d7b4b1b67e9287162 (patch) | |
tree | 4e766e88942be4d464b71aaa93be8a33bef1f468 | |
parent | 06f5bac17ee854108e9c817166503f21d22bf7bf (diff) |
Add thread protection to Android static string cache
The string cache is accessed in the Qt Android main activity
thread, as wells as in JNI callbacks which execute in arbitrary
Java threads.
For clarity: the usage in code looks like this:
"valueForStaticField<QtJniTypes::XYZ"
There is a small chance that the cache is accessed concurrently.
Pick-to: 6.5
Change-Id: I34c26e22347f65614b18a000b5d61f0737e3b49e
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
(cherry picked from commit 62045a447c688935091ce6b9fb0cc8a0ce03343c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/bluetooth/android/jni_android.cpp | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index a255c540..3dc016f7 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -18,6 +18,7 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) typedef QHash<QByteArray, QJniObject> JCachedStringFields; Q_GLOBAL_STATIC(JCachedStringFields, cachedStringFields) +Q_GLOBAL_STATIC(QMutex, stringCacheMutex); /* * This function operates on the assumption that each @@ -25,6 +26,7 @@ Q_GLOBAL_STATIC(JCachedStringFields, cachedStringFields) */ QJniObject valueFromStaticFieldCache(const char *key, const char *className, const char *fieldName) { + QMutexLocker lock(stringCacheMutex()); JCachedStringFields::iterator it = cachedStringFields()->find(key); if (it == cachedStringFields()->end()) { QJniEnvironment env; |