Windows: Fixed crash if quitting without closing an XInput haptic device.

main
Ryan C. Gordon 2014-03-02 00:02:56 -05:00
parent 754067db7e
commit 1005c93402
1 changed files with 15 additions and 3 deletions

View File

@ -939,20 +939,32 @@ SDL_SYS_HapticQuit(void)
{ {
SDL_hapticlist_item *item; SDL_hapticlist_item *item;
SDL_hapticlist_item *next = NULL; SDL_hapticlist_item *next = NULL;
SDL_Haptic *hapticitem = NULL;
if (loaded_xinput) { extern SDL_Haptic *SDL_haptics;
WIN_UnloadXInputDLL(); for (hapticitem = SDL_haptics; hapticitem; hapticitem = hapticitem->next) {
loaded_xinput = SDL_FALSE; if ((hapticitem->hwdata->bXInputHaptic) && (hapticitem->hwdata->thread)) {
/* we _have_ to stop the thread before we free the XInput DLL! */
hapticitem->hwdata->stopThread = 1;
SDL_WaitThread(hapticitem->hwdata->thread, NULL);
hapticitem->hwdata->thread = NULL;
}
} }
for (item = SDL_hapticlist; item; item = next) { for (item = SDL_hapticlist; item; item = next) {
/* Opened and not closed haptics are leaked, this is on purpose. /* Opened and not closed haptics are leaked, this is on purpose.
* Close your haptic devices after usage. */ * Close your haptic devices after usage. */
/* !!! FIXME: (...is leaking on purpose a good idea?) */
next = item->next; next = item->next;
SDL_free(item->name); SDL_free(item->name);
SDL_free(item); SDL_free(item);
} }
if (loaded_xinput) {
WIN_UnloadXInputDLL();
loaded_xinput = SDL_FALSE;
}
if (dinput != NULL) { if (dinput != NULL) {
IDirectInput8_Release(dinput); IDirectInput8_Release(dinput);
dinput = NULL; dinput = NULL;