PERFORCE change 163090 for review
Sylvestre Gallon
syl at FreeBSD.org
Sat May 30 15:45:51 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163090
Change 163090 by syl at syl_rincewind on 2009/05/30 15:45:03
Apply changes from Hans Petter Selasky.
- Adding a lock for all libusb20_tr_xxx.
- Move transfer status update into libusb10_proxy.
Affected files ...
.. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#22 edit
Differences ...
==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#22 (text+ko) ====
@@ -570,13 +570,17 @@
GET_XFER(xfer, endpoint, devh->os_priv);
+ pthread_mutex_lock(&libusb20_lock);
ret = libusb20_tr_open(xfer, 0, 0, endpoint);
- if (ret != 0 && ret != LIBUSB20_ERROR_BUSY)
+ if (ret != 0 && ret != LIBUSB20_ERROR_BUSY) {
+ pthread_mutex_unlock(&libusb20_lock);
return (LIBUSB_ERROR_OTHER);
+ }
libusb20_tr_clear_stall_sync(xfer);
if (ret == 0) /* check if we have open the device */
libusb20_tr_close(xfer);
+ pthread_mutex_unlock(&libusb20_lock);
return (0);
}
@@ -673,7 +677,33 @@
static void
libusb10_proxy(struct libusb20_transfer *xfer)
{
+ pthread_mutex_lock(&libusb20_lock);
+
+ switch (libusb20_tr_get_status(usb20_xfer)) {
+ case LIBUSB20_TRANSFER_COMPLETED:
+ xfer->status = LIBUSB_TRANSFER_COMPLETED;
+ break ;
+ case LIBUSB20_TRANSFER_OVERFLOW:
+ xfer->status = LIBUSB_TRANSFER_OVERFLOW;
+ break ;
+ case LIBUSB20_TRANSFER_NO_DEVICE:
+ xfer->status = LIBUSB_TRANSFER_NO_DEVICE;
+ break ;
+ case LIBUSB20_TRANSFER_STALL:
+ xfer->status = LIBUSB_TRANSFER_STALL;
+ break ;
+ case LIBUSB20_TRANSFER_CANCELLED:
+ xfer->status = LIBUSB_TRANSFER_CANCELLED;
+ break ;
+ case LIBUSB20_TRANSFER_TIMED_OUT:
+ xfer->status = LIBUSB_TRANSFER_TIMED_OUT;
+ break ;
+ default:
+ xfer->status = LIBUSB_TRANSFER_ERROR;
+ }
((libusb_transfer_cb_fn)libusb20_tr_get_priv_sc0(xfer))(libusb20_tr_get_priv_sc1(xfer));
+
+ pthread_mutex_unlock(&libusb20_lock);
}
int
@@ -743,10 +773,12 @@
GET_XFER(usb20_xfer, xfer->endpoint, pdev);
xfer->os_priv = usb20_xfer;
+ pthread_mutex_lock(&libusb20_lock);
ret = libusb20_tr_open(usb20_xfer, xfer->length,
MAX(2, xfer->num_iso_packets), xfer->endpoint);
if (ret != 0) {
+ pthread_mutex_unlock(&libusb20_lock);
pthread_mutex_lock(&ctx->flying_transfers_lock);
LIST_DEL(&usb_backend->list);
pthread_mutex_unlock(&ctx->flying_transfers_lock);
@@ -776,32 +808,9 @@
libusb20_tr_set_priv_sc1(usb20_xfer, xfer->user_data);
libusb20_tr_set_callback(usb20_xfer, libusb10_proxy);
- pthread_mutex_lock(&libusb20_lock);
libusb20_tr_submit(usb20_xfer);
pthread_mutex_unlock(&libusb20_lock);
- switch (libusb20_tr_get_status(usb20_xfer)) {
- case LIBUSB20_TRANSFER_COMPLETED:
- xfer->status = LIBUSB_TRANSFER_COMPLETED;
- break ;
- case LIBUSB20_TRANSFER_OVERFLOW:
- xfer->status = LIBUSB_TRANSFER_OVERFLOW;
- break ;
- case LIBUSB20_TRANSFER_NO_DEVICE:
- xfer->status = LIBUSB_TRANSFER_NO_DEVICE;
- break ;
- case LIBUSB20_TRANSFER_STALL:
- xfer->status = LIBUSB_TRANSFER_STALL;
- break ;
- case LIBUSB20_TRANSFER_CANCELLED:
- xfer->status = LIBUSB_TRANSFER_CANCELLED;
- break ;
- case LIBUSB20_TRANSFER_TIMED_OUT:
- xfer->status = LIBUSB_TRANSFER_TIMED_OUT;
- break ;
- default:
- xfer->status = LIBUSB_TRANSFER_ERROR;
- }
return (0);
}
@@ -810,8 +819,11 @@
{
if (xfer == NULL)
return (LIBUSB_ERROR_NO_MEM);
+
+ pthread_mutex_lock(&libusb20_lock);
libusb20_tr_stop(xfer->os_priv);
libusb20_tr_close(xfer->os_priv);
+ pthread_mutex_unlock(&libusb20_lock);
return (0);
}
More information about the p4-projects
mailing list