Fixed bug 4142 - Concurrency issues in Android backend

Use a semaphore 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. )
This commit is contained in:
Sylvain Becker
2019-01-03 14:18:06 +01:00
parent d11f7615fa
commit cc8f1136b6
5 changed files with 69 additions and 14 deletions

View File

@@ -41,12 +41,14 @@ Android_CreateWindow(_THIS, SDL_Window * window)
{
SDL_WindowData *data;
int retval = 0;
SDL_SemWait(Android_ActivitySem);
if (Android_Window) {
retval = SDL_SetError("Android only supports one window");
goto endfunction;
}
Android_PauseSem = SDL_CreateSemaphore(0);
Android_ResumeSem = SDL_CreateSemaphore(0);
@@ -67,15 +69,15 @@ Android_CreateWindow(_THIS, SDL_Window * window)
/* One window, it always has focus */
SDL_SetMouseFocus(window);
SDL_SetKeyboardFocus(window);
data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
if (!data) {
retval = SDL_OutOfMemory();
goto endfunction;
}
data->native_window = Android_JNI_GetNativeWindow();
if (!data->native_window) {
SDL_free(data);
retval = SDL_SetError("Could not fetch native window");
@@ -99,7 +101,9 @@ Android_CreateWindow(_THIS, SDL_Window * window)
Android_Window = window;
endfunction:
SDL_SemPost(Android_ActivitySem);
return retval;
}
@@ -146,14 +150,16 @@ Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display
void
Android_DestroyWindow(_THIS, SDL_Window *window)
{
{
SDL_SemWait(Android_ActivitySem);
if (window == Android_Window) {
Android_Window = NULL;
if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem);
if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem);
Android_PauseSem = NULL;
Android_ResumeSem = NULL;
if (window->driverdata) {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data->egl_surface != EGL_NO_SURFACE) {
@@ -166,6 +172,8 @@ Android_DestroyWindow(_THIS, SDL_Window *window)
window->driverdata = NULL;
}
}
SDL_SemPost(Android_ActivitySem);
}
SDL_bool