From a3900a751e18630f05ce6164c351ade6331548b3 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 8 Sep 2022 13:59:25 -0700 Subject: [PATCH] Lock joysticks when removing a controller on the WGI thread --- src/joystick/windows/SDL_windows_gaming_input.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/joystick/windows/SDL_windows_gaming_input.c b/src/joystick/windows/SDL_windows_gaming_input.c index 657650cc6..863b3f504 100644 --- a/src/joystick/windows/SDL_windows_gaming_input.c +++ b/src/joystick/windows/SDL_windows_gaming_input.c @@ -401,6 +401,14 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeRemo HRESULT hr; __x_ABI_CWindows_CGaming_CInput_CIRawGameController *controller = NULL; + SDL_LockJoysticks(); + + /* Can we get delayed calls to InvokeRemoved() after WGI_JoystickQuit()? */ + if (SDL_JoysticksQuitting() || !SDL_JoysticksInitialized()) { + SDL_UnlockJoysticks(); + return S_OK; + } + hr = __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface(e, &IID_IRawGameController, (void **)&controller); if (SUCCEEDED(hr)) { int i; @@ -426,6 +434,9 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeRemo __x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release(controller); } + + SDL_UnlockJoysticks(); + return S_OK; }