Browse Source

Add joystick locking for controller notifications on iOS/tvOS

Fixes https://github.com/libsdl-org/SDL/issues/6288
Sam Lantinga 2 years ago
parent
commit
7becbd7d42
1 changed files with 6 additions and 3 deletions
  1. 6 3
      src/joystick/iphoneos/SDL_mfijoystick.m

+ 6 - 3
src/joystick/iphoneos/SDL_mfijoystick.m

@@ -678,7 +678,9 @@ IOS_JoystickInit(void)
                                                queue:nil
                                           usingBlock:^(NSNotification *note) {
                                               GCController *controller = note.object;
+                                              SDL_LockJoysticks();
                                               IOS_AddJoystickDevice(controller, SDL_FALSE);
+                                              SDL_UnlockJoysticks();
                                           }];
 
         disconnectObserver = [center addObserverForName:GCControllerDidDisconnectNotification
@@ -686,14 +688,15 @@ IOS_JoystickInit(void)
                                                   queue:nil
                                              usingBlock:^(NSNotification *note) {
                                                  GCController *controller = note.object;
-                                                 SDL_JoystickDeviceItem *device = deviceList;
-                                                 while (device != NULL) {
+                                                 SDL_JoystickDeviceItem *device;
+                                                 SDL_LockJoysticks();
+                                                 for (device = deviceList; device != NULL; device = device->next) {
                                                      if (device->controller == controller) {
                                                          IOS_RemoveJoystickDevice(device);
                                                          break;
                                                      }
-                                                     device = device->next;
                                                  }
+                                                 SDL_UnlockJoysticks();
                                              }];
 #endif /* SDL_JOYSTICK_MFI */
     }