Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 May 2009 15:45:49 GMT
From:      Sylvestre Gallon <syl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 163090 for review
Message-ID:  <200905301545.n4UFjnZb064698@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163090

Change 163090 by syl@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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905301545.n4UFjnZb064698>