Deleted Added
full compact
libusb10_io.c (194676) libusb10_io.c (195560)
1/* $FreeBSD: head/lib/libusb/libusb10_io.c 194676 2009-06-23 01:04:58Z thompsa $ */
1/* $FreeBSD: head/lib/libusb/libusb10_io.c 195560 2009-07-10 14:15:53Z thompsa $ */
2/*-
3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 24 unchanged lines hidden (view full) ---

34#include <errno.h>
35
36#include "libusb20.h"
37#include "libusb20_desc.h"
38#include "libusb20_int.h"
39#include "libusb.h"
40#include "libusb10.h"
41
2/*-
3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 24 unchanged lines hidden (view full) ---

34#include <errno.h>
35
36#include "libusb20.h"
37#include "libusb20_desc.h"
38#include "libusb20_int.h"
39#include "libusb.h"
40#include "libusb10.h"
41
42static int
42UNEXPORTED int
43usb_add_pollfd(libusb_context *ctx, int fd, short events)
44{
45 struct usb_pollfd *pollfd;
46
47 if (ctx == NULL)
48 return (LIBUSB_ERROR_INVALID_PARAM);
49
50 pollfd = malloc(sizeof(*pollfd));
51 if (pollfd == NULL)
52 return (LIBUSB_ERROR_NO_MEM);
53
54 pollfd->pollfd.fd = fd;
55 pollfd->pollfd.events = events;
56
57 pthread_mutex_lock(&ctx->pollfds_lock);
58 TAILQ_INSERT_TAIL(&ctx->pollfds, pollfd, list);
59 pthread_mutex_unlock(&ctx->pollfds_lock);
60
61 if (ctx->fd_added_cb)
62 ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data);
63 return (0);
64}
65
66UNEXPORTED void
67usb_remove_pollfd(libusb_context *ctx, int fd)
68{
69 struct usb_pollfd *pollfd;
70 int found;
71
72 found = 0;
73 pthread_mutex_lock(&ctx->pollfds_lock);
74
75 TAILQ_FOREACH(pollfd, &ctx->pollfds, list) {
76 if (pollfd->pollfd.fd == fd) {
77 found = 1;
78 break ;
79 }
80 }
81
82 if (found == 0) {
83 pthread_mutex_unlock(&ctx->pollfds_lock);
84 return ;
85 }
86
87 TAILQ_REMOVE(&ctx->pollfds, pollfd, list);
88 pthread_mutex_unlock(&ctx->pollfds_lock);
89 free(pollfd);
90
91 if (ctx->fd_removed_cb)
92 ctx->fd_removed_cb(fd, ctx->fd_cb_user_data);
93}
94
95UNEXPORTED void
96usb_handle_transfer_completion(struct usb_transfer *uxfer,
97 enum libusb_transfer_status status)
98{
99 libusb_transfer *xfer;
100 libusb_context *ctx;
101 int len;
102
103 xfer = (struct libusb_transfer *) ((uint8_t *)uxfer +
104 sizeof(struct usb_transfer));
105 ctx = xfer->dev_handle->dev->ctx;
106
107 pthread_mutex_lock(&ctx->flying_transfers_lock);
108 TAILQ_REMOVE(&ctx->flying_transfers, uxfer, list);
109 pthread_mutex_unlock(&ctx->flying_transfers_lock);
110
111 if (status == LIBUSB_TRANSFER_COMPLETED && xfer->flags &
112 LIBUSB_TRANSFER_SHORT_NOT_OK) {
113 len = xfer->length;
114 if (xfer->type == LIBUSB_TRANSFER_TYPE_CONTROL)
115 len -= sizeof(libusb_control_setup);
116 if (len != uxfer->transferred) {
117 status = LIBUSB_TRANSFER_ERROR;
118 }
119 }
120
121 xfer->status = status;
122 xfer->actual_length = uxfer->transferred;
123
124 if (xfer->callback)
125 xfer->callback(xfer);
126 if (xfer->flags & LIBUSB_TRANSFER_FREE_TRANSFER)
127 libusb_free_transfer(xfer);
128
129 pthread_mutex_lock(&ctx->event_waiters_lock);
130 pthread_cond_broadcast(&ctx->event_waiters_cond);
131 pthread_mutex_unlock(&ctx->event_waiters_lock);
132}
133
134UNEXPORTED void
135usb_handle_disconnect(struct libusb_device_handle *devh)
136{
137 struct libusb_context *ctx;
138 struct libusb_transfer *xfer;
139 struct usb_transfer *cur;
140 struct usb_transfer *to_cancel;
141
142 ctx = devh->dev->ctx;
143
144 while (1) {
145 pthread_mutex_lock(&ctx->flying_transfers_lock);
146 to_cancel = NULL;
147 TAILQ_FOREACH(cur, &ctx->flying_transfers, list) {
148 xfer = (struct libusb_transfer *) ((uint8_t *)cur +
149 sizeof(struct usb_transfer));
150 if (xfer->dev_handle == devh) {
151 to_cancel = cur;
152 break ;
153 }
154 }
155 pthread_mutex_unlock(&ctx->flying_transfers_lock);
156
157 if (to_cancel == NULL)
158 break ;
159
160 usb_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE);
161 }
162 return ;
163}
164
165UNEXPORTED int
43get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out)
44{
45 struct timeval timeout;
166get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out)
167{
168 struct timeval timeout;
46 int ret;
47
169
48 ret = libusb_get_next_timeout(ctx, &timeout);
49
50 if (ret) {
170 if (libusb_get_next_timeout(ctx, &timeout)) {
51 if (timerisset(&timeout) == 0)
52 return 1;
53 if (timercmp(&timeout, tv, <) != 0)
54 *out = timeout;
55 else
56 *out = *tv;
57 } else {
58 *out = *tv;
59 }
60
61 return (0);
62}
63
171 if (timerisset(&timeout) == 0)
172 return 1;
173 if (timercmp(&timeout, tv, <) != 0)
174 *out = timeout;
175 else
176 *out = *tv;
177 } else {
178 *out = *tv;
179 }
180
181 return (0);
182}
183
64static int
184UNEXPORTED int
65handle_timeouts(struct libusb_context *ctx)
66{
67 struct timespec sys_ts;
68 struct timeval sys_tv;
69 struct timeval *cur_tv;
70 struct usb_transfer *xfer;
71 struct libusb_transfer *uxfer;
72 int ret;
73
74 GET_CONTEXT(ctx);
75 ret = 0;
76
77 pthread_mutex_lock(&ctx->flying_transfers_lock);
185handle_timeouts(struct libusb_context *ctx)
186{
187 struct timespec sys_ts;
188 struct timeval sys_tv;
189 struct timeval *cur_tv;
190 struct usb_transfer *xfer;
191 struct libusb_transfer *uxfer;
192 int ret;
193
194 GET_CONTEXT(ctx);
195 ret = 0;
196
197 pthread_mutex_lock(&ctx->flying_transfers_lock);
78 if (USB_LIST_EMPTY(&ctx->flying_transfers))
198 if (TAILQ_EMPTY(&ctx->flying_transfers))
79 goto out;
80
81 ret = clock_gettime(CLOCK_MONOTONIC, &sys_ts);
82 TIMESPEC_TO_TIMEVAL(&sys_tv, &sys_ts);
83
199 goto out;
200
201 ret = clock_gettime(CLOCK_MONOTONIC, &sys_ts);
202 TIMESPEC_TO_TIMEVAL(&sys_tv, &sys_ts);
203
84 LIST_FOREACH_ENTRY(xfer, &ctx->flying_transfers, list) {
204 TAILQ_FOREACH(xfer, &ctx->flying_transfers, list) {
85 cur_tv = &xfer->timeout;
86
87 if (timerisset(cur_tv) == 0)
88 goto out;
89
90 if (xfer->flags & USB_TIMED_OUT)
91 continue;
92

--- 6 unchanged lines hidden (view full) ---

99 sizeof(struct usb_transfer));
100 ret = libusb_cancel_transfer(uxfer);
101 }
102out:
103 pthread_mutex_unlock(&ctx->flying_transfers_lock);
104 return (ret);
105}
106
205 cur_tv = &xfer->timeout;
206
207 if (timerisset(cur_tv) == 0)
208 goto out;
209
210 if (xfer->flags & USB_TIMED_OUT)
211 continue;
212

--- 6 unchanged lines hidden (view full) ---

219 sizeof(struct usb_transfer));
220 ret = libusb_cancel_transfer(uxfer);
221 }
222out:
223 pthread_mutex_unlock(&ctx->flying_transfers_lock);
224 return (ret);
225}
226
107static int
227UNEXPORTED int
108handle_events(struct libusb_context *ctx, struct timeval *tv)
109{
110 struct libusb_pollfd *tmppollfd;
111 struct libusb_device_handle *devh;
112 struct usb_pollfd *ipollfd;
228handle_events(struct libusb_context *ctx, struct timeval *tv)
229{
230 struct libusb_pollfd *tmppollfd;
231 struct libusb_device_handle *devh;
232 struct usb_pollfd *ipollfd;
113 struct usb_transfer *cur;
114 struct usb_transfer *cancel;
115 struct libusb_transfer *xfer;
116 struct pollfd *fds;
117 struct pollfd *tfds;
118 nfds_t nfds;
119 int tmpfd;
233 struct pollfd *fds;
234 struct pollfd *tfds;
235 nfds_t nfds;
236 int tmpfd;
120 int tmp;
121 int ret;
122 int timeout;
123 int i;
124
125 GET_CONTEXT(ctx);
237 int ret;
238 int timeout;
239 int i;
240
241 GET_CONTEXT(ctx);
126 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "handle_events enter");
242 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "handle_events enter");
127
128 nfds = 0;
129 i = -1;
130
131 pthread_mutex_lock(&ctx->pollfds_lock);
243
244 nfds = 0;
245 i = -1;
246
247 pthread_mutex_lock(&ctx->pollfds_lock);
132 LIST_FOREACH_ENTRY(ipollfd, &ctx->pollfds, list)
248 TAILQ_FOREACH(ipollfd, &ctx->pollfds, list)
133 nfds++;
134
249 nfds++;
250
135 fds = malloc(sizeof(*fds) * nfds);
251 fds = alloca(sizeof(*fds) * nfds);
136 if (fds == NULL)
137 return (LIBUSB_ERROR_NO_MEM);
138
252 if (fds == NULL)
253 return (LIBUSB_ERROR_NO_MEM);
254
139 LIST_FOREACH_ENTRY(ipollfd, &ctx->pollfds, list) {
255 TAILQ_FOREACH(ipollfd, &ctx->pollfds, list) {
140 tmppollfd = &ipollfd->pollfd;
141 tmpfd = tmppollfd->fd;
142 i++;
143 fds[i].fd = tmpfd;
144 fds[i].events = tmppollfd->events;
145 fds[i].revents = 0;
146 }
147
148 pthread_mutex_unlock(&ctx->pollfds_lock);
149
150 timeout = (tv->tv_sec * 1000) + (tv->tv_usec / 1000);
151 if (tv->tv_usec % 1000)
152 timeout++;
153
154 ret = poll(fds, nfds, timeout);
256 tmppollfd = &ipollfd->pollfd;
257 tmpfd = tmppollfd->fd;
258 i++;
259 fds[i].fd = tmpfd;
260 fds[i].events = tmppollfd->events;
261 fds[i].revents = 0;
262 }
263
264 pthread_mutex_unlock(&ctx->pollfds_lock);
265
266 timeout = (tv->tv_sec * 1000) + (tv->tv_usec / 1000);
267 if (tv->tv_usec % 1000)
268 timeout++;
269
270 ret = poll(fds, nfds, timeout);
155 if (ret == 0) {
156 free(fds);
271 if (ret == 0)
157 return (handle_timeouts(ctx));
272 return (handle_timeouts(ctx));
158 } else if (ret == -1 && errno == EINTR) {
159 free(fds);
273 else if (ret == -1 && errno == EINTR)
160 return (LIBUSB_ERROR_INTERRUPTED);
274 return (LIBUSB_ERROR_INTERRUPTED);
161 } else if (ret < 0) {
162 free(fds);
275 else if (ret < 0)
163 return (LIBUSB_ERROR_IO);
276 return (LIBUSB_ERROR_IO);
164 }
165
166 if (fds[0].revents) {
167 if (ret == 1){
168 ret = 0;
169 goto handled;
170 } else {
171 fds[0].revents = 0;
172 ret--;
173 }
174 }
175
176 pthread_mutex_lock(&ctx->open_devs_lock);
277
278 if (fds[0].revents) {
279 if (ret == 1){
280 ret = 0;
281 goto handled;
282 } else {
283 fds[0].revents = 0;
284 ret--;
285 }
286 }
287
288 pthread_mutex_lock(&ctx->open_devs_lock);
177 for (i = 0 ; i < nfds && ret > 0 ; i++) {
289 for (i = 0, devh = NULL ; i < nfds && ret > 0 ; i++) {
178
179 tfds = &fds[i];
180 if (!tfds->revents)
181 continue;
182
183 ret--;
290
291 tfds = &fds[i];
292 if (!tfds->revents)
293 continue;
294
295 ret--;
184 LIST_FOREACH_ENTRY(devh, &ctx->open_devs, list) {
296 TAILQ_FOREACH(devh, &ctx->open_devs, list) {
185 if (libusb20_dev_get_fd(devh->os_priv) == tfds->fd)
186 break ;
187 }
188
189 if (tfds->revents & POLLERR) {
190 usb_remove_pollfd(ctx, libusb20_dev_get_fd(devh->os_priv));
297 if (libusb20_dev_get_fd(devh->os_priv) == tfds->fd)
298 break ;
299 }
300
301 if (tfds->revents & POLLERR) {
302 usb_remove_pollfd(ctx, libusb20_dev_get_fd(devh->os_priv));
191 usb_handle_disconnect(devh);
303 if (devh != NULL)
304 usb_handle_disconnect(devh);
192 continue ;
193 }
194
195
196 pthread_mutex_lock(&libusb20_lock);
305 continue ;
306 }
307
308
309 pthread_mutex_lock(&libusb20_lock);
197 dprintf(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20_PROCESS");
198 ret = libusb20_dev_process(devh->os_priv);
310 DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "LIBUSB20_PROCESS");
311 if (devh != NULL)
312 ret = libusb20_dev_process(devh->os_priv);
199 pthread_mutex_unlock(&libusb20_lock);
200
201
202 if (ret == 0 || ret == LIBUSB20_ERROR_NO_DEVICE)
203 continue;
204 else if (ret < 0)
205 goto out;
206 }
207
208 ret = 0;
209out:
210 pthread_mutex_unlock(&ctx->open_devs_lock);
211
212handled:
313 pthread_mutex_unlock(&libusb20_lock);
314
315
316 if (ret == 0 || ret == LIBUSB20_ERROR_NO_DEVICE)
317 continue;
318 else if (ret < 0)
319 goto out;
320 }
321
322 ret = 0;
323out:
324 pthread_mutex_unlock(&ctx->open_devs_lock);
325
326handled:
213 free(fds);
214 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "handle_events leave");
327 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "handle_events leave");
215 return ret;
216}
217
218/* Polling and timing */
219
220int
221libusb_try_lock_events(libusb_context * ctx)
222{
223 int ret;
224
225 GET_CONTEXT(ctx);
328 return ret;
329}
330
331/* Polling and timing */
332
333int
334libusb_try_lock_events(libusb_context * ctx)
335{
336 int ret;
337
338 GET_CONTEXT(ctx);
226 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_try_lock_events enter");
339 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_try_lock_events enter");
227
228 pthread_mutex_lock(&ctx->pollfd_modify_lock);
229 ret = ctx->pollfd_modify;
230 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
231
232 if (ret != 0)
233 return (1);
234
235 ret = pthread_mutex_trylock(&ctx->events_lock);
236
237 if (ret != 0)
238 return (1);
239
240 ctx->event_handler_active = 1;
241
340
341 pthread_mutex_lock(&ctx->pollfd_modify_lock);
342 ret = ctx->pollfd_modify;
343 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
344
345 if (ret != 0)
346 return (1);
347
348 ret = pthread_mutex_trylock(&ctx->events_lock);
349
350 if (ret != 0)
351 return (1);
352
353 ctx->event_handler_active = 1;
354
242 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_try_lock_events leave");
355 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_try_lock_events leave");
243 return (0);
244}
245
246void
247libusb_lock_events(libusb_context * ctx)
248{
249 GET_CONTEXT(ctx);
356 return (0);
357}
358
359void
360libusb_lock_events(libusb_context * ctx)
361{
362 GET_CONTEXT(ctx);
250 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_events enter");
363 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_events enter");
251
252 pthread_mutex_lock(&ctx->events_lock);
253 ctx->event_handler_active = 1;
254
364
365 pthread_mutex_lock(&ctx->events_lock);
366 ctx->event_handler_active = 1;
367
255 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_events leave");
368 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_events leave");
256}
257
258void
259libusb_unlock_events(libusb_context * ctx)
260{
261 GET_CONTEXT(ctx);
369}
370
371void
372libusb_unlock_events(libusb_context * ctx)
373{
374 GET_CONTEXT(ctx);
262 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_events enter");
375 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_events enter");
263
264 ctx->event_handler_active = 0;
265 pthread_mutex_unlock(&ctx->events_lock);
266
267 pthread_mutex_lock(&ctx->event_waiters_lock);
268 pthread_cond_broadcast(&ctx->event_waiters_cond);
269 pthread_mutex_unlock(&ctx->event_waiters_lock);
270
376
377 ctx->event_handler_active = 0;
378 pthread_mutex_unlock(&ctx->events_lock);
379
380 pthread_mutex_lock(&ctx->event_waiters_lock);
381 pthread_cond_broadcast(&ctx->event_waiters_cond);
382 pthread_mutex_unlock(&ctx->event_waiters_lock);
383
271 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_events leave");
384 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_events leave");
272}
273
274int
275libusb_event_handling_ok(libusb_context * ctx)
276{
277 int ret;
278
279 GET_CONTEXT(ctx);
385}
386
387int
388libusb_event_handling_ok(libusb_context * ctx)
389{
390 int ret;
391
392 GET_CONTEXT(ctx);
280 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handling_ok enter");
393 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handling_ok enter");
281
282 pthread_mutex_lock(&ctx->pollfd_modify_lock);
283 ret = ctx->pollfd_modify;
284 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
285
286 if (ret != 0)
287 return (0);
288
394
395 pthread_mutex_lock(&ctx->pollfd_modify_lock);
396 ret = ctx->pollfd_modify;
397 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
398
399 if (ret != 0)
400 return (0);
401
289 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handling_ok leave");
402 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handling_ok leave");
290 return (1);
291}
292
293int
294libusb_event_handler_active(libusb_context * ctx)
295{
296 int ret;
297
298 GET_CONTEXT(ctx);
403 return (1);
404}
405
406int
407libusb_event_handler_active(libusb_context * ctx)
408{
409 int ret;
410
411 GET_CONTEXT(ctx);
299 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handler_active enter");
412 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handler_active enter");
300
301 pthread_mutex_lock(&ctx->pollfd_modify_lock);
302 ret = ctx->pollfd_modify;
303 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
304
305 if (ret != 0)
306 return (1);
307
413
414 pthread_mutex_lock(&ctx->pollfd_modify_lock);
415 ret = ctx->pollfd_modify;
416 pthread_mutex_unlock(&ctx->pollfd_modify_lock);
417
418 if (ret != 0)
419 return (1);
420
308 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handler_active leave");
421 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_event_handler_active leave");
309 return (ctx->event_handler_active);
310}
311
312void
313libusb_lock_event_waiters(libusb_context * ctx)
314{
315 GET_CONTEXT(ctx);
422 return (ctx->event_handler_active);
423}
424
425void
426libusb_lock_event_waiters(libusb_context * ctx)
427{
428 GET_CONTEXT(ctx);
316 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_event_waiters enter");
429 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_event_waiters enter");
317
318 pthread_mutex_lock(&ctx->event_waiters_lock);
319
430
431 pthread_mutex_lock(&ctx->event_waiters_lock);
432
320 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_event_waiters leave");
433 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_lock_event_waiters leave");
321}
322
323void
324libusb_unlock_event_waiters(libusb_context * ctx)
325{
326 GET_CONTEXT(ctx);
434}
435
436void
437libusb_unlock_event_waiters(libusb_context * ctx)
438{
439 GET_CONTEXT(ctx);
327 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_event_waiters enter");
440 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_event_waiters enter");
328
329 pthread_mutex_unlock(&ctx->event_waiters_lock);
330
441
442 pthread_mutex_unlock(&ctx->event_waiters_lock);
443
331 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_event_waiters leave");
444 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_unlock_event_waiters leave");
332}
333
334int
335libusb_wait_for_event(libusb_context * ctx, struct timeval *tv)
336{
337 int ret;
338 struct timespec ts;
339
340 GET_CONTEXT(ctx);
445}
446
447int
448libusb_wait_for_event(libusb_context * ctx, struct timeval *tv)
449{
450 int ret;
451 struct timespec ts;
452
453 GET_CONTEXT(ctx);
341 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_wait_for_event enter");
454 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_wait_for_event enter");
342
343 if (tv == NULL) {
344 pthread_cond_wait(&ctx->event_waiters_cond,
345 &ctx->event_waiters_lock);
346 return (0);
347 }
348
349 ret = clock_gettime(CLOCK_REALTIME, &ts);

--- 8 unchanged lines hidden (view full) ---

358 }
359
360 ret = pthread_cond_timedwait(&ctx->event_waiters_cond,
361 &ctx->event_waiters_lock, &ts);
362
363 if (ret == ETIMEDOUT)
364 return (1);
365
455
456 if (tv == NULL) {
457 pthread_cond_wait(&ctx->event_waiters_cond,
458 &ctx->event_waiters_lock);
459 return (0);
460 }
461
462 ret = clock_gettime(CLOCK_REALTIME, &ts);

