libusb 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.travis.yml +1 -0
  5. data/History.md +8 -0
  6. data/README.md +5 -15
  7. data/Rakefile +8 -1
  8. data/ext/extconf.rb +49 -12
  9. data/ext/{libusb-1.0.19 → libusb-1.0.20}/AUTHORS +12 -1
  10. data/ext/{libusb-1.0.19 → libusb-1.0.20}/COPYING +0 -0
  11. data/ext/{libusb-1.0.19 → libusb-1.0.20}/ChangeLog +18 -2
  12. data/ext/{libusb-1.0.19 → libusb-1.0.20}/INSTALL +0 -0
  13. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.am +0 -0
  14. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Makefile.in +31 -18
  15. data/ext/{libusb-1.0.19 → libusb-1.0.20}/NEWS +0 -0
  16. data/ext/{libusb-1.0.19 → libusb-1.0.20}/PORTING +0 -0
  17. data/ext/{libusb-1.0.19 → libusb-1.0.20}/README +5 -3
  18. data/ext/{libusb-1.0.19 → libusb-1.0.20}/TODO +0 -0
  19. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/common.xcconfig +0 -0
  20. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/config.h +0 -0
  21. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/debug.xcconfig +0 -0
  22. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb.xcconfig +0 -0
  23. data/ext/libusb-1.0.20/Xcode/libusb.xcodeproj/project.pbxproj +865 -0
  24. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_debug.xcconfig +0 -0
  25. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/libusb_release.xcconfig +0 -0
  26. data/ext/{libusb-1.0.19 → libusb-1.0.20}/Xcode/release.xcconfig +0 -0
  27. data/ext/{libusb-1.0.19 → libusb-1.0.20}/aclocal.m4 +35 -32
  28. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/README +0 -0
  29. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/config.h +0 -0
  30. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Android.mk +0 -0
  31. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/Application.mk +0 -0
  32. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/examples.mk +0 -0
  33. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/libusb.mk +0 -0
  34. data/ext/{libusb-1.0.19 → libusb-1.0.20}/android/jni/tests.mk +0 -0
  35. data/ext/{libusb-1.0.19 → libusb-1.0.20}/compile +1 -1
  36. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.guess +13 -160
  37. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.h.in +6 -0
  38. data/ext/{libusb-1.0.19 → libusb-1.0.20}/config.sub +26 -12
  39. data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure +244 -20
  40. data/ext/{libusb-1.0.19 → libusb-1.0.20}/configure.ac +27 -4
  41. data/ext/{libusb-1.0.19 → libusb-1.0.20}/depcomp +1 -1
  42. data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.am +0 -0
  43. data/ext/{libusb-1.0.19 → libusb-1.0.20}/doc/Makefile.in +19 -6
  44. data/ext/libusb-1.0.20/doc/doxygen.cfg.in +2334 -0
  45. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.am +0 -0
  46. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/Makefile.in +19 -6
  47. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp.c +0 -0
  48. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/dpfp_threaded.c +15 -10
  49. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.c +0 -0
  50. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/ezusb.h +0 -0
  51. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/fxload.c +28 -7
  52. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.c +0 -0
  53. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt.h +0 -0
  54. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/getopt/getopt1.c +0 -0
  55. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/hotplugtest.c +21 -3
  56. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/listdevs.c +0 -0
  57. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/sam3u_benchmark.c +0 -0
  58. data/ext/{libusb-1.0.19 → libusb-1.0.20}/examples/xusb.c +2 -1
  59. data/ext/{libusb-1.0.19 → libusb-1.0.20}/install-sh +170 -196
  60. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb-1.0.pc.in +0 -0
  61. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.am +15 -0
  62. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/Makefile.in +192 -53
  63. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/core.c +218 -100
  64. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/descriptor.c +3 -1
  65. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.c +26 -9
  66. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/hotplug.h +8 -0
  67. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/io.c +432 -290
  68. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.def +2 -0
  69. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb-1.0.rc +0 -0
  70. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusb.h +11 -10
  71. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/libusbi.h +106 -29
  72. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.c +27 -67
  73. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/darwin_usb.h +3 -7
  74. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.am +5 -0
  75. data/ext/libusb-1.0.20/libusb/os/haiku/Makefile.in +810 -0
  76. data/ext/libusb-1.0.20/libusb/os/haiku/aclocal.m4 +1193 -0
  77. data/ext/libusb-1.0.20/libusb/os/haiku/compile +347 -0
  78. data/ext/libusb-1.0.20/libusb/os/haiku/config.guess +1421 -0
  79. data/ext/libusb-1.0.20/libusb/os/haiku/config.sub +1807 -0
  80. data/ext/libusb-1.0.20/libusb/os/haiku/configure +17579 -0
  81. data/ext/libusb-1.0.20/libusb/os/haiku/configure.ac +8 -0
  82. data/ext/libusb-1.0.20/libusb/os/haiku/depcomp +791 -0
  83. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_pollfs.cpp +378 -0
  84. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb.h +112 -0
  85. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_backend.cpp +550 -0
  86. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.cpp +255 -0
  87. data/ext/libusb-1.0.20/libusb/os/haiku/haiku_usb_raw.h +180 -0
  88. data/ext/libusb-1.0.20/libusb/os/haiku/install-sh +501 -0
  89. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/ltmain.sh +0 -0
  90. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/libtool.m4 +0 -0
  91. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltoptions.m4 +0 -0
  92. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltsugar.m4 +0 -0
  93. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/ltversion.m4 +0 -0
  94. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/m4/lt~obsolete.m4 +0 -0
  95. data/ext/{libusb-1.0.19 → libusb-1.0.20/libusb/os/haiku}/missing +1 -1
  96. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_netlink.c +4 -4
  97. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_udev.c +1 -2
  98. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.c +46 -49
  99. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/linux_usbfs.h +1 -1
  100. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/netbsd_usb.c +9 -73
  101. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/openbsd_usb.c +9 -73
  102. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.c +2 -0
  103. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_posix.h +0 -0
  104. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.c +3 -1
  105. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/poll_windows.h +0 -0
  106. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.c +3 -3
  107. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_posix.h +0 -0
  108. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.c +3 -1
  109. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/threads_windows.h +0 -0
  110. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.c +87 -250
  111. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/wince_usb.h +0 -0
  112. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_common.h +1 -1
  113. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.c +267 -181
  114. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/os/windows_usb.h +22 -7
  115. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/strerror.c +5 -2
  116. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/sync.c +2 -1
  117. data/ext/{libusb-1.0.19 → libusb-1.0.20}/libusb/version.h +1 -1
  118. data/ext/libusb-1.0.20/libusb/version_nano.h +1 -0
  119. data/ext/libusb-1.0.20/ltmain.sh +9655 -0
  120. data/ext/libusb-1.0.20/m4/libtool.m4 +7992 -0
  121. data/ext/libusb-1.0.20/m4/ltoptions.m4 +384 -0
  122. data/ext/libusb-1.0.20/m4/ltsugar.m4 +123 -0
  123. data/ext/libusb-1.0.20/m4/ltversion.m4 +23 -0
  124. data/ext/libusb-1.0.20/m4/lt~obsolete.m4 +98 -0
  125. data/ext/libusb-1.0.20/missing +215 -0
  126. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.am +0 -0
  127. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/Makefile.in +19 -6
  128. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/libusb_testlib.h +0 -0
  129. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/stress.c +0 -0
  130. data/ext/{libusb-1.0.19 → libusb-1.0.20}/tests/testlib.c +0 -0
  131. data/lib/libusb.rb +1 -0
  132. data/lib/libusb/call.rb +1 -0
  133. data/lib/libusb/context.rb +5 -2
  134. data/lib/libusb/stdio.rb +25 -0
  135. data/lib/libusb/version_gem.rb +1 -1
  136. data/libusb.gemspec +2 -1
  137. metadata +152 -115
  138. metadata.gz.sig +0 -0
  139. data/ext/libusb-1.0.19/Xcode/libusb.xcodeproj/project.pbxproj +0 -1
  140. data/ext/libusb-1.0.19/doc/doxygen.cfg.in +0 -1288
  141. data/ext/libusb-1.0.19/libusb/version_nano.h +0 -1
