winks: work around shutdown deadlock
authorOle André Vadla Ravnås <oravnas@cisco.com>
Thu, 1 Jul 2010 13:07:41 +0000 (15:07 +0200)
committerOle André Vadla Ravnås <oravnas@cisco.com>
Thu, 28 Oct 2010 15:08:41 +0000 (17:08 +0200)
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

index bc7de0f..dbd7f03 100644 (file)
@@ -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 */