From cc1c6ee9e3bdc4c2eb5fc73f85e00c6b15afc1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= Date: Thu, 1 Jul 2010 15:07:41 +0200 Subject: [PATCH] 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. --- sys/winks/gstksvideodevice.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sys/winks/gstksvideodevice.c b/sys/winks/gstksvideodevice.c index bc7de0fac3..dbd7f035b3 100644 --- a/sys/winks/gstksvideodevice.c +++ b/sys/winks/gstksvideodevice.c @@ -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 */