Skip to content

Commit

Permalink
SDL
Browse files Browse the repository at this point in the history
- fix crash on OSX when removing a device. If the remove happened due to the CFRunLoopRunInMode call in SDL_SYS_JoystickDetect then we would delete the device right away, before SDL_SYS_JoystickUpdate could clean it up. So move the CFRunLoopRunInMode to after the cleanup logic, preventing this case. This does mean that adds and removes of joysticks now take 1 extra frame to show up.
  • Loading branch information
alfred-valve committed Mar 2, 2015
1 parent d6c4296 commit d34d608
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/joystick/darwin/SDL_sysjoystick.c
Expand Up @@ -560,10 +560,6 @@ SDL_SYS_NumJoysticks()
void
SDL_SYS_JoystickDetect()
{
while (CFRunLoopRunInMode(SDL_JOYSTICK_RUNLOOP_MODE,0,TRUE) == kCFRunLoopRunHandledSource) {
/* no-op. Pending callbacks will fire in CFRunLoopRunInMode(). */
}

if (s_bDeviceAdded || s_bDeviceRemoved) {
recDevice *device = gpDeviceList;
s_bDeviceAdded = SDL_FALSE;
Expand Down Expand Up @@ -613,6 +609,12 @@ SDL_SYS_JoystickDetect()
}
}
}

// run this after the checks above so we don't set device->removed and delete the device before
// SDL_SYS_JoystickUpdate can run to clean up the SDL_Joystick object that owns this device
while (CFRunLoopRunInMode(SDL_JOYSTICK_RUNLOOP_MODE,0,TRUE) == kCFRunLoopRunHandledSource) {
/* no-op. Pending callbacks will fire in CFRunLoopRunInMode(). */
}
}

/* Function to get the device-dependent name of a joystick */
Expand Down

0 comments on commit d34d608

Please sign in to comment.