Commit 9a8d5215c6f6ce426a94f70ef7cc0dc5c2bd187a

Sam Lantinga 2019-03-27T08:17:05

Handle potentially calling SDL_JoystickUpdate() and SDL_JoystickQuit() at the same time.

diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index a5b3e63..430934c 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -699,9 +699,12 @@ SDL_JoystickQuit(void)
     int i;
 
     /* Make sure we're not getting called in the middle of updating joysticks */
-    SDL_assert(!SDL_updating_joystick);
-
     SDL_LockJoysticks();
+    while (SDL_updating_joystick) {
+        SDL_UnlockJoysticks();
+        SDL_Delay(1);
+        SDL_LockJoysticks();
+    }
 
     /* Stop the event polling */
     while (SDL_joysticks) {
@@ -724,8 +727,9 @@ SDL_JoystickQuit(void)
                         SDL_JoystickAllowBackgroundEventsChanged, NULL);
 
     if (SDL_joystick_lock) {
-        SDL_DestroyMutex(SDL_joystick_lock);
+        SDL_mutex *mutex = SDL_joystick_lock;
         SDL_joystick_lock = NULL;
+        SDL_DestroyMutex(mutex);
     }
 
     SDL_GameControllerQuitMappings();