[PATCH v2 4/5] dinput: Call device read_callback while holding the internal CS.
Rémi Bernon
rbernon at codeweavers.com
Fri Oct 8 08:36:02 CDT 2021
And remove the device from the list of acquired devices if the callback
indicates a read error.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/dinput_main.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 1cd6d390430..9c0e3875c00 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1289,11 +1289,11 @@ static LRESULT CALLBACK callwndproc_proc( int code, WPARAM wparam, LPARAM lparam
static DWORD WINAPI hook_thread_proc(void *param)
{
static HHOOK kbd_hook, mouse_hook;
- IDirectInputDeviceImpl *impl;
- IDirectInputDevice8W *iface;
+ IDirectInputDeviceImpl *impl, *next;
SIZE_T events_count = 0;
HANDLE finished_event;
HANDLE events[128];
+ HRESULT hr;
DWORD ret;
MSG msg;
@@ -1310,24 +1310,17 @@ static DWORD WINAPI hook_thread_proc(void *param)
if (ret < events_count)
{
- iface = NULL;
EnterCriticalSection( &dinput_hook_crit );
- LIST_FOR_EACH_ENTRY( impl, &acquired_device_list, IDirectInputDeviceImpl, entry )
+ LIST_FOR_EACH_ENTRY_SAFE( impl, next, &acquired_device_list, IDirectInputDeviceImpl, entry )
{
if (impl->read_event == events[ret])
{
- iface = &impl->IDirectInputDevice8W_iface;
- IDirectInputDevice8_AddRef( iface );
+ hr = impl->read_callback( &impl->IDirectInputDevice8W_iface );
+ if (FAILED(hr)) list_remove( &impl->entry );
break;
}
}
LeaveCriticalSection( &dinput_hook_crit );
-
- if (iface)
- {
- impl->read_callback( iface );
- IDirectInputDevice8_Release( iface );
- }
}
while (PeekMessageW( &msg, 0, 0, 0, PM_REMOVE ))
--
2.33.0
More information about the wine-devel
mailing list