@@ -18,6 +18,8 @@
18
18
  *
19
19
  */
20
20
 
21
+ #include <config.h>
22
+
21
23
  #include <unistd.h>
22
24
  #include <fcntl.h>
23
25
  #include <errno.h>
@@ -40,6 +40,8 @@
40
40
  * with a fake pipe. The read/write functions are only meant to be used in that
41
41
  * context.
42
42
  */
43
+ #include <config.h>
44
+
43
45
  #include <errno.h>
44
46
  #include <stdio.h>
45
47
  #include <stdlib.h>
@@ -331,7 +333,7 @@ struct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer
331
333
  wfd.cancel_fn = cancel_fn;
332
334
 
333
335
  if ((access_mode != RW_READ) && (access_mode != RW_WRITE)) {
334
- usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported.\n"
336
+ usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported. "
335
337
  "If you want to poll for R/W simultaneously, create multiple fds from the same handle.");
336
338
  return INVALID_WINFD;
337
339
  }
@@ -19,10 +19,10 @@
19
19
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
20
  */
21
21
 
22
+ #include <config.h>
23
+
22
24
  #if defined(__linux__) || defined(__OpenBSD__)
23
- # if defined(__linux__)
24
- # define _GNU_SOURCE
25
- # else
25
+ # if defined(__OpenBSD__)
26
26
  # define _BSD_SOURCE
