Windows: Improve poll abstraction
authorChris Dickens <christopher.a.dickens@gmail.com>
Wed, 22 Jan 2020 19:06:29 +0000 (11:06 -0800)
committerChris Dickens <christopher.a.dickens@gmail.com>
Wed, 22 Jan 2020 19:13:20 +0000 (11:13 -0800)
commitdf61c0c3a3de070c7f7a714ef8758a248bf97263
tree7251a4265a53da2e698cd4ce2a30b68460c26265
parent13a2748b0796ad55ae0bfbfb6f2f11d552145331
Windows: Improve poll abstraction

Commit 395e5a8a6f ("windows: remove total fds (256) limitations") and
commit c730a8410c ("windows: workaround WaitForMultipleObjects max 64
events limitation.") lifted some hard-coded limits in the number of
HANDLEs that can be used within the library. This change improves on
these changes to make them more efficient.

A bitmap has been added to provide an efficient lookup mechanism for
located unused file descriptor indices. This avoids the O(n) lookup time
for traversing the entire fd_table. This bitmap is dynamically resized
along with the fd_table.

The incremental size of the fd_table has been reduced from 256 to 64.
The vast majority of applications won't need to use 256 HANDLEs, so we
can optimize memory usage a bit.

Commit fb864b7cde ("fix windows crash when multi-thread do sync
transfer") added usbi_inc_fds_ref() and usbi_dec_fds_ref() functions to
work around a reference count issue. Remove these functions and change
the implementation of usbi_poll() to take a reference to each file
descriptor upon entry and drop the references when returning. If the
application experiences any kind of crash, there is a problem elsewhere.

Finally, make the thread executing usbi_poll() take part in the waiting.
The original implementation had this thread simply waiting on a single
event while separate threads waited on the HANDLEs. Now this thread will
wait on MAXIMUM_WAIT_OBJECTS - 1 HANDLEs, thereby reducing the number of
threads that are created. Additionally there is now only a single event
object that is shared amongst all waiting threads.

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