Windows: Fix race condition between submit and handle events
authorPatrick Stewart <patrick@rfcreations.com>
Wed, 31 Jan 2018 15:18:06 +0000 (15:18 +0000)
committerChris Dickens <christopher.a.dickens@gmail.com>
Sat, 24 Feb 2018 07:55:52 +0000 (23:55 -0800)
Check the event object for completion in poll instead of using
HasOverlappedIoCompleted. When we submit a transfer on Windows the fd is
added to the poll list before the read/write begins, so
HasOverlappedIoCompleted can be called before overlapped.Internal is set
to ERROR_IO_PENDING if events are being being handled concurrently, so
the fd will be marked as completed before it has actually started.

[dickens] Instead of replacing HasOverlappedIoCompleted, supplement it
so that it can provide a fast path to avoid WaitForSingleObject() in
the general case

Closes #386, Closes #387

Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
libusb/os/poll_windows.c
libusb/version_nano.h

index 654965b..bb3d178 100644 (file)
@@ -149,8 +149,8 @@ static int check_pollfds(struct pollfd *fds, unsigned int nfds,
                        continue;
                }
 
-               // The following macro only works if overlapped I/O was reported pending
-               if (HasOverlappedIoCompleted(&fd->overlapped)) {
+               if (HasOverlappedIoCompleted(&fd->overlapped)
+                               && (WaitForSingleObject(fd->overlapped.hEvent, 0) == WAIT_OBJECT_0)) {
                        fds[n].revents = fds[n].events;
                        nready++;
                } else if (wait_handles != NULL) {
index e40a0dd..eb2eab4 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11298
+#define LIBUSB_NANO 11299