27
27
  # endif
28
28
  # include <unistd.h>
@@ -19,6 +19,7 @@
19
19
  */
20
20
 
21
21
  #include <config.h>
22
+
22
23
  #include <objbase.h>
23
24
  #include <errno.h>
24
25
  #include <stdarg.h>
@@ -185,7 +186,8 @@ int usbi_cond_timedwait(usbi_cond_t *cond,
185
186
  // GetSystemTimeAsFileTime() is not available on CE
186
187
  SYSTEMTIME st;
187
188
  GetSystemTime(&st);
188
- SystemTimeToFileTime(&st, &filetime);
189
+ if (!SystemTimeToFileTime(&st, &filetime))
190
+ return 0;
189
191
  rtime.LowPart = filetime.dwLowDateTime;
190
192
  rtime.HighPart = filetime.dwHighDateTime;
191
193
  rtime.QuadPart -= epoch_time;
@@ -22,32 +22,19 @@
22
22
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
23
  */
24
24
 
25
- #include <libusbi.h>
25
+ #include <config.h>
26
26
 
27
27
  #include <stdint.h>
28
- #include <errno.h>
29
28
  #include <inttypes.h>
30
29
 
30
+ #include "libusbi.h"
31
31
  #include "wince_usb.h"
32
32
 
33
- // Forward declares
34
- static int wince_clock_gettime(int clk_id, struct timespec *tp);
35
- unsigned __stdcall wince_clock_gettime_threaded(void* param);
36
-
37
33
  // Global variables
38
34
  uint64_t hires_frequency, hires_ticks_to_ps;
39
- int errno;
40
- const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime
35
+ const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime
41
36
  int windows_version = WINDOWS_CE;
42
37
  static int concurrent_usage = -1;
43
- // Timer thread
44
- // NB: index 0 is for monotonic and 1 is for the thread exit event
45
- HANDLE timer_thread = NULL;
46
- HANDLE timer_mutex = NULL;
47
- struct timespec timer_tp;
48
- volatile LONG request_count[2] = {0, 1}; // last one must be > 0
49
- HANDLE timer_request[2] = { NULL, NULL };
50
- HANDLE timer_response = NULL;
51
38
  HANDLE driver_handle = INVALID_HANDLE_VALUE;
52
39
 
53
40
  /*
@@ -65,9 +52,9 @@ static char* windows_error_str(uint32_t retval)
65
52
  uint32_t error_code, format_error;
66
53
 
67
54
  error_code = retval?retval:GetLastError();
68
-
55
+
69
56
  safe_stprintf(wErr_string, ERR_BUFFER_SIZE, _T("[%d] "), error_code);
70
-
57
+
71
58
  size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code,
72
59
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &wErr_string[safe_tcslen(wErr_string)],
73
60
  ERR_BUFFER_SIZE - (DWORD)safe_tcslen(wErr_string), NULL);
@@ -94,11 +81,11 @@ static char* windows_error_str(uint32_t retval)
94
81
 
95
82
  static struct wince_device_priv *_device_priv(struct libusb_device *dev)
96
83
  {
97
- return (struct wince_device_priv *) dev->os_priv;
84
+ return (struct wince_device_priv *) dev->os_priv;
98
85
  }
99
86
 
100
87
  // ceusbkwrapper to libusb error code mapping
101
- static int translate_driver_error(int error)
88
+ static int translate_driver_error(int error)
102
89
  {
103
90
  switch (error) {
104
91
  case ERROR_INVALID_PARAMETER:
@@ -113,7 +100,7 @@ static int translate_driver_error(int error)
113
100
  case ERROR_BUSY:
114
101
  return LIBUSB_ERROR_BUSY;
115
102
 
116
- // Error codes that are either unexpected, or have
103
+ // Error codes that are either unexpected, or have
117
104
  // no suitable LIBUSB_ERROR equivilant.
118
105
  case ERROR_CANCELLED:
119
106
  case ERROR_INTERNAL_ERROR:
@@ -149,8 +136,9 @@ static int init_dllimports()
149
136
  return LIBUSB_SUCCESS;
150
137
  }
151
138
 
152
- static int init_device(struct libusb_device *dev, UKW_DEVICE drv_dev,
153
- unsigned char bus_addr, unsigned char dev_addr)
139
+ static int init_device(
140
+ struct libusb_device *dev, UKW_DEVICE drv_dev,
141
+ unsigned char bus_addr, unsigned char dev_addr)
154
142
  {
155
143
  struct wince_device_priv *priv = _device_priv(dev);
156
144
  int r = LIBUSB_SUCCESS;
@@ -168,8 +156,9 @@ static int init_device(struct libusb_device *dev, UKW_DEVICE drv_dev,
168
156
  // Internal API functions
169
157
  static int wince_init(struct libusb_context *ctx)
170
158
  {
171
- int i, r = LIBUSB_ERROR_OTHER;
159
+ int r = LIBUSB_ERROR_OTHER;
172
160
  HANDLE semaphore;
161
+ LARGE_INTEGER li_frequency;
173
162
  TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID)
174
163
 
175
164
  _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)GetCurrentProcessId()&0xFFFFFFFF);
@@ -208,37 +197,17 @@ static int wince_init(struct libusb_context *ctx)
208
197
  goto init_exit;
209
198
  }
210
199
 
211
- // Windows CE doesn't have a way of specifying thread affinity, so this code
212
- // just has to hope QueryPerformanceCounter doesn't report different values when
213
- // running on different cores.
214
- r = LIBUSB_ERROR_NO_MEM;
215
- for (i = 0; i < 2; i++) {
216
- timer_request[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
217
- if (timer_request[i] == NULL) {
218
- usbi_err(ctx, "could not create timer request event %d - aborting", i);
219
- goto init_exit;
220
- }
221
- }
222
- timer_response = CreateSemaphore(NULL, 0, MAX_TIMER_SEMAPHORES, NULL);
223
- if (timer_response == NULL) {
224
- usbi_err(ctx, "could not create timer response semaphore - aborting");
225
- goto init_exit;
226
- }
227
- timer_mutex = CreateMutex(NULL, FALSE, NULL);
228
- if (timer_mutex == NULL) {
229
- usbi_err(ctx, "could not create timer mutex - aborting");
230
- goto init_exit;
231
- }
232
- timer_thread = CreateThread(NULL, 0, wince_clock_gettime_threaded, NULL, 0, NULL);
233
- if (timer_thread == NULL) {
234
- usbi_err(ctx, "Unable to create timer thread - aborting");
235
- goto init_exit;
236
- }
237
-
238
- // Wait for timer thread to init before continuing.
239
- if (WaitForSingleObject(timer_response, INFINITE) != WAIT_OBJECT_0) {
240
- usbi_err(ctx, "Failed to wait for timer thread to become ready - aborting");
241
- goto init_exit;
200
+ // find out if we have access to a monotonic (hires) timer
201
+ if (QueryPerformanceFrequency(&li_frequency)) {
202
+ hires_frequency = li_frequency.QuadPart;
203
+ // The hires frequency can go as high as 4 GHz, so we'll use a conversion
204
+ // to picoseconds to compute the tv_nsecs part in clock_gettime
205
+ hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency;
206
+ usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency);
207
+ } else {
208
+ usbi_dbg("no hires timer available on this platform");
209
+ hires_frequency = 0;
210
+ hires_ticks_to_ps = UINT64_C(0);
242
211
  }
243
212
  }
244
213
  // At this stage, either we went through full init successfully, or didn't need to
@@ -250,30 +219,6 @@ init_exit: // Holds semaphore here.
250
219
  UkwCloseDriver(driver_handle);
251
220
  driver_handle = INVALID_HANDLE_VALUE;
252
221
  }
253
- if (timer_thread) {
254
- SetEvent(timer_request[1]); // actually the signal to quit the thread.
255
- if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) {
256
- usbi_warn(ctx, "could not wait for timer thread to quit");
257
- TerminateThread(timer_thread, 1); // shouldn't happen, but we're destroying
258
- // all objects it might have held anyway.
259
- }
260
- CloseHandle(timer_thread);
261
- timer_thread = NULL;
262
- }
263
- for (i = 0; i < 2; i++) {
264
- if (timer_request[i]) {
265
- CloseHandle(timer_request[i]);
266
- timer_request[i] = NULL;
267
- }
268
- }
269
- if (timer_response) {
270
- CloseHandle(timer_response);
271
- timer_response = NULL;
272
- }
273
- if (timer_mutex) {
274
- CloseHandle(timer_mutex);
275
- timer_mutex = NULL;
276
- }
277
222
  }
278
223
 
279
224
  if (r != LIBUSB_SUCCESS)
@@ -286,7 +231,6 @@ init_exit: // Holds semaphore here.
286
231
 
287
232
  static void wince_exit(void)
288
233
  {
289
- int i;
290
234
  HANDLE semaphore;
291
235
  TCHAR sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID)
292
236
 
@@ -307,29 +251,6 @@ static void wince_exit(void)
307
251
  if (--concurrent_usage < 0) { // Last exit
308
252
  exit_polling();
309
253
 
310
- if (timer_thread) {
311
- SetEvent(timer_request[1]); // actually the signal to quit the thread.
312
- if (WAIT_OBJECT_0 != WaitForSingleObject(timer_thread, INFINITE)) {
313
- usbi_dbg("could not wait for timer thread to quit");
314
- TerminateThread(timer_thread, 1);
315
- }
316
- CloseHandle(timer_thread);
317
- timer_thread = NULL;
318
- }
319
- for (i = 0; i < 2; i++) {
320
- if (timer_request[i]) {
321
- CloseHandle(timer_request[i]);
322
- timer_request[i] = NULL;
323
- }
324
- }
325
- if (timer_response) {
326
- CloseHandle(timer_response);
327
- timer_response = NULL;
328
- }
329
- if (timer_mutex) {
330
- CloseHandle(timer_mutex);
331
- timer_mutex = NULL;
332
- }
333
254
  if (driver_handle != INVALID_HANDLE_VALUE) {
334
255
  UkwCloseDriver(driver_handle);
335
256
  driver_handle = INVALID_HANDLE_VALUE;
@@ -372,7 +293,7 @@ static int wince_get_device_list(
372
293
  if (dev) {
373
294
  usbi_dbg("using existing device for %d/%d (session %ld)",
374
295
  bus_addr, dev_addr, session_id);
375
- // Release just this element in the device list (as we already hold a
296
+ // Release just this element in the device list (as we already hold a
376
297
  // reference to it).
377
298
  UkwReleaseDeviceList(driver_handle, &devices[i], 1);
378
299
  release_list_offset++;
@@ -404,7 +325,7 @@ err_out:
404
325
  *discdevs = new_devices;
405
326
  safe_unref_device(dev);
406
327
  // Release the remainder of the unprocessed device list.
407
- // The devices added to new_devices already will still be passed up to libusb,
328
+ // The devices added to new_devices already will still be passed up to libusb,
408
329
  // which can dispose of them at its leisure.
409
330
  UkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset);
410
331
  return r;
@@ -423,8 +344,8 @@ static void wince_close(struct libusb_device_handle *handle)
423
344
  }
424
345
 
425
346
  static int wince_get_device_descriptor(
426
- struct libusb_device *device,
427
- unsigned char *buffer, int *host_endian)
347
+ struct libusb_device *device,
348
+ unsigned char *buffer, int *host_endian)
428
349
  {
429
350
  struct wince_device_priv *priv = _device_priv(device);
430
351
 
@@ -461,8 +382,8 @@ static int wince_get_config_descriptor(
461
382
  }
462
383
 
463
384
  static int wince_get_configuration(
464
- struct libusb_device_handle *handle,
465
- int *config)
385
+ struct libusb_device_handle *handle,
386
+ int *config)
466
387
  {
467
388
  struct wince_device_priv *priv = _device_priv(handle->dev);
468
389
  UCHAR cv = 0;
@@ -578,19 +499,17 @@ static int wince_attach_kernel_driver(
578
499
  struct wince_device_priv *priv = _device_priv(handle->dev);
579
500
  if (!UkwAttachKernelDriver(priv->dev, interface_number)) {
580
501
  return translate_driver_error(GetLastError());
581
- }
502
+ }
582
503
  return LIBUSB_SUCCESS;
583
504
  }
584
505
 
585
- static void wince_destroy_device(
586
- struct libusb_device *dev)
506
+ static void wince_destroy_device(struct libusb_device *dev)
587
507
  {
588
508
  struct wince_device_priv *priv = _device_priv(dev);
589
509
  UkwReleaseDeviceList(driver_handle, &priv->dev, 1);
590
510
  }
591
511
 
592
- static void wince_clear_transfer_priv(
593
- struct usbi_transfer *itransfer)
512
+ static void wince_clear_transfer_priv(struct usbi_transfer *itransfer)
594
513
  {
595
514
  struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer);
596
515
  struct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd);
@@ -600,13 +519,12 @@ static void wince_clear_transfer_priv(
600
519
  usbi_free_fd(&transfer_priv->pollable_fd);
601
520
  }
602
521
 
603
- static int wince_cancel_transfer(
604
- struct usbi_transfer *itransfer)
522
+ static int wince_cancel_transfer(struct usbi_transfer *itransfer)
605
523
  {
606
524
  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
607
525
  struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev);
608
526
  struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer);
609
-
527
+
610
528
  if (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT)) {
611
529
  return translate_driver_error(GetLastError());
612
530
  }
@@ -656,7 +574,7 @@ static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer
656
574
 
657
575
  ret = UkwIssueControlTransfer(priv->dev, flags, setup, buf, bufLen, &transfer->actual_length, wfd.overlapped);
658
576
  } else {
659
- ret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer,
577
+ ret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer,
660
578
  transfer->length, &transfer->actual_length, wfd.overlapped);
661
579
  }
662
580
  if (!ret) {
@@ -667,7 +585,6 @@ static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer
667
585
  return libusbErr;
668
586
  }
669
587
  usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT);
670
- itransfer->flags |= USBI_TRANSFER_UPDATED_FDS;
671
588
 
672
589
  return LIBUSB_SUCCESS;
673
590
  }
@@ -677,8 +594,7 @@ static int wince_submit_iso_transfer(struct usbi_transfer *itransfer)
677
594
  return LIBUSB_ERROR_NOT_SUPPORTED;
678
595
  }
679
596
 
680
- static int wince_submit_transfer(
681
- struct usbi_transfer *itransfer)
597
+ static int wince_submit_transfer(struct usbi_transfer *itransfer)
682
598
  {
683
599
  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
684
600
 
@@ -697,7 +613,9 @@ static int wince_submit_transfer(
697
613
  }
698
614
  }
699
615
 
700
- static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size)
616
+ static void wince_transfer_callback(
617
+ struct usbi_transfer *itransfer,
618
+ uint32_t io_result, uint32_t io_size)
701
619
  {
702
620
  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
703
621
  struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer);
@@ -706,10 +624,10 @@ static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io
706
624
 
707
625
  usbi_dbg("handling I/O completion with errcode %d", io_result);
708
626
 
709
- if (io_result == ERROR_NOT_SUPPORTED &&
627
+ if (io_result == ERROR_NOT_SUPPORTED &&
710
628
  transfer->type != LIBUSB_TRANSFER_TYPE_CONTROL) {
711
- /* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper
712
- * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the
629
+ /* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper
630
+ * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the
713
631
  * endpoint isn't actually stalled.
714
632
  *
715
633
  * One example of this is that some devices will occasionally fail to reply to an IN
@@ -723,7 +641,7 @@ static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io
723
641
  usbi_dbg("checking I/O completion with errcode ERROR_NOT_SUPPORTED is really a stall");
724
642
  if (UkwIsPipeHalted(priv->dev, transfer->endpoint, &halted)) {
725
643
  /* Pipe status retrieved, so now request endpoint status by sending a GET_STATUS
726
- * control request to the device. This is done synchronously, which is a bit
644
+ * control request to the device. This is done synchronously, which is a bit
727
645
  * naughty, but this is a special corner case.
728
646
  */
729
647
  WORD wStatus = 0;
@@ -792,7 +710,9 @@ static void wince_transfer_callback(struct usbi_transfer *itransfer, uint32_t io
792
710
  }
793
711
  }
