Android: use Mutex instead of Semphore for bug 4142

This commit is contained in:
Sylvain Becker
2019-01-03 20:18:29 +01:00
parent 23478642bd
commit 2e19343df6
5 changed files with 33 additions and 31 deletions

View File

@@ -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)(