diff --git a/src/joystick/hidapi/SDL_hidapi_gamecube.c b/src/joystick/hidapi/SDL_hidapi_gamecube.c index b600622c2..6780a0fdd 100644 --- a/src/joystick/hidapi/SDL_hidapi_gamecube.c +++ b/src/joystick/hidapi/SDL_hidapi_gamecube.c @@ -193,14 +193,19 @@ HIDAPI_DriverGameCube_InitDevice(SDL_HIDAPI_Device *device) return SDL_TRUE; error: - if (device->dev) { - hid_close(device->dev); - device->dev = NULL; - } - if (device->context) { - SDL_free(device->context); - device->context = NULL; + SDL_LockMutex(device->dev_lock); + { + if (device->dev) { + hid_close(device->dev); + device->dev = NULL; + } + if (device->context) { + SDL_free(device->context); + device->context = NULL; + } } + SDL_UnlockMutex(device->dev_lock); + return SDL_FALSE; } @@ -404,14 +409,18 @@ HIDAPI_DriverGameCube_FreeDevice(SDL_HIDAPI_Device *device) { 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_GameControllerButtonReportingHintChanged, ctx); - SDL_free(device->context); - device->context = NULL; + SDL_LockMutex(device->dev_lock); + { + 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 = diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c index b0133f6ba..eda3ebade 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -890,11 +890,15 @@ HIDAPI_DriverPS4_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, SDL_PS4RumbleHintChanged, ctx); - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + hid_close(device->dev); + device->dev = NULL; - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c index 38d1c84eb..f6b658f1c 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps5.c +++ b/src/joystick/hidapi/SDL_hidapi_ps5.c @@ -1045,11 +1045,15 @@ HIDAPI_DriverPS5_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick SDL_DelHintCallback(SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED, SDL_PS5PlayerLEDHintChanged, ctx); - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + hid_close(device->dev); + device->dev = NULL; - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapi_steam.c b/src/joystick/hidapi/SDL_hidapi_steam.c index 6340078b2..74042400e 100644 --- a/src/joystick/hidapi/SDL_hidapi_steam.c +++ b/src/joystick/hidapi/SDL_hidapi_steam.c @@ -1016,14 +1016,18 @@ HIDAPI_DriverSteam_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystic return SDL_TRUE; error: - if (device->dev) { - hid_close(device->dev); - device->dev = NULL; - } - if (device->context) { - SDL_free(device->context); - device->context = NULL; + SDL_LockMutex(device->dev_lock); + { + if (device->dev) { + hid_close(device->dev); + device->dev = NULL; + } + if (device->context) { + SDL_free(device->context); + device->context = NULL; + } } + SDL_UnlockMutex(device->dev_lock); return SDL_FALSE; } @@ -1170,12 +1174,17 @@ HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) static void HIDAPI_DriverSteam_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) { - CloseSteamController(device->dev); - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + CloseSteamController(device->dev); - SDL_free(device->context); - device->context = NULL; + hid_close(device->dev); + device->dev = NULL; + + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index e105ef5ab..186ff4b96 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -827,14 +827,18 @@ HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joysti return SDL_TRUE; error: - if (device->dev) { - hid_close(device->dev); - device->dev = NULL; - } - if (device->context) { - SDL_free(device->context); - device->context = NULL; + SDL_LockMutex(device->dev_lock); + { + if (device->dev) { + hid_close(device->dev); + device->dev = NULL; + } + if (device->context) { + SDL_free(device->context); + device->context = NULL; + } } + SDL_UnlockMutex(device->dev_lock); 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_GameControllerButtonReportingHintChanged, ctx); - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + hid_close(device->dev); + device->dev = NULL; - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapi_xbox360.c b/src/joystick/hidapi/SDL_hidapi_xbox360.c index 51e7e7a99..6702937a3 100644 --- a/src/joystick/hidapi/SDL_hidapi_xbox360.c +++ b/src/joystick/hidapi/SDL_hidapi_xbox360.c @@ -324,13 +324,17 @@ HIDAPI_DriverXbox360_UpdateDevice(SDL_HIDAPI_Device *device) static void HIDAPI_DriverXbox360_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) { - if (device->dev) { - hid_close(device->dev); - device->dev = NULL; - } + SDL_LockMutex(device->dev_lock); + { + if (device->dev) { + hid_close(device->dev); + device->dev = NULL; + } - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapi_xbox360w.c b/src/joystick/hidapi/SDL_hidapi_xbox360w.c index 7438ea583..e6bc21050 100644 --- a/src/joystick/hidapi/SDL_hidapi_xbox360w.c +++ b/src/joystick/hidapi/SDL_hidapi_xbox360w.c @@ -312,11 +312,15 @@ HIDAPI_DriverXbox360W_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joy static void HIDAPI_DriverXbox360W_FreeDevice(SDL_HIDAPI_Device *device) { - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + hid_close(device->dev); + device->dev = NULL; - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360W = diff --git a/src/joystick/hidapi/SDL_hidapi_xboxone.c b/src/joystick/hidapi/SDL_hidapi_xboxone.c index 0b467dfd8..462df5cbb 100644 --- a/src/joystick/hidapi/SDL_hidapi_xboxone.c +++ b/src/joystick/hidapi/SDL_hidapi_xboxone.c @@ -1058,11 +1058,15 @@ HIDAPI_DriverXboxOne_UpdateDevice(SDL_HIDAPI_Device *device) static void HIDAPI_DriverXboxOne_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick) { - hid_close(device->dev); - device->dev = NULL; + SDL_LockMutex(device->dev_lock); + { + hid_close(device->dev); + device->dev = NULL; - SDL_free(device->context); - device->context = NULL; + SDL_free(device->context); + device->context = NULL; + } + SDL_UnlockMutex(device->dev_lock); } static void diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c index f3d5f3948..121913f43 100644 --- a/src/joystick/hidapi/SDL_hidapijoystick.c +++ b/src/joystick/hidapi/SDL_hidapijoystick.c @@ -1221,9 +1221,7 @@ HIDAPI_JoystickClose(SDL_Joystick * joystick) SDL_LockMutex(device->dev_lock); } - SDL_LockMutex(device->dev_lock); device->driver->CloseJoystick(device, joystick); - SDL_UnlockMutex(device->dev_lock); SDL_free(joystick->hwdata); joystick->hwdata = NULL;