mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
winks: work around shutdown deadlock
GetOverlappedResult() might never return with some drivers. Time out after 1000 ms. We cannot really fix this without either: 1) Controlling the streaming thread so we can do CancelIo() from that thread. 2) Switch to using IO completion ports.
This commit is contained in:
parent
a7a04fe601
commit
cc1c6ee9e3
1 changed files with 7 additions and 6 deletions
|
@ -254,15 +254,16 @@ gst_ks_video_device_clear_buffers (GstKsVideoDevice * self)
|
|||
if (priv->requests == NULL)
|
||||
return;
|
||||
|
||||
/* Cancel pending requests */
|
||||
CancelIo (priv->pin_handle);
|
||||
|
||||
/* Join any pending requests */
|
||||
for (i = 0; i < priv->num_requests; i++) {
|
||||
ReadRequest *req = &g_array_index (priv->requests, ReadRequest, i);
|
||||
DWORD bytes_returned;
|
||||
HANDLE ev = g_array_index (priv->request_events, HANDLE, i);
|
||||
DWORD n;
|
||||
|
||||
GetOverlappedResult (priv->pin_handle, &req->overlapped, &bytes_returned,
|
||||
TRUE);
|
||||
if (!GetOverlappedResult (priv->pin_handle, &req->overlapped, &n, FALSE)) {
|
||||
if (WaitForSingleObject (ev, 1000) == WAIT_OBJECT_0)
|
||||
GetOverlappedResult (priv->pin_handle, &req->overlapped, &n, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
|
|
Loading…
Reference in a new issue