794
712
 
795
- static void wince_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size)
713
+ static void wince_handle_callback(
714
+ struct usbi_transfer *itransfer,
715
+ uint32_t io_result, uint32_t io_size)
796
716
  {
797
717
  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
798
718
 
@@ -804,7 +724,7 @@ static void wince_handle_callback (struct usbi_transfer *itransfer, uint32_t io_
804
724
  wince_transfer_callback (itransfer, io_result, io_size);
805
725
  break;
806
726
  case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
807
- return LIBUSB_ERROR_NOT_SUPPORTED;
727
+ break;
808
728
  default:
809
729
  usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type);
810
730
  }
@@ -853,9 +773,11 @@ static int wince_handle_events(
853
773
  wince_handle_callback(transfer, io_result, io_size);
854
774
  } else if (found) {
855
775
  usbi_err(ctx, "matching transfer for fd %x has not completed", fds[i]);
776
+ usbi_mutex_unlock(&ctx->open_devs_lock);
856
777
  return LIBUSB_ERROR_OTHER;
857
778
  } else {
858
779
  usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]);
780
+ usbi_mutex_unlock(&ctx->open_devs_lock);
859
781
  return LIBUSB_ERROR_NOT_FOUND;
860
782
  }
861
783
  }
@@ -867,105 +789,20 @@ static int wince_handle_events(
867
789
  /*
868
790
  * Monotonic and real time functions
869
791
  */
870
- unsigned __stdcall wince_clock_gettime_threaded(void* param)
871
- {
872
- LARGE_INTEGER hires_counter, li_frequency;
873
- LONG nb_responses;
874
- int timer_index;
875
-
876
- // Init - find out if we have access to a monotonic (hires) timer
877
- if (!QueryPerformanceFrequency(&li_frequency)) {
878
- usbi_dbg("no hires timer available on this platform");
879
- hires_frequency = 0;
880
- hires_ticks_to_ps = UINT64_C(0);
881
- } else {
882
- hires_frequency = li_frequency.QuadPart;
883
- // The hires frequency can go as high as 4 GHz, so we'll use a conversion
884
- // to picoseconds to compute the tv_nsecs part in clock_gettime
885
- hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency;
886
- usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency);
887
- }
888
-
889
- // Signal wince_init() that we're ready to service requests
890
- if (ReleaseSemaphore(timer_response, 1, NULL) == 0) {
891
- usbi_dbg("unable to release timer semaphore: %s", windows_error_str(0));
892
- }
893
-
894
- // Main loop - wait for requests
895
- while (1) {
896
- timer_index = WaitForMultipleObjects(2, timer_request, FALSE, INFINITE) - WAIT_OBJECT_0;
897
- if ( (timer_index != 0) && (timer_index != 1) ) {
898
- usbi_dbg("failure to wait on requests: %s", windows_error_str(0));
899
- continue;
900
- }
901
- if (request_count[timer_index] == 0) {
902
- // Request already handled
903
- ResetEvent(timer_request[timer_index]);
904
- // There's still a possiblity that a thread sends a request between the
905
- // time we test request_count[] == 0 and we reset the event, in which case
906
- // the request would be ignored. The simple solution to that is to test
907
- // request_count again and process requests if non zero.
908
- if (request_count[timer_index] == 0)
909
- continue;
910
- }
911
- switch (timer_index) {
912
- case 0:
913
- WaitForSingleObject(timer_mutex, INFINITE);
914
- // Requests to this thread are for hires always
915
- if (QueryPerformanceCounter(&hires_counter) != 0) {
916
- timer_tp.tv_sec = (long)(hires_counter.QuadPart / hires_frequency);
917
- timer_tp.tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency)/1000) * hires_ticks_to_ps);
918
- } else {
919
- // Fallback to real-time if we can't get monotonic value
920
- // Note that real-time clock does not wait on the mutex or this thread.
921
- wince_clock_gettime(USBI_CLOCK_REALTIME, &timer_tp);
922
- }
923
- ReleaseMutex(timer_mutex);
924
-
925
- nb_responses = InterlockedExchange((LONG*)&request_count[0], 0);
926
- if ( (nb_responses)
927
- && (ReleaseSemaphore(timer_response, nb_responses, NULL) == 0) ) {
928
- usbi_dbg("unable to release timer semaphore: %s", windows_error_str(0));
929
- }
930
- continue;
931
- case 1: // time to quit
932
- usbi_dbg("timer thread quitting");
933
- return 0;
934
- }
935
- }
936
- usbi_dbg("ERROR: broken timer thread");
937
- return 1;
938
- }
939
-
940
792
  static int wince_clock_gettime(int clk_id, struct timespec *tp)
