From a46af76b076ad570690bf82d8f9c96ce0bc31c4b Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 5 Apr 2019 08:15:01 -0700 Subject: [PATCH] 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. --- src/core/android/SDL_android.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 2368bb1f6..fe0af2675 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) {