Fixed bug 4579 - SDL_android.c s_active not being atomic Isaias Brunet This bug cause a false assert due to multiple threads modifying the same variable without any atomic operation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c
index 2368bb1..fe0af26 100644
--- a/src/core/android/SDL_android.c
+++ b/src/core/android/SDL_android.c
@@ -1156,7 +1156,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetenv)(
Functions called by SDL into Java
*******************************************************************************/
-static int s_active = 0;
+static SDL_atomic_t s_active;
struct LocalReferenceHolder
{
JNIEnv *m_env;
@@ -1181,7 +1181,7 @@ static SDL_bool LocalReferenceHolder_Init(struct LocalReferenceHolder *refholder
SDL_SetError("Failed to allocate enough JVM local references");
return SDL_FALSE;
}
- ++s_active;
+ SDL_AtomicIncRef(&s_active);
refholder->m_env = env;
return SDL_TRUE;
}
@@ -1194,10 +1194,15 @@ static void LocalReferenceHolder_Cleanup(struct LocalReferenceHolder *refholder)
if (refholder->m_env) {
JNIEnv *env = refholder->m_env;
(*env)->PopLocalFrame(env, NULL);
- --s_active;
+ SDL_AtomicDecRef(&s_active);
}
}
+static SDL_bool LocalReferenceHolder_IsActive(void)
+{
+ return (SDL_AtomicGet(&s_active) > 0);
+}
+
ANativeWindow* Android_JNI_GetNativeWindow(void)
{
ANativeWindow *anw = NULL;
@@ -1601,7 +1606,7 @@ static SDL_bool Android_JNI_ExceptionOccurred(SDL_bool silent)
jthrowable exception;
/* Detect mismatch LocalReferenceHolder_Init/Cleanup */
- SDL_assert((s_active > 0));
+ SDL_assert(LocalReferenceHolder_IsActive());
exception = (*env)->ExceptionOccurred(env);
if (exception != NULL) {