941
793
  {
942
- FILETIME filetime;
794
+ LARGE_INTEGER hires_counter;
943
795
  ULARGE_INTEGER rtime;
944
- DWORD r;
796
+ FILETIME filetime;
945
797
  SYSTEMTIME st;
946
798
  switch(clk_id) {
947
799
  case USBI_CLOCK_MONOTONIC:
948
- if (hires_frequency != 0) {
949
- while (1) {
950
- InterlockedIncrement((LONG*)&request_count[0]);
951
- SetEvent(timer_request[0]);
952
- r = WaitForSingleObject(timer_response, TIMER_REQUEST_RETRY_MS);
953
- switch(r) {
954
- case WAIT_OBJECT_0:
955
- WaitForSingleObject(timer_mutex, INFINITE);
956
- *tp = timer_tp;
957
- ReleaseMutex(timer_mutex);
958
- return LIBUSB_SUCCESS;
959
- case WAIT_TIMEOUT:
960
- usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?");
961
- break; // Retry until successful
962
- default:
963
- usbi_dbg("WaitForSingleObject failed: %s", windows_error_str(0));
964
- return LIBUSB_ERROR_OTHER;
965
- }
966
- }
800
+ if (hires_frequency != 0 && QueryPerformanceCounter(&hires_counter)) {
801
+ tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency);
802
+ tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps);
803
+ return LIBUSB_SUCCESS;
967
804
  }
968
- // Fall through and return real-time if monotonic was not detected @ timer init
805
+ // Fall through and return real-time if monotonic read failed or was not detected @ init
969
806
  case USBI_CLOCK_REALTIME:
970
807
  // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx
971
808
  // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00
@@ -985,48 +822,48 @@ static int wince_clock_gettime(int clk_id, struct timespec *tp)
985
822
  }
