libusb 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -2
- data/Gemfile +0 -8
- data/History.md +5 -0
- data/README.md +6 -6
- data/Rakefile +9 -9
- data/ext/extconf.rb +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/AUTHORS +10 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/COPYING +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/ChangeLog +17 -9
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/INSTALL +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Makefile.am +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Makefile.in +153 -178
- data/ext/libusb-1.0.18/NEWS +2 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/PORTING +13 -13
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/README +9 -11
- data/ext/libusb-1.0.18/TODO +2 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Xcode/common.xcconfig +3 -3
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Xcode/config.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Xcode/debug.xcconfig +2 -2
- data/ext/{libusbx-1.0.17/Xcode/libusbx.xcconfig → libusb-1.0.18/Xcode/libusb.xcconfig} +2 -2
- data/ext/libusb-1.0.18/Xcode/libusb.xcodeproj/project.pbxproj +1 -0
- data/ext/{libusbx-1.0.17/Xcode/libusbx_debug.xcconfig → libusb-1.0.18/Xcode/libusb_debug.xcconfig} +3 -3
- data/ext/{libusbx-1.0.17/Xcode/libusbx_release.xcconfig → libusb-1.0.18/Xcode/libusb_release.xcconfig} +3 -3
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/Xcode/release.xcconfig +2 -2
- data/ext/{libusbx-1.0.17/m4/libtool.m4 → libusb-1.0.18/aclocal.m4} +1731 -27
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/README +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/config.h +1 -10
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/jni/Android.mk +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/jni/Application.mk +6 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/jni/examples.mk +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/jni/libusb.mk +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/android/jni/tests.mk +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/compile +3 -7
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/config.guess +19 -24
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/config.h.in +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/config.sub +30 -47
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/configure +118 -172
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/configure.ac +24 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/depcomp +186 -268
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/doc/Makefile.am +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/doc/Makefile.in +36 -73
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/doc/doxygen.cfg.in +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/Makefile.am +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/Makefile.in +68 -132
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/dpfp.c +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/dpfp_threaded.c +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/ezusb.c +57 -26
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/ezusb.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/fxload.c +3 -3
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/getopt/getopt.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/getopt/getopt.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/getopt/getopt1.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/hotplugtest.c +9 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/listdevs.c +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/sam3u_benchmark.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/examples/xusb.c +20 -4
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/install-sh +7 -7
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb-1.0.pc.in +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/Makefile.am +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/Makefile.in +94 -134
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/core.c +95 -74
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/descriptor.c +2 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/hotplug.c +3 -3
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/hotplug.h +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/io.c +127 -116
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/libusb-1.0.def +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/libusb-1.0.rc +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/libusb.h +42 -39
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/libusbi.h +20 -11
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/darwin_usb.c +20 -16
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/darwin_usb.h +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/linux_netlink.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/linux_udev.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/linux_usbfs.c +15 -12
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/linux_usbfs.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/netbsd_usb.c +2 -4
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/openbsd_usb.c +5 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/poll_posix.c +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/poll_posix.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/poll_windows.c +2 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/poll_windows.h +0 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/threads_posix.c +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/threads_posix.h +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/threads_windows.c +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/threads_windows.h +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/wince_usb.c +1 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/wince_usb.h +2 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/windows_common.h +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/windows_usb.c +53 -33
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/os/windows_usb.h +6 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/strerror.c +2 -2
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/sync.c +6 -6
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/libusb/version.h +1 -1
- data/ext/libusb-1.0.18/libusb/version_nano.h +1 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/ltmain.sh +3 -3
- data/ext/libusb-1.0.18/missing +331 -0
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/tests/Makefile.am +1 -1
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/tests/Makefile.in +69 -127
- data/ext/{libusbx-1.0.17/tests/libusbx_testlib.h → libusb-1.0.18/tests/libusb_testlib.h} +15 -15
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/tests/stress.c +16 -16
- data/ext/{libusbx-1.0.17 → libusb-1.0.18}/tests/testlib.c +21 -20
- data/lib/libusb/version_gem.rb +1 -1
- data/libusb.gemspec +1 -6
- metadata +117 -135
- checksums.yaml +0 -7
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ext/libusbx-1.0.17/NEWS +0 -2
- data/ext/libusbx-1.0.17/TODO +0 -2
- data/ext/libusbx-1.0.17/Xcode/libusbx.xcodeproj/project.pbxproj +0 -864
- data/ext/libusbx-1.0.17/aclocal.m4 +0 -1112
- data/ext/libusbx-1.0.17/libusb/version_nano.h +0 -1
- data/ext/libusbx-1.0.17/m4/ltoptions.m4 +0 -384
- data/ext/libusbx-1.0.17/m4/ltsugar.m4 +0 -123
- data/ext/libusbx-1.0.17/m4/ltversion.m4 +0 -23
- data/ext/libusbx-1.0.17/m4/lt~obsolete.m4 +0 -98
- data/ext/libusbx-1.0.17/missing +0 -215
- metadata.gz.sig +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */
|
2
2
|
/*
|
3
|
-
* USB descriptor handling functions for
|
3
|
+
* USB descriptor handling functions for libusb
|
4
4
|
* Copyright © 2007 Daniel Drake <dsd@gentoo.org>
|
5
5
|
* Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>
|
6
6
|
*
|
@@ -541,7 +541,7 @@ int usbi_device_cache_descriptor(libusb_device *dev)
|
|
541
541
|
*
|
542
542
|
* This is a non-blocking function; the device descriptor is cached in memory.
|
543
543
|
*
|
544
|
-
* Note since
|
544
|
+
* Note since libusb-1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, this
|
545
545
|
* function always succeeds.
|
546
546
|
*
|
547
547
|
* \param dev the device
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */
|
2
2
|
/*
|
3
|
-
* Hotplug functions for
|
3
|
+
* Hotplug functions for libusb
|
4
4
|
* Copyright © 2012-2013 Nathan Hjelm <hjelmn@mac.com>
|
5
5
|
* Copyright © 2012-2013 Peter Stuge <peter@stuge.se>
|
6
6
|
*
|
@@ -45,7 +45,7 @@
|
|
45
45
|
*
|
46
46
|
* \section intro Introduction
|
47
47
|
*
|
48
|
-
* Version 1.0.16, \ref
|
48
|
+
* Version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, has added support
|
49
49
|
* for hotplug events on <b>some</b> platforms (you should test if your platform
|
50
50
|
* supports hotplug notification by calling \ref libusb_has_capability() with
|
51
51
|
* parameter \ref LIBUSB_CAP_HAS_HOTPLUG).
|
@@ -80,7 +80,7 @@
|
|
80
80
|
* are invalid and will remain so even if the device comes back.
|
81
81
|
*
|
82
82
|
* When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED event it is considered
|
83
|
-
* safe to call any
|
83
|
+
* safe to call any libusb function that takes a libusb_device. On the other hand,
|
84
84
|
* when handling a LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT event the only safe function
|
85
85
|
* is libusb_get_device_descriptor().
|
86
86
|
*
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */
|
2
2
|
/*
|
3
|
-
* I/O functions for
|
3
|
+
* I/O functions for libusb
|
4
4
|
* Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>
|
5
5
|
* Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>
|
6
6
|
*
|
@@ -43,10 +43,10 @@
|
|
43
43
|
*
|
44
44
|
* \section intro Introduction
|
45
45
|
*
|
46
|
-
* If you're using
|
46
|
+
* If you're using libusb in your application, you're probably wanting to
|
47
47
|
* perform I/O with devices - you want to perform USB data transfers.
|
48
48
|
*
|
49
|
-
*
|
49
|
+
* libusb offers two separate interfaces for device I/O. This page aims to
|
50
50
|
* introduce the two in order to help you decide which one is more suitable
|
51
51
|
* for your application. You can also choose to use both interfaces in your
|
52
52
|
* application by considering each transfer on a case-by-case basis.
|
@@ -76,7 +76,7 @@
|
|
76
76
|
* Data will arrive when the button is pressed by the user, which is
|
77
77
|
* potentially hours later.
|
78
78
|
*
|
79
|
-
*
|
79
|
+
* libusb offers both a synchronous and an asynchronous interface to performing
|
80
80
|
* USB transfers. The main difference is that the synchronous interface
|
81
81
|
* combines both steps indicated above into a single function call, whereas
|
82
82
|
* the asynchronous interface separates them.
|
@@ -131,9 +131,9 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
131
131
|
* above.
|
132
132
|
*
|
133
133
|
* Instead of providing which functions that block until the I/O has complete,
|
134
|
-
*
|
134
|
+
* libusb's asynchronous interface presents non-blocking functions which
|
135
135
|
* begin a transfer and then return immediately. Your application passes a
|
136
|
-
* callback function pointer to this non-blocking function, which
|
136
|
+
* callback function pointer to this non-blocking function, which libusb will
|
137
137
|
* call with the results of the transaction when it has completed.
|
138
138
|
*
|
139
139
|
* Transfers which have been submitted through the non-blocking functions
|
@@ -144,12 +144,12 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
144
144
|
* to use threads.
|
145
145
|
*
|
146
146
|
* This added flexibility does come with some complications though:
|
147
|
-
* - In the interest of being a lightweight library,
|
147
|
+
* - In the interest of being a lightweight library, libusb does not create
|
148
148
|
* threads and can only operate when your application is calling into it. Your
|
149
|
-
* application must call into
|
150
|
-
* to be handled, or you must use some other scheme to allow
|
149
|
+
* application must call into libusb from it's main loop when events are ready
|
150
|
+
* to be handled, or you must use some other scheme to allow libusb to
|
151
151
|
* undertake whatever work needs to be done.
|
152
|
-
* -
|
152
|
+
* - libusb also needs to be called into at certain fixed points in time in
|
153
153
|
* order to accurately handle transfer timeouts.
|
154
154
|
* - Memory handling becomes more complex. You cannot use stack memory unless
|
155
155
|
* the function with that stack is guaranteed not to return until the transfer
|
@@ -159,7 +159,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
159
159
|
* results are handled. This becomes particularly obvious when you want to
|
160
160
|
* submit a second transfer based on the results of an earlier transfer.
|
161
161
|
*
|
162
|
-
* Internally,
|
162
|
+
* Internally, libusb's synchronous interface is expressed in terms of function
|
163
163
|
* calls to the asynchronous interface.
|
164
164
|
*
|
165
165
|
* For details on how to use the asynchronous API, see the
|
@@ -176,25 +176,25 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
176
176
|
* constraints on packet size defined by endpoint descriptors. The host must
|
177
177
|
* not send data payloads larger than the endpoint's maximum packet size.
|
178
178
|
*
|
179
|
-
*
|
179
|
+
* libusb and the underlying OS abstract out the packet concept, allowing you
|
180
180
|
* to request transfers of any size. Internally, the request will be divided
|
181
181
|
* up into correctly-sized packets. You do not have to be concerned with
|
182
182
|
* packet sizes, but there is one exception when considering overflows.
|
183
183
|
*
|
184
184
|
* \section overflow Bulk/interrupt transfer overflows
|
185
185
|
*
|
186
|
-
* When requesting data on a bulk endpoint,
|
187
|
-
* buffer and the maximum number of bytes of data that
|
186
|
+
* When requesting data on a bulk endpoint, libusb requires you to supply a
|
187
|
+
* buffer and the maximum number of bytes of data that libusb can put in that
|
188
188
|
* buffer. However, the size of the buffer is not communicated to the device -
|
189
189
|
* the device is just asked to send any amount of data.
|
190
190
|
*
|
191
191
|
* There is no problem if the device sends an amount of data that is less than
|
192
|
-
* or equal to the buffer size.
|
192
|
+
* or equal to the buffer size. libusb reports this condition to you through
|
193
193
|
* the \ref libusb_transfer::actual_length "libusb_transfer.actual_length"
|
194
194
|
* field.
|
195
195
|
*
|
196
196
|
* Problems may occur if the device attempts to send more data than can fit in
|
197
|
-
* the buffer.
|
197
|
+
* the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but
|
198
198
|
* other behaviour is largely undefined: actual_length may or may not be
|
199
199
|
* accurate, the chunk of data that can fit in the buffer (before overflow)
|
200
200
|
* may or may not have been transferred.
|
@@ -212,7 +212,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
212
212
|
/**
|
213
213
|
* @defgroup asyncio Asynchronous device I/O
|
214
214
|
*
|
215
|
-
* This page details
|
215
|
+
* This page details libusb's asynchronous (non-blocking) API for USB device
|
216
216
|
* I/O. This interface is very powerful but is also quite complex - you will
|
217
217
|
* need to read this page carefully to understand the necessary considerations
|
218
218
|
* and issues surrounding use of this interface. Simplistic applications
|
@@ -227,7 +227,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
227
227
|
*
|
228
228
|
* \section asyncabstraction Transfer abstraction
|
229
229
|
*
|
230
|
-
* For the asynchronous I/O,
|
230
|
+
* For the asynchronous I/O, libusb implements the concept of a generic
|
231
231
|
* transfer entity for all types of I/O (control, bulk, interrupt,
|
232
232
|
* isochronous). The generic transfer object must be treated slightly
|
233
233
|
* differently depending on which type of I/O you are performing with it.
|
@@ -240,7 +240,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
240
240
|
* -# <b>Allocation</b>: allocate a libusb_transfer
|
241
241
|
* -# <b>Filling</b>: populate the libusb_transfer instance with information
|
242
242
|
* about the transfer you wish to perform
|
243
|
-
* -# <b>Submission</b>: ask
|
243
|
+
* -# <b>Submission</b>: ask libusb to submit the transfer
|
244
244
|
* -# <b>Completion handling</b>: examine transfer results in the
|
245
245
|
* libusb_transfer structure
|
246
246
|
* -# <b>Deallocation</b>: clean up resources
|
@@ -287,7 +287,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
287
287
|
*
|
288
288
|
* The user-specified callback is passed a pointer to the libusb_transfer
|
289
289
|
* structure which was used to setup and submit the transfer. At completion
|
290
|
-
* time,
|
290
|
+
* time, libusb has populated this structure with results of the transfer:
|
291
291
|
* success or failure reason, number of bytes of data transferred, etc. See
|
292
292
|
* the libusb_transfer structure documentation for more information.
|
293
293
|
*
|
@@ -326,7 +326,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
326
326
|
* has completed will result in undefined behaviour.
|
327
327
|
*
|
328
328
|
* When a transfer is cancelled, some of the data may have been transferred.
|
329
|
-
*
|
329
|
+
* libusb will communicate this to you in the transfer callback. Do not assume
|
330
330
|
* that no data was transferred.
|
331
331
|
*
|
332
332
|
* \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints
|
@@ -468,7 +468,7 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
468
468
|
*
|
469
469
|
* In most circumstances, it is not safe to use stack memory for transfer
|
470
470
|
* buffers. This is because the function that fired off the asynchronous
|
471
|
-
* transfer may return before
|
471
|
+
* transfer may return before libusb has finished using the buffer, and when
|
472
472
|
* the function returns it's stack gets destroyed. This is true for both
|
473
473
|
* host-to-device and device-to-host transfers.
|
474
474
|
*
|
@@ -488,43 +488,43 @@ if (r == 0 && actual_length == sizeof(data)) {
|
|
488
488
|
* \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR"
|
489
489
|
* (they would normally be regarded as COMPLETED)
|
490
490
|
* - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER
|
491
|
-
* "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask
|
491
|
+
* "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusb to free the transfer
|
492
492
|
* buffer when freeing the transfer.
|
493
493
|
* - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER
|
494
|
-
* "LIBUSB_TRANSFER_FREE_TRANSFER" causes
|
494
|
+
* "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusb to automatically free the
|
495
495
|
* transfer after the transfer callback returns.
|
496
496
|
*
|
497
497
|
* \section asyncevent Event handling
|
498
498
|
*
|
499
|
-
* An asynchronous model requires that
|
499
|
+
* An asynchronous model requires that libusb perform work at various
|
500
500
|
* points in time - namely processing the results of previously-submitted
|
501
501
|
* transfers and invoking the user-supplied callback function.
|
502
502
|
*
|
503
503
|
* This gives rise to the libusb_handle_events() function which your
|
504
|
-
* application must call into when
|
504
|
+
* application must call into when libusb has work do to. This gives libusb
|
505
505
|
* the opportunity to reap pending transfers, invoke callbacks, etc.
|
506
506
|
*
|
507
507
|
* There are 2 different approaches to dealing with libusb_handle_events:
|
508
508
|
*
|
509
509
|
* -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated
|
510
510
|
* thread.
|
511
|
-
* -# Integrate
|
511
|
+
* -# Integrate libusb with your application's main event loop. libusb
|
512
512
|
* exposes a set of file descriptors which allow you to do this.
|
513
513
|
*
|
514
514
|
* The first approach has the big advantage that it will also work on Windows
|
515
|
-
* were
|
515
|
+
* were libusb' poll API for select / poll integration is not available. So
|
516
516
|
* if you want to support Windows and use the async API, you must use this
|
517
517
|
* approach, see the \ref eventthread "Using an event handling thread" section
|
518
518
|
* below for details.
|
519
519
|
*
|
520
520
|
* If you prefer a single threaded approach with a single central event loop,
|
521
|
-
* see the \ref poll "polling and timing" section for how to integrate
|
521
|
+
* see the \ref poll "polling and timing" section for how to integrate libusb
|
522
522
|
* into your application's main event loop.
|
523
523
|
*
|
524
524
|
* \section eventthread Using an event handling thread
|
525
525
|
*
|
526
526
|
* Lets begin with stating the obvious: If you're going to use a separate
|
527
|
-
* thread for
|
527
|
+
* thread for libusb event handling, your callback functions MUST be
|
528
528
|
* threadsafe.
|
529
529
|
*
|
530
530
|
* Other then that doing event handling from a separate thread, is mostly
|
@@ -545,7 +545,7 @@ void *event_thread_func(void *ctx)
|
|
545
545
|
* libusb_handle_events() will not return.
|
546
546
|
*
|
547
547
|
* There are 2 different ways of dealing with this, depending on if your
|
548
|
-
* application uses
|
548
|
+
* application uses libusb' \ref hotplug "hotplug" support or not.
|
549
549
|
*
|
550
550
|
* Applications which do not use hotplug support, should not start the event
|
551
551
|
* thread until after their first call to libusb_open(), and should stop the
|
@@ -582,7 +582,7 @@ void my_libusb_exit(void)
|
|
582
582
|
/**
|
583
583
|
* @defgroup poll Polling and timing
|
584
584
|
*
|
585
|
-
* This page documents
|
585
|
+
* This page documents libusb's functions for polling events and timing.
|
586
586
|
* These functions are only necessary for users of the
|
587
587
|
* \ref asyncio "asynchronous API". If you are only using the simpler
|
588
588
|
* \ref syncio "synchronous API" then you do not need to ever call these
|
@@ -590,28 +590,28 @@ void my_libusb_exit(void)
|
|
590
590
|
*
|
591
591
|
* The justification for the functionality described here has already been
|
592
592
|
* discussed in the \ref asyncevent "event handling" section of the
|
593
|
-
* asynchronous API documentation. In summary,
|
593
|
+
* asynchronous API documentation. In summary, libusb does not create internal
|
594
594
|
* threads for event processing and hence relies on your application calling
|
595
|
-
* into
|
595
|
+
* into libusb at certain points in time so that pending events can be handled.
|
596
596
|
*
|
597
597
|
* Your main loop is probably already calling poll() or select() or a
|
598
598
|
* variant on a set of file descriptors for other event sources (e.g. keyboard
|
599
599
|
* button presses, mouse movements, network sockets, etc). You then add
|
600
|
-
*
|
600
|
+
* libusb's file descriptors to your poll()/select() calls, and when activity
|
601
601
|
* is detected on such descriptors you know it is time to call
|
602
602
|
* libusb_handle_events().
|
603
603
|
*
|
604
|
-
* There is one final event handling complication.
|
604
|
+
* There is one final event handling complication. libusb supports
|
605
605
|
* asynchronous transfers which time out after a specified time period.
|
606
606
|
*
|
607
607
|
* On some platforms a timerfd is used, so the timeout handling is just another
|
608
|
-
* fd, on other platforms this requires that
|
609
|
-
* the timeout to handle it. So, in addition to considering
|
610
|
-
* descriptors in your main event loop, you must also consider that
|
608
|
+
* fd, on other platforms this requires that libusb is called into at or after
|
609
|
+
* the timeout to handle it. So, in addition to considering libusb's file
|
610
|
+
* descriptors in your main event loop, you must also consider that libusb
|
611
611
|
* sometimes needs to be called into at fixed points in time even when there
|
612
612
|
* is no file descriptor activity, see \ref polltime details.
|
613
613
|
*
|
614
|
-
* In order to know precisely when
|
614
|
+
* In order to know precisely when libusb needs to be called into, libusb
|
615
615
|
* offers you a set of pollable file descriptors and information about when
|
616
616
|
* the next timeout expires.
|
617
617
|
*
|
@@ -620,10 +620,10 @@ void my_libusb_exit(void)
|
|
620
620
|
*
|
621
621
|
* \section pollsimple The simple option
|
622
622
|
*
|
623
|
-
* If your application revolves solely around
|
623
|
+
* If your application revolves solely around libusb and does not need to
|
624
624
|
* handle other event sources, you can have a program structure as follows:
|
625
625
|
\code
|
626
|
-
// initialize
|
626
|
+
// initialize libusb
|
627
627
|
// find and open device
|
628
628
|
// maybe fire off some initial async I/O
|
629
629
|
|
@@ -646,15 +646,15 @@ while (user_has_not_requested_exit)
|
|
646
646
|
*
|
647
647
|
* In more advanced applications, you will already have a main loop which
|
648
648
|
* is monitoring other event sources: network sockets, X11 events, mouse
|
649
|
-
* movements, etc. Through exposing a set of file descriptors,
|
649
|
+
* movements, etc. Through exposing a set of file descriptors, libusb is
|
650
650
|
* designed to cleanly integrate into such main loops.
|
651
651
|
*
|
652
652
|
* In addition to polling file descriptors for the other event sources, you
|
653
|
-
* take a set of file descriptors from
|
654
|
-
* detect activity on
|
653
|
+
* take a set of file descriptors from libusb and monitor those too. When you
|
654
|
+
* detect activity on libusb's file descriptors, you call
|
655
655
|
* libusb_handle_events_timeout() in non-blocking mode.
|
656
656
|
*
|
657
|
-
* What's more,
|
657
|
+
* What's more, libusb may also need to handle events at specific moments in
|
658
658
|
* time. No file descriptor activity is generated at these times, so your
|
659
659
|
* own application needs to be continually aware of when the next one of these
|
660
660
|
* moments occurs (through calling libusb_get_next_timeout()), and then it
|
@@ -662,25 +662,25 @@ while (user_has_not_requested_exit)
|
|
662
662
|
* these moments occur. This means that you need to adjust your
|
663
663
|
* poll()/select() timeout accordingly.
|
664
664
|
*
|
665
|
-
*
|
665
|
+
* libusb provides you with a set of file descriptors to poll and expects you
|
666
666
|
* to poll all of them, treating them as a single entity. The meaning of each
|
667
667
|
* file descriptor in the set is an internal implementation detail,
|
668
668
|
* platform-dependent and may vary from release to release. Don't try and
|
669
|
-
* interpret the meaning of the file descriptors, just do as
|
669
|
+
* interpret the meaning of the file descriptors, just do as libusb indicates,
|
670
670
|
* polling all of them at once.
|
671
671
|
*
|
672
672
|
* In pseudo-code, you want something that looks like:
|
673
673
|
\code
|
674
|
-
// initialise
|
674
|
+
// initialise libusb
|
675
675
|
|
676
676
|
libusb_get_pollfds(ctx)
|
677
677
|
while (user has not requested application exit) {
|
678
678
|
libusb_get_next_timeout(ctx);
|
679
|
-
poll(on
|
680
|
-
using a timeout no larger than the value
|
681
|
-
if (poll() indicated activity on
|
679
|
+
poll(on libusb file descriptors plus any other event sources of interest,
|
680
|
+
using a timeout no larger than the value libusb just suggested)
|
681
|
+
if (poll() indicated activity on libusb file descriptors)
|
682
682
|
libusb_handle_events_timeout(ctx, &zero_tv);
|
683
|
-
if (time has elapsed to or beyond the
|
683
|
+
if (time has elapsed to or beyond the libusb timeout)
|
684
684
|
libusb_handle_events_timeout(ctx, &zero_tv);
|
685
685
|
// handle events from other sources here
|
686
686
|
}
|
@@ -690,7 +690,7 @@ while (user has not requested application exit) {
|
|
690
690
|
*
|
691
691
|
* \subsection polltime Notes on time-based events
|
692
692
|
*
|
693
|
-
* The above complication with having to track time and call into
|
693
|
+
* The above complication with having to track time and call into libusb at
|
694
694
|
* specific moments is a bit of a headache. For maximum compatibility, you do
|
695
695
|
* need to write your main loop as above, but you may decide that you can
|
696
696
|
* restrict the supported platforms of your application and get away with
|
@@ -702,18 +702,18 @@ while (user has not requested application exit) {
|
|
702
702
|
* - Linux, provided that the following version requirements are satisfied:
|
703
703
|
* - Linux v2.6.27 or newer, compiled with timerfd support
|
704
704
|
* - glibc v2.9 or newer
|
705
|
-
* -
|
705
|
+
* - libusb v1.0.5 or newer
|
706
706
|
*
|
707
707
|
* Under these configurations, libusb_get_next_timeout() will \em always return
|
708
708
|
* 0, so your main loop can be simplified to:
|
709
709
|
\code
|
710
|
-
// initialise
|
710
|
+
// initialise libusb
|
711
711
|
|
712
712
|
libusb_get_pollfds(ctx)
|
713
713
|
while (user has not requested application exit) {
|
714
|
-
poll(on
|
714
|
+
poll(on libusb file descriptors plus any other event sources of interest,
|
715
715
|
using any timeout that you like)
|
716
|
-
if (poll() indicated activity on
|
716
|
+
if (poll() indicated activity on libusb file descriptors)
|
717
717
|
libusb_handle_events_timeout(ctx, &zero_tv);
|
718
718
|
// handle events from other sources here
|
719
719
|
}
|
@@ -723,20 +723,20 @@ while (user has not requested application exit) {
|
|
723
723
|
*
|
724
724
|
* Do remember that if you simplify your main loop to the above, you will
|
725
725
|
* lose compatibility with some platforms (including legacy Linux platforms,
|
726
|
-
* and <em>any future platforms supported by
|
726
|
+
* and <em>any future platforms supported by libusb which may have time-based
|
727
727
|
* event requirements</em>). The resultant problems will likely appear as
|
728
728
|
* strange bugs in your application.
|
729
729
|
*
|
730
730
|
* You can use the libusb_pollfds_handle_timeouts() function to do a runtime
|
731
731
|
* check to see if it is safe to ignore the time-based event complications.
|
732
|
-
* If your application has taken the shortcut of ignoring
|
732
|
+
* If your application has taken the shortcut of ignoring libusb's next timeout
|
733
733
|
* in your main loop, then you are advised to check the return value of
|
734
734
|
* libusb_pollfds_handle_timeouts() during application startup, and to abort
|
735
735
|
* if the platform does suffer from these timing complications.
|
736
736
|
*
|
737
737
|
* \subsection fdsetchange Changes in the file descriptor set
|
738
738
|
*
|
739
|
-
* The set of file descriptors that
|
739
|
+
* The set of file descriptors that libusb uses as event sources may change
|
740
740
|
* during the life of your application. Rather than having to repeatedly
|
741
741
|
* call libusb_get_pollfds(), you can set up notification functions for when
|
742
742
|
* the file descriptor set changes using libusb_set_pollfd_notifiers().
|
@@ -757,10 +757,10 @@ while (user has not requested application exit) {
|
|
757
757
|
|
758
758
|
/** \page mtasync Multi-threaded applications and asynchronous I/O
|
759
759
|
*
|
760
|
-
*
|
761
|
-
* to applications which interact with
|
760
|
+
* libusb is a thread-safe library, but extra considerations must be applied
|
761
|
+
* to applications which interact with libusb from multiple threads.
|
762
762
|
*
|
763
|
-
* The underlying issue that must be addressed is that all
|
763
|
+
* The underlying issue that must be addressed is that all libusb I/O
|
764
764
|
* revolves around monitoring file descriptors through the poll()/select()
|
765
765
|
* system calls. This is directly exposed at the
|
766
766
|
* \ref asyncio "asynchronous interface" but it is important to note that the
|
@@ -768,13 +768,13 @@ while (user has not requested application exit) {
|
|
768
768
|
* asynchonrous interface, therefore the same considerations apply.
|
769
769
|
*
|
770
770
|
* The issue is that if two or more threads are concurrently calling poll()
|
771
|
-
* or select() on
|
771
|
+
* or select() on libusb's file descriptors then only one of those threads
|
772
772
|
* will be woken up when an event arrives. The others will be completely
|
773
773
|
* oblivious that anything has happened.
|
774
774
|
*
|
775
775
|
* Consider the following pseudo-code, which submits an asynchronous transfer
|
776
776
|
* then waits for its completion. This style is one way you could implement a
|
777
|
-
* synchronous interface on top of the asynchronous interface (and
|
777
|
+
* synchronous interface on top of the asynchronous interface (and libusb
|
778
778
|
* does something similar, albeit more advanced due to the complications
|
779
779
|
* explained on this page).
|
780
780
|
*
|
@@ -797,7 +797,7 @@ void myfunc() {
|
|
797
797
|
libusb_submit_transfer(transfer);
|
798
798
|
|
799
799
|
while (!completed) {
|
800
|
-
poll(
|
800
|
+
poll(libusb file descriptors, 120*1000);
|
801
801
|
if (poll indicates activity)
|
802
802
|
libusb_handle_events_timeout(ctx, &zero_tv);
|
803
803
|
}
|
@@ -811,7 +811,7 @@ void myfunc() {
|
|
811
811
|
* The poll() loop has a long timeout to minimize CPU usage during situations
|
812
812
|
* when nothing is happening (it could reasonably be unlimited).
|
813
813
|
*
|
814
|
-
* If this is the only thread that is polling
|
814
|
+
* If this is the only thread that is polling libusb's file descriptors, there
|
815
815
|
* is no problem: there is no danger that another thread will swallow up the
|
816
816
|
* event that we are interested in. On the other hand, if there is another
|
817
817
|
* thread polling the same descriptors, there is a chance that it will receive
|
@@ -823,13 +823,13 @@ void myfunc() {
|
|
823
823
|
*
|
824
824
|
* The solution here is to ensure that no two threads are ever polling the
|
825
825
|
* file descriptors at the same time. A naive implementation of this would
|
826
|
-
* impact the capabilities of the library, so
|
826
|
+
* impact the capabilities of the library, so libusb offers the scheme
|
827
827
|
* documented below to ensure no loss of functionality.
|
828
828
|
*
|
829
829
|
* Before we go any further, it is worth mentioning that all libusb-wrapped
|
830
830
|
* event handling procedures fully adhere to the scheme documented below.
|
831
831
|
* This includes libusb_handle_events() and its variants, and all the
|
832
|
-
* synchronous I/O functions -
|
832
|
+
* synchronous I/O functions - libusb hides this headache from you.
|
833
833
|
*
|
834
834
|
* \section Using libusb_handle_events() from multiple threads
|
835
835
|
*
|
@@ -875,17 +875,17 @@ void myfunc() {
|
|
875
875
|
*
|
876
876
|
* \section eventlock The events lock
|
877
877
|
*
|
878
|
-
* The problem is when we consider the fact that
|
878
|
+
* The problem is when we consider the fact that libusb exposes file
|
879
879
|
* descriptors to allow for you to integrate asynchronous USB I/O into
|
880
880
|
* existing main loops, effectively allowing you to do some work behind
|
881
|
-
*
|
881
|
+
* libusb's back. If you do take libusb's file descriptors and pass them to
|
882
882
|
* poll()/select() yourself, you need to be aware of the associated issues.
|
883
883
|
*
|
884
884
|
* The first concept to be introduced is the events lock. The events lock
|
885
885
|
* is used to serialize threads that want to handle events, such that only
|
886
886
|
* one thread is handling events at any one time.
|
887
887
|
*
|
888
|
-
* You must take the events lock before polling
|
888
|
+
* You must take the events lock before polling libusb file descriptors,
|
889
889
|
* using libusb_lock_events(). You must release the lock as soon as you have
|
890
890
|
* aborted your poll()/select() loop, using libusb_unlock_events().
|
891
891
|
*
|
@@ -896,7 +896,7 @@ void myfunc() {
|
|
896
896
|
\code
|
897
897
|
libusb_lock_events(ctx);
|
898
898
|
while (!completed) {
|
899
|
-
poll(
|
899
|
+
poll(libusb file descriptors, 120*1000);
|
900
900
|
if (poll indicates activity)
|
901
901
|
libusb_handle_events_timeout(ctx, &zero_tv);
|
902
902
|
}
|
@@ -912,7 +912,7 @@ void myfunc() {
|
|
912
912
|
* status of its transfer until the code above has finished (30 seconds later)
|
913
913
|
* due to contention on the lock.
|
914
914
|
*
|
915
|
-
* To solve this,
|
915
|
+
* To solve this, libusb offers you a mechanism to determine when another
|
916
916
|
* thread is handling events. It also offers a mechanism to block your thread
|
917
917
|
* until the event handling thread has completed an event (and this mechanism
|
918
918
|
* does not involve polling of file descriptors).
|
@@ -938,7 +938,7 @@ if (libusb_try_lock_events(ctx) == 0) {
|
|
938
938
|
libusb_unlock_events(ctx);
|
939
939
|
goto retry;
|
940
940
|
}
|
941
|
-
poll(
|
941
|
+
poll(libusb file descriptors, 120*1000);
|
942
942
|
if (poll indicates activity)
|
943
943
|
libusb_handle_events_locked(ctx, 0);
|
944
944
|
}
|
@@ -984,8 +984,8 @@ printf("completed!\n");
|
|
984
984
|
* should be apparent from the code shown above.
|
985
985
|
* -# libusb_try_lock_events() is a non-blocking function which attempts
|
986
986
|
* to acquire the events lock but returns a failure code if it is contended.
|
987
|
-
* -# libusb_event_handling_ok() checks that
|
988
|
-
* thread to be performing event handling. Sometimes,
|
987
|
+
* -# libusb_event_handling_ok() checks that libusb is still happy for your
|
988
|
+
* thread to be performing event handling. Sometimes, libusb needs to
|
989
989
|
* interrupt the event handler, and this is how you can check if you have
|
990
990
|
* been interrupted. If this function returns 0, the correct behaviour is
|
991
991
|
* for you to give up the event handling lock, and then to repeat the cycle.
|
@@ -995,12 +995,12 @@ printf("completed!\n");
|
|
995
995
|
* libusb_handle_events_timeout() that you can call while holding the
|
996
996
|
* events lock. libusb_handle_events_timeout() itself implements similar
|
997
997
|
* logic to the above, so be sure not to call it when you are
|
998
|
-
* "working behind
|
998
|
+
* "working behind libusb's back", as is the case here.
|
999
999
|
* -# libusb_event_handler_active() determines if someone is currently
|
1000
1000
|
* holding the events lock
|
1001
1001
|
*
|
1002
1002
|
* You might be wondering why there is no function to wake up all threads
|
1003
|
-
* blocked on libusb_wait_for_event(). This is because
|
1003
|
+
* blocked on libusb_wait_for_event(). This is because libusb can do this
|
1004
1004
|
* internally: it will wake up all such threads when someone calls
|
1005
1005
|
* libusb_unlock_events() or when a transfer completes (at the point after its
|
1006
1006
|
* callback has returned).
|
@@ -1009,7 +1009,7 @@ printf("completed!\n");
|
|
1009
1009
|
*
|
1010
1010
|
* The above explanation should be enough to get you going, but if you're
|
1011
1011
|
* really thinking through the issues then you may be left with some more
|
1012
|
-
* questions regarding
|
1012
|
+
* questions regarding libusb's internals. If you're curious, read on, and if
|
1013
1013
|
* not, skip to the next section to avoid confusing yourself!
|
1014
1014
|
*
|
1015
1015
|
* The immediate question that may spring to mind is: what if one thread
|
@@ -1024,14 +1024,14 @@ printf("completed!\n");
|
|
1024
1024
|
* are all kinds of race conditions that could arise here, so it is
|
1025
1025
|
* important that nobody is doing event handling at this time.
|
1026
1026
|
*
|
1027
|
-
*
|
1027
|
+
* libusb handles these issues internally, so application developers do not
|
1028
1028
|
* have to stop their event handlers while opening/closing devices. Here's how
|
1029
1029
|
* it works, focusing on the libusb_close() situation first:
|
1030
1030
|
*
|
1031
|
-
* -# During initialization,
|
1031
|
+
* -# During initialization, libusb opens an internal pipe, and it adds the read
|
1032
1032
|
* end of this pipe to the set of file descriptors to be polled.
|
1033
|
-
* -# During libusb_close(),
|
1034
|
-
* This immediately interrupts the event handler.
|
1033
|
+
* -# During libusb_close(), libusb writes some dummy data on this control pipe.
|
1034
|
+
* This immediately interrupts the event handler. libusb also records
|
1035
1035
|
* internally that it is trying to interrupt event handlers for this
|
1036
1036
|
* high-priority event.
|
1037
1037
|
* -# At this point, some of the functions described above start behaving
|
@@ -1046,7 +1046,7 @@ printf("completed!\n");
|
|
1046
1046
|
* giving up the events lock very quickly, giving the high-priority
|
1047
1047
|
* libusb_close() operation a "free ride" to acquire the events lock. All
|
1048
1048
|
* threads that are competing to do event handling become event waiters.
|
1049
|
-
* -# With the events lock held inside libusb_close(),
|
1049
|
+
* -# With the events lock held inside libusb_close(), libusb can safely remove
|
1050
1050
|
* a file descriptor from the poll set, in the safety of knowledge that
|
1051
1051
|
* nobody is polling those descriptors or trying to access the poll set.
|
1052
1052
|
* -# After obtaining the events lock, the close operation completes very
|
@@ -1063,7 +1063,7 @@ printf("completed!\n");
|
|
1063
1063
|
* call to libusb_open():
|
1064
1064
|
*
|
1065
1065
|
* -# The device is opened and a file descriptor is added to the poll set.
|
1066
|
-
* -#
|
1066
|
+
* -# libusb sends some dummy data on the control pipe, and records that it
|
1067
1067
|
* is trying to modify the poll descriptor set.
|
1068
1068
|
* -# The event handler is interrupted, and the same behaviour change as for
|
1069
1069
|
* libusb_close() takes effect, causing all event handling threads to become
|
@@ -1079,7 +1079,7 @@ printf("completed!\n");
|
|
1079
1079
|
*
|
1080
1080
|
* The above may seem a little complicated, but hopefully I have made it clear
|
1081
1081
|
* why such complications are necessary. Also, do not forget that this only
|
1082
|
-
* applies to applications that take
|
1082
|
+
* applies to applications that take libusb's file descriptors and integrate
|
1083
1083
|
* them into their own polling loops.
|
1084
1084
|
*
|
1085
1085
|
* You may decide that it is OK for your multi-threaded application to ignore
|
@@ -1291,7 +1291,7 @@ out:
|
|
1291
1291
|
}
|
1292
1292
|
|
1293
1293
|
/** \ingroup asyncio
|
1294
|
-
* Allocate a
|
1294
|
+
* Allocate a libusb transfer with a specified number of isochronous packet
|
1295
1295
|
* descriptors. The returned transfer is pre-initialized for you. When the new
|
1296
1296
|
* transfer is no longer needed, it should be freed with
|
1297
1297
|
* libusb_free_transfer().
|
@@ -1589,11 +1589,11 @@ int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer)
|
|
1589
1589
|
|
1590
1590
|
/** \ingroup poll
|
1591
1591
|
* Attempt to acquire the event handling lock. This lock is used to ensure that
|
1592
|
-
* only one thread is monitoring
|
1592
|
+
* only one thread is monitoring libusb event sources at any one time.
|
1593
1593
|
*
|
1594
1594
|
* You only need to use this lock if you are developing an application
|
1595
|
-
* which calls poll() or select() on
|
1596
|
-
* If you stick to
|
1595
|
+
* which calls poll() or select() on libusb's file descriptors directly.
|
1596
|
+
* If you stick to libusb's event handling loop functions (e.g.
|
1597
1597
|
* libusb_handle_events()) then you do not need to be concerned with this
|
1598
1598
|
* locking.
|
1599
1599
|
*
|
@@ -1633,11 +1633,11 @@ int API_EXPORTED libusb_try_lock_events(libusb_context *ctx)
|
|
1633
1633
|
/** \ingroup poll
|
1634
1634
|
* Acquire the event handling lock, blocking until successful acquisition if
|
1635
1635
|
* it is contended. This lock is used to ensure that only one thread is
|
1636
|
-
* monitoring
|
1636
|
+
* monitoring libusb event sources at any one time.
|
1637
1637
|
*
|
1638
1638
|
* You only need to use this lock if you are developing an application
|
1639
|
-
* which calls poll() or select() on
|
1640
|
-
* If you stick to
|
1639
|
+
* which calls poll() or select() on libusb's file descriptors directly.
|
1640
|
+
* If you stick to libusb's event handling loop functions (e.g.
|
1641
1641
|
* libusb_handle_events()) then you do not need to be concerned with this
|
1642
1642
|
* locking.
|
1643
1643
|
*
|
@@ -1680,7 +1680,7 @@ void API_EXPORTED libusb_unlock_events(libusb_context *ctx)
|
|
1680
1680
|
/** \ingroup poll
|
1681
1681
|
* Determine if it is still OK for this thread to be doing event handling.
|
1682
1682
|
*
|
1683
|
-
* Sometimes,
|
1683
|
+
* Sometimes, libusb needs to temporarily pause all event handlers, and this
|
1684
1684
|
* is the function you should use before polling file descriptors to see if
|
1685
1685
|
* this is the case.
|
1686
1686
|
*
|
@@ -1754,9 +1754,9 @@ int API_EXPORTED libusb_event_handler_active(libusb_context *ctx)
|
|
1754
1754
|
* events, then call libusb_wait_for_event().
|
1755
1755
|
*
|
1756
1756
|
* You only need to use this lock if you are developing an application
|
1757
|
-
* which calls poll() or select() on
|
1757
|
+
* which calls poll() or select() on libusb's file descriptors directly,
|
1758
1758
|
* <b>and</b> may potentially be handling events from 2 threads simultaenously.
|
1759
|
-
* If you stick to
|
1759
|
+
* If you stick to libusb's event handling loop functions (e.g.
|
1760
1760
|
* libusb_handle_events()) then you do not need to be concerned with this
|
1761
1761
|
* locking.
|
1762
1762
|
*
|
@@ -1930,6 +1930,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
1930
1930
|
struct pollfd *fds = NULL;
|
1931
1931
|
int i = -1;
|
1932
1932
|
int timeout_ms;
|
1933
|
+
int special_event;
|
1933
1934
|
|
1934
1935
|
usbi_mutex_lock(&ctx->pollfds_lock);
|
1935
1936
|
list_for_each_entry(ipollfd, &ctx->pollfds, list, struct usbi_pollfd)
|
@@ -1959,6 +1960,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
1959
1960
|
if (tv->tv_usec % 1000)
|
1960
1961
|
timeout_ms++;
|
1961
1962
|
|
1963
|
+
redo_poll:
|
1962
1964
|
usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms);
|
1963
1965
|
r = usbi_poll(fds, nfds, timeout_ms);
|
1964
1966
|
usbi_dbg("poll() returned %d", r);
|
@@ -1974,6 +1976,8 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
1974
1976
|
return LIBUSB_ERROR_IO;
|
1975
1977
|
}
|
1976
1978
|
|
1979
|
+
special_event = 0;
|
1980
|
+
|
1977
1981
|
/* fd[0] is always the ctrl pipe */
|
1978
1982
|
if (fds[0].revents) {
|
1979
1983
|
/* another thread wanted to interrupt event handling, and it succeeded!
|
@@ -1997,6 +2001,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
1997
2001
|
ssize_t ret;
|
1998
2002
|
|
1999
2003
|
usbi_dbg("caught a fish on the hotplug pipe");
|
2004
|
+
special_event = 1;
|
2000
2005
|
|
2001
2006
|
/* read the message from the hotplug thread */
|
2002
2007
|
ret = usbi_read(ctx->hotplug_pipe[0], &message, sizeof (message));
|
@@ -2024,6 +2029,7 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
2024
2029
|
/* timerfd indicates that a timeout has expired */
|
2025
2030
|
int ret;
|
2026
2031
|
usbi_dbg("timerfd triggered");
|
2032
|
+
special_event = 1;
|
2027
2033
|
|
2028
2034
|
ret = handle_timerfd_trigger(ctx);
|
2029
2035
|
if (ret < 0) {
|
@@ -2048,6 +2054,11 @@ static int handle_events(struct libusb_context *ctx, struct timeval *tv)
|
|
2048
2054
|
usbi_err(ctx, "backend handle_events failed with error %d", r);
|
2049
2055
|
|
2050
2056
|
handled:
|
2057
|
+
if (r == 0 && special_event) {
|
2058
|
+
timeout_ms = 0;
|
2059
|
+
goto redo_poll;
|
2060
|
+
}
|
2061
|
+
|
2051
2062
|
free(fds);
|
2052
2063
|
return r;
|
2053
2064
|
}
|
@@ -2082,7 +2093,7 @@ static int get_next_timeout(libusb_context *ctx, struct timeval *tv,
|
|
2082
2093
|
/** \ingroup poll
|
2083
2094
|
* Handle any pending events.
|
2084
2095
|
*
|
2085
|
-
*
|
2096
|
+
* libusb determines "pending events" by checking if any timeouts have expired
|
2086
2097
|
* and by checking the set of file descriptors for activity.
|
2087
2098
|
*
|
2088
2099
|
* If a zero timeval is passed, this function will handle any already-pending
|
@@ -2231,9 +2242,9 @@ int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx,
|
|
2231
2242
|
* held, see libusb_lock_events().
|
2232
2243
|
*
|
2233
2244
|
* This function is designed to be called under the situation where you have
|
2234
|
-
* taken the event lock and are calling poll()/select() directly on
|
2245
|
+
* taken the event lock and are calling poll()/select() directly on libusb's
|
2235
2246
|
* file descriptors (as opposed to using libusb_handle_events() or similar).
|
2236
|
-
* You detect events on
|
2247
|
+
* You detect events on libusb's descriptors, so you then call this function
|
2237
2248
|
* with a zero timeout value (while still holding the event lock).
|
2238
2249
|
*
|
2239
2250
|
* \param ctx the context to operate on, or NULL for the default context
|
@@ -2260,19 +2271,19 @@ int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx,
|
|
2260
2271
|
|
2261
2272
|
/** \ingroup poll
|
2262
2273
|
* Determines whether your application must apply special timing considerations
|
2263
|
-
* when monitoring
|
2274
|
+
* when monitoring libusb's file descriptors.
|
2264
2275
|
*
|
2265
2276
|
* This function is only useful for applications which retrieve and poll
|
2266
|
-
*
|
2277
|
+
* libusb's file descriptors in their own main loop (\ref pollmain).
|
2267
2278
|
*
|
2268
|
-
* Ordinarily,
|
2279
|
+
* Ordinarily, libusb's event handler needs to be called into at specific
|
2269
2280
|
* moments in time (in addition to times when there is activity on the file
|
2270
2281
|
* descriptor set). The usual approach is to use libusb_get_next_timeout()
|
2271
2282
|
* to learn about when the next timeout occurs, and to adjust your
|
2272
2283
|
* poll()/select() timeout accordingly so that you can make a call into the
|
2273
2284
|
* library at that time.
|
2274
2285
|
*
|
2275
|
-
* Some platforms supported by
|
2286
|
+
* Some platforms supported by libusb do not come with this baggage - any
|
2276
2287
|
* events relevant to timing will be represented by activity on the file
|
2277
2288
|
* descriptor set, and libusb_get_next_timeout() will always return 0.
|
2278
2289
|
* This function allows you to detect whether you are running on such a
|
@@ -2281,10 +2292,10 @@ int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx,
|
|
2281
2292
|
* Since v1.0.5.
|
2282
2293
|
*
|
2283
2294
|
* \param ctx the context to operate on, or NULL for the default context
|
2284
|
-
* \returns 0 if you must call into
|
2295
|
+
* \returns 0 if you must call into libusb at times determined by
|
2285
2296
|
* libusb_get_next_timeout(), or 1 if all timeout events are handled internally
|
2286
2297
|
* or through regular activity on the file descriptors.
|
2287
|
-
* \see \ref pollmain "Polling
|
2298
|
+
* \see \ref pollmain "Polling libusb file descriptors for event handling"
|
2288
2299
|
*/
|
2289
2300
|
int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx)
|
2290
2301
|
{
|
@@ -2298,21 +2309,21 @@ int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx)
|
|
2298
2309
|
}
|
2299
2310
|
|
2300
2311
|
/** \ingroup poll
|
2301
|
-
* Determine the next internal timeout that
|
2312
|
+
* Determine the next internal timeout that libusb needs to handle. You only
|
2302
2313
|
* need to use this function if you are calling poll() or select() or similar
|
2303
|
-
* on
|
2314
|
+
* on libusb's file descriptors yourself - you do not need to use it if you
|
2304
2315
|
* are calling libusb_handle_events() or a variant directly.
|
2305
2316
|
*
|
2306
2317
|
* You should call this function in your main loop in order to determine how
|
2307
|
-
* long to wait for select() or poll() to return results.
|
2318
|
+
* long to wait for select() or poll() to return results. libusb needs to be
|
2308
2319
|
* called into at this timeout, so you should use it as an upper bound on
|
2309
2320
|
* your select() or poll() call.
|
2310
2321
|
*
|
2311
2322
|
* When the timeout has expired, call into libusb_handle_events_timeout()
|
2312
|
-
* (perhaps in non-blocking mode) so that
|
2323
|
+
* (perhaps in non-blocking mode) so that libusb can handle the timeout.
|
2313
2324
|
*
|
2314
2325
|
* This function may return 1 (success) and an all-zero timeval. If this is
|
2315
|
-
* the case, it indicates that
|
2326
|
+
* the case, it indicates that libusb has a timeout that has already expired
|
2316
2327
|
* so you should call libusb_handle_events_timeout() or similar immediately.
|
2317
2328
|
* A return code of 0 indicates that there are no pending timeouts.
|
2318
2329
|
*
|
@@ -2321,7 +2332,7 @@ int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx)
|
|
2321
2332
|
*
|
2322
2333
|
* \param ctx the context to operate on, or NULL for the default context
|
2323
2334
|
* \param tv output location for a relative time against the current
|
2324
|
-
* clock in which
|
2335
|
+
* clock in which libusb must be called into in order to process timeout events
|
2325
2336
|
* \returns 0 if there are no pending timeouts, 1 if a timeout was returned,
|
2326
2337
|
* or LIBUSB_ERROR_OTHER on failure
|
2327
2338
|
*/
|
@@ -2388,7 +2399,7 @@ int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx,
|
|
2388
2399
|
/** \ingroup poll
|
2389
2400
|
* Register notification functions for file descriptor additions/removals.
|
2390
2401
|
* These functions will be invoked for every new or removed file descriptor
|
2391
|
-
* that
|
2402
|
+
* that libusb uses as an event source.
|
2392
2403
|
*
|
2393
2404
|
* To remove notifiers, pass NULL values for the function pointers.
|
2394
2405
|
*
|
@@ -2466,7 +2477,7 @@ void usbi_remove_pollfd(struct libusb_context *ctx, int fd)
|
|
2466
2477
|
|
2467
2478
|
/** \ingroup poll
|
2468
2479
|
* Retrieve a list of file descriptors that should be polled by your main loop
|
2469
|
-
* as
|
2480
|
+
* as libusb event sources.
|
2470
2481
|
*
|
2471
2482
|
* The returned list is NULL-terminated and should be freed with free() when
|
2472
2483
|
* done. The actual list contents must not be touched.
|
@@ -2506,7 +2517,7 @@ out:
|
|
2506
2517
|
usbi_mutex_unlock(&ctx->pollfds_lock);
|
2507
2518
|
return (const struct libusb_pollfd **) ret;
|
2508
2519
|
#else
|
2509
|
-
usbi_err(ctx, "external polling of
|
2520
|
+
usbi_err(ctx, "external polling of libusb's internal descriptors "\
|
2510
2521
|
"is not yet supported on Windows platforms");
|
2511
2522
|
return NULL;
|
2512
2523
|
#endif
|