From 2e19343df6bfaa5156c57fe17a631466c2eb5a1e Mon Sep 17 00:00:00 2001 From: Sylvain Becker Date: Thu, 3 Jan 2019 20:18:29 +0100 Subject: [PATCH] Android: use Mutex instead of Semphore for bug 4142 --- src/core/android/SDL_android.c | 38 +++++++++++++-------------- src/video/android/SDL_androidevents.c | 12 ++++----- src/video/android/SDL_androidvideo.c | 3 ++- src/video/android/SDL_androidvideo.h | 3 ++- src/video/android/SDL_androidwindow.c | 8 +++--- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index acfb4c4d9461a..fb33c1fb16650 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -322,15 +322,15 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *mEnv, jclass c { __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeSetupJNI()"); - /* Use a semaphore to prevent concurrency issues between Java Activity and Native thread code, when using 'Android_Window'. + /* Use a mutex to prevent concurrency issues between Java Activity and Native thread code, when using 'Android_Window'. * (Eg. Java sending Touch events, while native code is destroying the main SDL_Window. ) */ - if (Android_ActivitySem == NULL) { - Android_ActivitySem = SDL_CreateSemaphore(1); /* Could this be created twice if onCreate() is called a second time ? */ + if (Android_ActivityMutex == NULL) { + Android_ActivityMutex = SDL_CreateMutex(); /* Could this be created twice if onCreate() is called a second time ? */ } - if (Android_ActivitySem == NULL) { - __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "failed to create Android_ActivitySem semaphore"); + if (Android_ActivityMutex == NULL) { + __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "failed to create Android_ActivityMutex mutex"); } Android_JNI_SetupThread(); @@ -569,11 +569,11 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)( jint surfaceWidth, jint surfaceHeight, jint deviceWidth, jint deviceHeight, jint format, jfloat rate) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); Android_SetScreenResolution(Android_Window, surfaceWidth, surfaceHeight, deviceWidth, deviceHeight, format, rate); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeOrientationChanged)( @@ -665,7 +665,7 @@ JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)( /* Surface Created */ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, jclass jcls) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); if (Android_Window && Android_Window->driverdata) { @@ -684,13 +684,13 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(JNIEnv *env, j /* GL Context handling is done in the event loop because this function is run from the Java thread */ } - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } /* Surface Destroyed */ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(JNIEnv *env, jclass jcls) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); if (Android_Window && Android_Window->driverdata) { @@ -711,7 +711,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(JNIEnv *env, /* GL Context handling is done in the event loop because this function is run from the Java thread */ } - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } /* Keydown */ @@ -745,11 +745,11 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)( jint touch_device_id_in, jint pointer_finger_id_in, jint action, jfloat x, jfloat y, jfloat p) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); Android_OnTouch(Android_Window, touch_device_id_in, pointer_finger_id_in, action, x, y, p); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } /* Mouse */ @@ -757,11 +757,11 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)( JNIEnv *env, jclass jcls, jint button, jint action, jfloat x, jfloat y, jboolean relative) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); Android_OnMouse(Android_Window, button, action, x, y, relative); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } /* Accelerometer */ @@ -809,7 +809,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)( JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)( JNIEnv *env, jclass cls) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativePause()"); @@ -824,14 +824,14 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)( if (!SDL_SemValue(Android_PauseSem)) SDL_SemPost(Android_PauseSem); } - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } /* Resume */ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)( JNIEnv *env, jclass cls) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativeResume()"); @@ -854,7 +854,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)( if (!SDL_SemValue(Android_ResumeSem)) SDL_SemPost(Android_ResumeSem); } - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)( diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c index 0d3c968416795..c95750c6ef250 100644 --- a/src/video/android/SDL_androidevents.c +++ b/src/video/android/SDL_androidevents.c @@ -80,9 +80,9 @@ Android_PumpEvents(_THIS) #if SDL_ANDROID_BLOCK_ON_PAUSE if (isPaused && !isPausing) { /* Make sure this is the last thing we do before pausing */ - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); android_egl_context_backup(Android_Window); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); ANDROIDAUDIO_PauseDevices(); if (SDL_SemWait(Android_ResumeSem) == 0) { @@ -94,9 +94,9 @@ Android_PumpEvents(_THIS) ANDROIDAUDIO_ResumeDevices(); /* Restore the GL Context from here, as this operation is thread dependent */ if (!SDL_HasEvent(SDL_QUIT)) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); android_egl_context_restore(Android_Window); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } } } @@ -115,9 +115,9 @@ Android_PumpEvents(_THIS) } #else if (SDL_SemTryWait(Android_PauseSem) == 0) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); android_egl_context_backup(Android_Window); - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); ANDROIDAUDIO_PauseDevices(); isPaused = 1; diff --git a/src/video/android/SDL_androidvideo.c b/src/video/android/SDL_androidvideo.c index 314930fe8f940..da9fe5816c1e9 100644 --- a/src/video/android/SDL_androidvideo.c +++ b/src/video/android/SDL_androidvideo.c @@ -66,7 +66,8 @@ int Android_DeviceHeight = 0; static Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN; static int Android_ScreenRate = 0; -SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL, *Android_ActivitySem = NULL; +SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL; +SDL_mutex *Android_ActivityMutex = NULL; static int Android_Available(void) diff --git a/src/video/android/SDL_androidvideo.h b/src/video/android/SDL_androidvideo.h index 0ff179b6587e4..b54772968145b 100644 --- a/src/video/android/SDL_androidvideo.h +++ b/src/video/android/SDL_androidvideo.h @@ -41,7 +41,8 @@ extern int Android_SurfaceWidth; extern int Android_SurfaceHeight; extern int Android_DeviceWidth; extern int Android_DeviceHeight; -extern SDL_sem *Android_PauseSem, *Android_ResumeSem, *Android_ActivitySem; +extern SDL_sem *Android_PauseSem, *Android_ResumeSem; +extern SDL_mutex *Android_ActivityMutex; #endif /* SDL_androidvideo_h_ */ diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c index e4a988994c551..f74f1a9e56b07 100644 --- a/src/video/android/SDL_androidwindow.c +++ b/src/video/android/SDL_androidwindow.c @@ -42,7 +42,7 @@ Android_CreateWindow(_THIS, SDL_Window * window) SDL_WindowData *data; int retval = 0; - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); if (Android_Window) { retval = SDL_SetError("Android only supports one window"); @@ -102,7 +102,7 @@ Android_CreateWindow(_THIS, SDL_Window * window) endfunction: - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); return retval; } @@ -151,7 +151,7 @@ Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display void Android_DestroyWindow(_THIS, SDL_Window *window) { - SDL_SemWait(Android_ActivitySem); + SDL_LockMutex(Android_ActivityMutex); if (window == Android_Window) { Android_Window = NULL; @@ -173,7 +173,7 @@ Android_DestroyWindow(_THIS, SDL_Window *window) } } - SDL_SemPost(Android_ActivitySem); + SDL_UnlockMutex(Android_ActivityMutex); } SDL_bool