--- 8 unchanged lines hidden (view full) ---

471 }
472
473 ret = pthread_cond_timedwait(&ctx->event_waiters_cond,
474 &ctx->event_waiters_lock, &ts);
475
476 if (ret == ETIMEDOUT)
477 return (1);
478
366 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_wait_for_event leave");
479 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_wait_for_event leave");
367 return (0);
368}
369
370int
371libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv)
372{
480 return (0);
481}
482
483int
484libusb_handle_events_timeout(libusb_context * ctx, struct timeval *tv)
485{
373 struct timeval timeout;
374 struct timeval poll_timeout;
375 int ret;
376
377 GET_CONTEXT(ctx);
486 struct timeval poll_timeout;
487 int ret;
488
489 GET_CONTEXT(ctx);
378 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout enter");
490 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout enter");
379
380 ret = get_next_timeout(ctx, tv, &poll_timeout);
381 if (ret != 0) {
382 return handle_timeouts(ctx);
383 }
384retry:
385 if (libusb_try_lock_events(ctx) == 0) {
386 ret = handle_events(ctx, &poll_timeout);

--- 10 unchanged lines hidden (view full) ---

397 ret = libusb_wait_for_event(ctx, &poll_timeout);
398 libusb_unlock_event_waiters(ctx);
399
400 if (ret < 0)
401 return ret;
402 else if (ret == 1)
403 return (handle_timeouts(ctx));
404
491
492 ret = get_next_timeout(ctx, tv, &poll_timeout);
493 if (ret != 0) {
494 return handle_timeouts(ctx);
495 }
496retry:
497 if (libusb_try_lock_events(ctx) == 0) {
498 ret = handle_events(ctx, &poll_timeout);

--- 10 unchanged lines hidden (view full) ---

509 ret = libusb_wait_for_event(ctx, &poll_timeout);
510 libusb_unlock_event_waiters(ctx);
511
512 if (ret < 0)
513 return ret;
514 else if (ret == 1)
515 return (handle_timeouts(ctx));
516
405 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout leave");
517 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_timeout leave");
406 return (0);
407}
408
409int
410libusb_handle_events(libusb_context * ctx)
411{
412 struct timeval tv;
413 int ret;
414
415 GET_CONTEXT(ctx);
518 return (0);
519}
520
521int
522libusb_handle_events(libusb_context * ctx)
523{
524 struct timeval tv;
525 int ret;
526
527 GET_CONTEXT(ctx);
416 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events enter");
528 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events enter");
417
418 tv.tv_sec = 2;
419 tv.tv_usec = 0;
420 ret = libusb_handle_events_timeout(ctx, &tv);
421
529
530 tv.tv_sec = 2;
531 tv.tv_usec = 0;
532 ret = libusb_handle_events_timeout(ctx, &tv);
533
422 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events leave");
534 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events leave");
423 return (ret);
424}
425
426int
427libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv)
428{
429 int ret;
430 struct timeval poll_tv;
431
432 GET_CONTEXT(ctx);
535 return (ret);
536}
537
538int
539libusb_handle_events_locked(libusb_context * ctx, struct timeval *tv)
540{
541 int ret;
542 struct timeval poll_tv;
543
544 GET_CONTEXT(ctx);
433 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_locked enter");
545 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_locked enter");
434
435 ret = get_next_timeout(ctx, tv, &poll_tv);
436 if (ret != 0) {
437 return handle_timeouts(ctx);
438 }
439
440 ret = handle_events(ctx, &poll_tv);
441
546
547 ret = get_next_timeout(ctx, tv, &poll_tv);
548 if (ret != 0) {
549 return handle_timeouts(ctx);
550 }
551
552 ret = handle_events(ctx, &poll_tv);
553
442 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_locked leave");
554 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_handle_events_locked leave");
443 return (ret);
444}
445
446int
447libusb_get_next_timeout(libusb_context * ctx, struct timeval *tv)
448{
449 struct usb_transfer *xfer;
450 struct timeval *next_tv;
451 struct timeval cur_tv;
452 struct timespec cur_ts;
453 int found;
454 int ret;
455
456 GET_CONTEXT(ctx);
555 return (ret);
556}
557
558int
559libusb_get_next_timeout(libusb_context * ctx, struct timeval *tv)
560{
561 struct usb_transfer *xfer;
562 struct timeval *next_tv;
563 struct timeval cur_tv;
564 struct timespec cur_ts;
565 int found;
566 int ret;
567
568 GET_CONTEXT(ctx);
457 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_next_timeout enter");
569 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_next_timeout enter");
458
459 found = 0;
460 pthread_mutex_lock(&ctx->flying_transfers_lock);
570
571 found = 0;
572 pthread_mutex_lock(&ctx->flying_transfers_lock);
461 if (USB_LIST_EMPTY(&ctx->flying_transfers)) {
573 if (TAILQ_EMPTY(&ctx->flying_transfers)) {
462 pthread_mutex_unlock(&ctx->flying_transfers_lock);
463 return (0);
464 }
465
574 pthread_mutex_unlock(&ctx->flying_transfers_lock);
575 return (0);
576 }
577
466 LIST_FOREACH_ENTRY(xfer, &ctx->flying_transfers, list) {
578 TAILQ_FOREACH(xfer, &ctx->flying_transfers, list) {
467 if (!(xfer->flags & USB_TIMED_OUT)) {
468 found = 1;
469 break ;
470 }
471 }
472 pthread_mutex_unlock(&ctx->flying_transfers_lock);
473
474 if (found == 0) {

--- 9 unchanged lines hidden (view full) ---

484 return (LIBUSB_ERROR_OTHER);
485 TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts);
486
487 if (timercmp(&cur_tv, next_tv, >=) != 0)
488 timerclear(tv);
489 else
490 timersub(next_tv, &cur_tv, tv);
491
579 if (!(xfer->flags & USB_TIMED_OUT)) {
580 found = 1;
581 break ;
582 }
583 }
584 pthread_mutex_unlock(&ctx->flying_transfers_lock);
585
586 if (found == 0) {

--- 9 unchanged lines hidden (view full) ---

596 return (LIBUSB_ERROR_OTHER);
597 TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts);
598
599 if (timercmp(&cur_tv, next_tv, >=) != 0)
600 timerclear(tv);
601 else
602 timersub(next_tv, &cur_tv, tv);
603
492 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_next_timeout leave");
604 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_next_timeout leave");
493 return (1);
494}
495
496void
497libusb_set_pollfd_notifiers(libusb_context * ctx,
498 libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
499 void *user_data)
500{
501 GET_CONTEXT(ctx);
605 return (1);
606}
607
608void
609libusb_set_pollfd_notifiers(libusb_context * ctx,
610 libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
611 void *user_data)
612{
613 GET_CONTEXT(ctx);
502 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_set_pollfd_notifiers enter");
614 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_set_pollfd_notifiers enter");
503
504 ctx->fd_added_cb = added_cb;
505 ctx->fd_removed_cb = removed_cb;
506 ctx->fd_cb_user_data = user_data;
507
615
616 ctx->fd_added_cb = added_cb;
617 ctx->fd_removed_cb = removed_cb;
618 ctx->fd_cb_user_data = user_data;
619
508 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_set_pollfd_notifiers leave");
620 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_set_pollfd_notifiers leave");
509}
510
511struct libusb_pollfd **
512libusb_get_pollfds(libusb_context * ctx)
513{
514 struct usb_pollfd *pollfd;
515 libusb_pollfd **ret;
516 int i;
517
518 GET_CONTEXT(ctx);
621}
622
623struct libusb_pollfd **
624libusb_get_pollfds(libusb_context * ctx)
625{
626 struct usb_pollfd *pollfd;
627 libusb_pollfd **ret;
628 int i;
629
630 GET_CONTEXT(ctx);
519 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_pollfds enter");
631 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_pollfds enter");
520
521 i = 0;
522 pthread_mutex_lock(&ctx->pollfds_lock);
632
633 i = 0;
634 pthread_mutex_lock(&ctx->pollfds_lock);
523 LIST_FOREACH_ENTRY(pollfd, &ctx->pollfds, list)
635 TAILQ_FOREACH(pollfd, &ctx->pollfds, list)
524 i++;
525
526 ret = calloc(i + 1 , sizeof(struct libusb_pollfd *));
527 if (ret == NULL) {
528 pthread_mutex_unlock(&ctx->pollfds_lock);
529 return (ret);
530 }
531
532 i = 0;
636 i++;
637
638 ret = calloc(i + 1 , sizeof(struct libusb_pollfd *));
639 if (ret == NULL) {
640 pthread_mutex_unlock(&ctx->pollfds_lock);
641 return (ret);
642 }
643
644 i = 0;
533 LIST_FOREACH_ENTRY(pollfd, &ctx->pollfds, list)
645 TAILQ_FOREACH(pollfd, &ctx->pollfds, list)
534 ret[i++] = (struct libusb_pollfd *) pollfd;
535 ret[i] = NULL;
536
646 ret[i++] = (struct libusb_pollfd *) pollfd;
647 ret[i] = NULL;
648
537 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_pollfds leave");
649 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_get_pollfds leave");
538 return (ret);
539}
540
541
542/* Synchronous device I/O */
543
544static void ctrl_tr_cb(struct libusb_transfer *transfer)
545{
546 libusb_context *ctx;
547 int *complet;
548
549 ctx = NULL;
550 GET_CONTEXT(ctx);
650 return (ret);
651}
652
653
654/* Synchronous device I/O */
655
656static void ctrl_tr_cb(struct libusb_transfer *transfer)
657{
658 libusb_context *ctx;
659 int *complet;
660
661 ctx = NULL;
662 GET_CONTEXT(ctx);
551 dprintf(ctx, LIBUSB_DEBUG_TRANSFER, "CALLBACK ENTER");
663 DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "CALLBACK ENTER");
552
553 complet = transfer->user_data;
554 *complet = 1;
555}
556
557int
558libusb_control_transfer(libusb_device_handle * devh,
559 uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
560 unsigned char *data, uint16_t wLength, unsigned int timeout)
561{
562 struct libusb_transfer *xfer;
563 struct libusb_control_setup *ctr;
564 libusb_context *ctx;
565 unsigned char *buff;
566 int complet;
567 int ret;
568
569 ctx = devh->dev->ctx;
570 GET_CONTEXT(ctx);
664
665 complet = transfer->user_data;
666 *complet = 1;
667}
668
669int
670libusb_control_transfer(libusb_device_handle * devh,
671 uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
672 unsigned char *data, uint16_t wLength, unsigned int timeout)
673{
674 struct libusb_transfer *xfer;
675 struct libusb_control_setup *ctr;
676 libusb_context *ctx;
677 unsigned char *buff;
678 int complet;
679 int ret;
680
681 ctx = devh->dev->ctx;
682 GET_CONTEXT(ctx);
571 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_control_transfer enter");
683 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_control_transfer enter");
572
573 if (devh == NULL || data == NULL)
574 return (LIBUSB_ERROR_NO_MEM);
575
576 xfer = libusb_alloc_transfer(0);
577 if (xfer == NULL)
578 return (LIBUSB_ERROR_NO_MEM);
579

--- 52 unchanged lines hidden (view full) ---

632 case LIBUSB_TRANSFER_NO_DEVICE:
633 ret = xfer->status;
634 break;
635 default:
636 ret = LIBUSB_ERROR_OTHER;
637 }
638 libusb_free_transfer(xfer);
639
684
685 if (devh == NULL || data == NULL)
686 return (LIBUSB_ERROR_NO_MEM);
687
688 xfer = libusb_alloc_transfer(0);
689 if (xfer == NULL)
690 return (LIBUSB_ERROR_NO_MEM);
691

