Always lock the HIDAPI device when closing, in case rumble is pending

This commit is contained in:
Sam Lantinga 2021-01-14 23:49:20 -08:00
parent 907b8eebc3
commit e2f46ed8ef
9 changed files with 103 additions and 59 deletions

View File

@ -193,14 +193,19 @@ HIDAPI_DriverGameCube_InitDevice(SDL_HIDAPI_Device *device)
return SDL_TRUE; return SDL_TRUE;
error: error:
if (device->dev) { SDL_LockMutex(device->dev_lock);
hid_close(device->dev); {
device->dev = NULL; if (device->dev) {
} hid_close(device->dev);
if (device->context) { device->dev = NULL;
SDL_free(device->context); }
device->context = NULL; if (device->context) {
SDL_free(device->context);
device->context = NULL;
}
} }
SDL_UnlockMutex(device->dev_lock);
return SDL_FALSE; return SDL_FALSE;
} }
@ -404,14 +409,18 @@ HIDAPI_DriverGameCube_FreeDevice(SDL_HIDAPI_Device *device)
{ {
SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)device->context; SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)device->context;
hid_close(device->dev);
device->dev = NULL;
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS,
SDL_GameControllerButtonReportingHintChanged, ctx); SDL_GameControllerButtonReportingHintChanged, ctx);
SDL_free(device->context); SDL_LockMutex(device->dev_lock);
device->context = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context);
device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube = SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube =

View File

@ -890,11 +890,15 @@ HIDAPI_DriverPS4_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick
SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE,
SDL_PS4RumbleHintChanged, ctx); SDL_PS4RumbleHintChanged, ctx);
hid_close(device->dev); SDL_LockMutex(device->dev_lock);
device->dev = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -1045,11 +1045,15 @@ HIDAPI_DriverPS5_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick
SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED,
SDL_PS5PlayerLEDHintChanged, ctx); SDL_PS5PlayerLEDHintChanged, ctx);
hid_close(device->dev); SDL_LockMutex(device->dev_lock);
device->dev = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -1016,14 +1016,18 @@ HIDAPI_DriverSteam_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystic
return SDL_TRUE; return SDL_TRUE;
error: error:
if (device->dev) { SDL_LockMutex(device->dev_lock);
hid_close(device->dev); {
device->dev = NULL; if (device->dev) {
} hid_close(device->dev);
if (device->context) { device->dev = NULL;
SDL_free(device->context); }
device->context = NULL; if (device->context) {
SDL_free(device->context);
device->context = NULL;
}
} }
SDL_UnlockMutex(device->dev_lock);
return SDL_FALSE; return SDL_FALSE;
} }
@ -1170,12 +1174,17 @@ HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device)
static void static void
HIDAPI_DriverSteam_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) HIDAPI_DriverSteam_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{ {
CloseSteamController(device->dev); SDL_LockMutex(device->dev_lock);
hid_close(device->dev); {
device->dev = NULL; CloseSteamController(device->dev);
SDL_free(device->context); hid_close(device->dev);
device->context = NULL; device->dev = NULL;
SDL_free(device->context);
device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -827,14 +827,18 @@ HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joysti
return SDL_TRUE; return SDL_TRUE;
error: error:
if (device->dev) { SDL_LockMutex(device->dev_lock);
hid_close(device->dev); {
device->dev = NULL; if (device->dev) {
} hid_close(device->dev);
if (device->context) { device->dev = NULL;
SDL_free(device->context); }
device->context = NULL; if (device->context) {
SDL_free(device->context);
device->context = NULL;
}
} }
SDL_UnlockMutex(device->dev_lock);
return SDL_FALSE; return SDL_FALSE;
} }
@ -1353,11 +1357,15 @@ HIDAPI_DriverSwitch_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joyst
SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS,
SDL_GameControllerButtonReportingHintChanged, ctx); SDL_GameControllerButtonReportingHintChanged, ctx);
hid_close(device->dev); SDL_LockMutex(device->dev_lock);
device->dev = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -324,13 +324,17 @@ HIDAPI_DriverXbox360_UpdateDevice(SDL_HIDAPI_Device *device)
static void static void
HIDAPI_DriverXbox360_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) HIDAPI_DriverXbox360_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{ {
if (device->dev) { SDL_LockMutex(device->dev_lock);
hid_close(device->dev); {
device->dev = NULL; if (device->dev) {
} hid_close(device->dev);
device->dev = NULL;
}
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -312,11 +312,15 @@ HIDAPI_DriverXbox360W_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joy
static void static void
HIDAPI_DriverXbox360W_FreeDevice(SDL_HIDAPI_Device *device) HIDAPI_DriverXbox360W_FreeDevice(SDL_HIDAPI_Device *device)
{ {
hid_close(device->dev); SDL_LockMutex(device->dev_lock);
device->dev = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360W = SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360W =

View File

@ -1058,11 +1058,15 @@ HIDAPI_DriverXboxOne_UpdateDevice(SDL_HIDAPI_Device *device)
static void static void
HIDAPI_DriverXboxOne_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) HIDAPI_DriverXboxOne_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{ {
hid_close(device->dev); SDL_LockMutex(device->dev_lock);
device->dev = NULL; {
hid_close(device->dev);
device->dev = NULL;
SDL_free(device->context); SDL_free(device->context);
device->context = NULL; device->context = NULL;
}
SDL_UnlockMutex(device->dev_lock);
} }
static void static void

View File

@ -1221,9 +1221,7 @@ HIDAPI_JoystickClose(SDL_Joystick * joystick)
SDL_LockMutex(device->dev_lock); SDL_LockMutex(device->dev_lock);
} }
SDL_LockMutex(device->dev_lock);
device->driver->CloseJoystick(device, joystick); device->driver->CloseJoystick(device, joystick);
SDL_UnlockMutex(device->dev_lock);
SDL_free(joystick->hwdata); SDL_free(joystick->hwdata);
joystick->hwdata = NULL; joystick->hwdata = NULL;