From owner-p4-projects@FreeBSD.ORG Sat May 30 15:45:50 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1DA32106568E; Sat, 30 May 2009 15:45:50 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CBFA2106566C for ; Sat, 30 May 2009 15:45:49 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BA0BF8FC19 for ; Sat, 30 May 2009 15:45:49 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n4UFjnbq064700 for ; Sat, 30 May 2009 15:45:49 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n4UFjnZb064698 for perforce@freebsd.org; Sat, 30 May 2009 15:45:49 GMT (envelope-from syl@FreeBSD.org) Date: Sat, 30 May 2009 15:45:49 GMT Message-Id: <200905301545.n4UFjnZb064698@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to syl@FreeBSD.org using -f From: Sylvestre Gallon To: Perforce Change Reviews Cc: Subject: PERFORCE change 163090 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 30 May 2009 15:45:51 -0000 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); }