--- 52 unchanged lines hidden (view full) ---

744 case LIBUSB_TRANSFER_NO_DEVICE:
745 ret = xfer->status;
746 break;
747 default:
748 ret = LIBUSB_ERROR_OTHER;
749 }
750 libusb_free_transfer(xfer);
751
640 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_control_transfer leave");
752 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_control_transfer leave");
641 return (ret);
642}
643
644static int
645do_transfer(struct libusb_device_handle *devh,
646 unsigned char endpoint, unsigned char *data, int length,
647 int *transferred, unsigned int timeout, int type)
648{

--- 5 unchanged lines hidden (view full) ---

654 if (devh == NULL || data == NULL)
655 return (LIBUSB_ERROR_NO_MEM);
656
657 xfer = libusb_alloc_transfer(0);
658 if (xfer == NULL)
659 return (LIBUSB_ERROR_NO_MEM);
660
661 ctx = devh->dev->ctx;
753 return (ret);
754}
755
756static int
757do_transfer(struct libusb_device_handle *devh,
758 unsigned char endpoint, unsigned char *data, int length,
759 int *transferred, unsigned int timeout, int type)
760{

--- 5 unchanged lines hidden (view full) ---

766 if (devh == NULL || data == NULL)
767 return (LIBUSB_ERROR_NO_MEM);
768
769 xfer = libusb_alloc_transfer(0);
770 if (xfer == NULL)
771 return (LIBUSB_ERROR_NO_MEM);
772
773 ctx = devh->dev->ctx;
774 GET_CONTEXT(ctx);
662
663 xfer->dev_handle = devh;
664 xfer->endpoint = endpoint;
665 xfer->type = type;
666 xfer->timeout = timeout;
667 xfer->buffer = data;
668 xfer->length = length;
669 xfer->user_data = &complet;
670 xfer->callback = ctrl_tr_cb;
671 complet = 0;
672
775
776 xfer->dev_handle = devh;
777 xfer->endpoint = endpoint;
778 xfer->type = type;
779 xfer->timeout = timeout;
780 xfer->buffer = data;
781 xfer->length = length;
782 xfer->user_data = &complet;
783 xfer->callback = ctrl_tr_cb;
784 complet = 0;
785
786 DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "SUBMIT_TRANSFER");
673 if ((ret = libusb_submit_transfer(xfer)) < 0) {
674 libusb_free_transfer(xfer);
787 if ((ret = libusb_submit_transfer(xfer)) < 0) {
788 libusb_free_transfer(xfer);
789 DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "SUBMIT_TRANSFER FAILED %i", ret);
675 return (ret);
676 }
677
678 while (complet == 0) {
679 if ((ret = libusb_handle_events(ctx)) < 0) {
680 libusb_cancel_transfer(xfer);
681 libusb_free_transfer(xfer);
682 while (complet == 0) {
683 if (libusb_handle_events(ctx) < 0)
684 break ;
685 }
686 return (ret);
687 }
688 }
689
690 *transferred = xfer->actual_length;
790 return (ret);
791 }
792
793 while (complet == 0) {
794 if ((ret = libusb_handle_events(ctx)) < 0) {
795 libusb_cancel_transfer(xfer);
796 libusb_free_transfer(xfer);
797 while (complet == 0) {
798 if (libusb_handle_events(ctx) < 0)
799 break ;
800 }
801 return (ret);
802 }
803 }
804
805 *transferred = xfer->actual_length;
806 DPRINTF(ctx, LIBUSB_DEBUG_TRANSFER, "xfer->status %i", xfer->status);
691 switch (xfer->status) {
692 case LIBUSB_TRANSFER_COMPLETED:
693 ret = xfer->actual_length;
694 break;
695 case LIBUSB_TRANSFER_TIMED_OUT:
696 case LIBUSB_TRANSFER_OVERFLOW:
697 case LIBUSB_TRANSFER_STALL:
698 case LIBUSB_TRANSFER_NO_DEVICE:

--- 12 unchanged lines hidden (view full) ---

711 unsigned char endpoint, unsigned char *data, int length,
712 int *transferred, unsigned int timeout)
713{
714 libusb_context *ctx;
715 int ret;
716
717 ctx = NULL;
718 GET_CONTEXT(ctx);
807 switch (xfer->status) {
808 case LIBUSB_TRANSFER_COMPLETED:
809 ret = xfer->actual_length;
810 break;
811 case LIBUSB_TRANSFER_TIMED_OUT:
812 case LIBUSB_TRANSFER_OVERFLOW:
813 case LIBUSB_TRANSFER_STALL:
814 case LIBUSB_TRANSFER_NO_DEVICE:

--- 12 unchanged lines hidden (view full) ---

827 unsigned char endpoint, unsigned char *data, int length,
828 int *transferred, unsigned int timeout)
829{
830 libusb_context *ctx;
831 int ret;
832
833 ctx = NULL;
834 GET_CONTEXT(ctx);
719 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_bulk_transfer enter");
835 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_bulk_transfer enter");
720
721 ret = do_transfer(devh, endpoint, data, length, transferred,
722 timeout, LIBUSB_TRANSFER_TYPE_BULK);
723
836
837 ret = do_transfer(devh, endpoint, data, length, transferred,
838 timeout, LIBUSB_TRANSFER_TYPE_BULK);
839
724 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_bulk_transfer leave");
840 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_bulk_transfer leave");
725 return (ret);
726}
727
728/*
729 * Need to fix xfer->type
730 */
731int
732libusb_interrupt_transfer(struct libusb_device_handle *devh,
733 unsigned char endpoint, unsigned char *data, int length,
734 int *transferred, unsigned int timeout)
735{
736 libusb_context *ctx;
737 int ret;
738
739 ctx = NULL;
740 GET_CONTEXT(ctx);
841 return (ret);
842}
843
844/*
845 * Need to fix xfer->type
846 */
847int
848libusb_interrupt_transfer(struct libusb_device_handle *devh,
849 unsigned char endpoint, unsigned char *data, int length,
850 int *transferred, unsigned int timeout)
851{
852 libusb_context *ctx;
853 int ret;
854
855 ctx = NULL;
856 GET_CONTEXT(ctx);
741 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer enter");
857 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer enter");
742
743 ret = do_transfer(devh, endpoint, data, length, transferred,
744 timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT);
745
858
859 ret = do_transfer(devh, endpoint, data, length, transferred,
860 timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT);
861
746 dprintf(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer leave");
862 DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer leave");
747 return (ret);
748}
863 return (ret);
864}