986
823
 
987
824
  const struct usbi_os_backend wince_backend = {
988
- "Windows CE",
989
- 0,
990
- wince_init,
991
- wince_exit,
825
+ "Windows CE",
826
+ 0,
827
+ wince_init,
828
+ wince_exit,
992
829
 
993
- wince_get_device_list,
830
+ wince_get_device_list,
994
831
  NULL, /* hotplug_poll */
995
- wince_open,
996
- wince_close,
832
+ wince_open,
833
+ wince_close,
997
834
 
998
- wince_get_device_descriptor,
999
- wince_get_active_config_descriptor,
1000
- wince_get_config_descriptor,
835
+ wince_get_device_descriptor,
836
+ wince_get_active_config_descriptor,
837
+ wince_get_config_descriptor,
1001
838
  NULL, /* get_config_descriptor_by_value() */
1002
839
 
1003
- wince_get_configuration,
1004
- wince_set_configuration,
1005
- wince_claim_interface,
1006
- wince_release_interface,
840
+ wince_get_configuration,
841
+ wince_set_configuration,
842
+ wince_claim_interface,
843
+ wince_release_interface,
1007
844
 
1008
- wince_set_interface_altsetting,
1009
- wince_clear_halt,
1010
- wince_reset_device,
845
+ wince_set_interface_altsetting,
846
+ wince_clear_halt,
847
+ wince_reset_device,
1011
848
 
1012
849
  NULL, /* alloc_streams */
1013
850
  NULL, /* free_streams */
1014
851
 
1015
- wince_kernel_driver_active,
1016
- wince_detach_kernel_driver,
1017
- wince_attach_kernel_driver,
852
+ wince_kernel_driver_active,
853
+ wince_detach_kernel_driver,
854
+ wince_attach_kernel_driver,
1018
855
 
1019
- wince_destroy_device,
856
+ wince_destroy_device,
1020
857
 
1021
- wince_submit_transfer,
1022
- wince_cancel_transfer,
1023
- wince_clear_transfer_priv,
858
+ wince_submit_transfer,
859
+ wince_cancel_transfer,
860
+ wince_clear_transfer_priv,
1024
861
 
1025
- wince_handle_events,
862
+ wince_handle_events,
863
+ NULL, /* handle_transfer_completion() */
1026
864
 
1027
- wince_clock_gettime,
1028
- sizeof(struct wince_device_priv),
1029
- sizeof(struct wince_device_handle_priv),
1030
- sizeof(struct wince_transfer_priv),
1031
- 0,
865
+ wince_clock_gettime,
866
+ sizeof(struct wince_device_priv),
867
+ sizeof(struct wince_device_handle_priv),
868
+ sizeof(struct wince_transfer_priv),
1032
869
  };