Android: concurrency issue for Android_SetWindowFullscreen() It accesses data->native_window, which can be changed by onNativeSurfacedChanged(). Currently, Android_SetWindowFullscreen() may access data->native_window after it has been released, and before a new reference is acquired. (can be reproduced by adding some SDL_Delay() in onNativeSurfacedChanged and Android_SetWindowFullscreen() ).
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
diff --git a/src/video/android/SDL_androidwindow.c b/src/video/android/SDL_androidwindow.c
index e34d1ed..57731d3 100644
--- a/src/video/android/SDL_androidwindow.c
+++ b/src/video/android/SDL_androidwindow.c
@@ -116,36 +116,45 @@ Android_SetWindowTitle(_THIS, SDL_Window *window)
void
Android_SetWindowFullscreen(_THIS, SDL_Window *window, SDL_VideoDisplay *display, SDL_bool fullscreen)
{
- /* If the window is being destroyed don't change visible state */
- if (!window->is_destroying) {
- Android_JNI_SetWindowStyle(fullscreen);
- }
+ SDL_LockMutex(Android_ActivityMutex);
- /* Ensure our size matches reality after we've executed the window style change.
- *
- * It is possible that we've set width and height to the full-size display, but on
- * Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
- * still not be the full display size.
- */
- if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
- return;
- }
+ if (window == Android_Window) {
- SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
+ /* If the window is being destroyed don't change visible state */
+ if (!window->is_destroying) {
+ Android_JNI_SetWindowStyle(fullscreen);
+ }
- if (!data || !data->native_window) {
- return;
- }
+ /* Ensure our size matches reality after we've executed the window style change.
+ *
+ * It is possible that we've set width and height to the full-size display, but on
+ * Samsung DeX or Chromebooks or other windowed Android environemtns, our window may
+ * still not be the full display size.
+ */
+ if (!SDL_IsDeXMode() && !SDL_IsChromebook()) {
+ goto endfunction;
+ }
- int old_w = window->w;
- int old_h = window->h;
+ SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
- int new_w = ANativeWindow_getWidth(data->native_window);
- int new_h = ANativeWindow_getHeight(data->native_window);
+ if (!data || !data->native_window) {
+ goto endfunction;
+ }
+
+ int old_w = window->w;
+ int old_h = window->h;
- if (old_w != new_w || old_h != new_h) {
- SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
+ int new_w = ANativeWindow_getWidth(data->native_window);
+ int new_h = ANativeWindow_getHeight(data->native_window);
+
+ if (old_w != new_w || old_h != new_h) {
+ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, new_w, new_h);
+ }
}
+
+endfunction:
+
+ SDL_UnlockMutex(Android_ActivityMutex);
}
void