From owner-p4-projects@FreeBSD.ORG Sat May 9 16:26:06 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 743601065673; Sat, 9 May 2009 16:26:06 +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 33D91106564A for ; Sat, 9 May 2009 16:26:06 +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 2165E8FC26 for ; Sat, 9 May 2009 16:26:06 +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 n49GQ6v5078199 for ; Sat, 9 May 2009 16:26:06 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n49GQ6w7078197 for perforce@freebsd.org; Sat, 9 May 2009 16:26:06 GMT (envelope-from syl@FreeBSD.org) Date: Sat, 9 May 2009 16:26:06 GMT Message-Id: <200905091626.n49GQ6w7078197@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 161836 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, 09 May 2009 16:26:09 -0000 http://perforce.freebsd.org/chv.cgi?CH=161836 Change 161836 by syl@syl_atuin on 2009/05/09 16:25:44 - fix event_waiters_cond in libusb.h - Fix transfer bug reported by Hans Petter Selasky. - Add GET_XFER macro to simplify the acquirement of an xfer. - Implement libusb_try_lock_events. - Implement libusb_lock_events. - Implement libusb_unlock_events. - Implement libusb_event_handling_ok. - Implement libusb_event_handler_active. - Implement libusb_lock_event_waiters. - Implement libusb_unlock_event_waiters. - Implement libusb_set_pollfd_notifiers. Affected files ... .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#7 edit .. //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#8 edit Differences ... ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb.h#7 (text+ko) ==== @@ -207,7 +207,7 @@ int event_handler_active; pthread_mutex_t event_waiters_lock; - pthread_mutex_t event_waiters_cond; + pthread_cond_t event_waiters_cond; } libusb_context; typedef struct libusb_device { ==== //depot/projects/soc2009/syl_usb/src/lib/libusb/libusb10.c#8 (text+ko) ==== @@ -54,6 +54,13 @@ (entry)->next->prev = (entry)->prev; \ (entry)->prev->next = (entry)->next; +/* fetxh libusb20_transfer from libusb20_device */ +#define GET_XFER(xfer, endpoint, pdev)\ + xfer = libusb20_tr_get_pointer(pdev, \ + (2 *endpoint)|(endpoint/0x80)); \ + if (xfer == NULL) \ + return (LIBUSB_ERROR_OTHER); + /* Library initialisation / deinitialisation */ void @@ -442,12 +449,20 @@ } int -libusb_clear_halt(libusb_device_handle * dev, unsigned char endpoint) +libusb_clear_halt(libusb_device_handle * devh, unsigned char endpoint) { - struct libusb20_transfer xfer; + struct libusb20_transfer *xfer; + int ret; + + GET_XFER(xfer, endpoint, devh->os_priv); + + ret = libusb20_tr_open(xfer, 0, 0, endpoint); + if (ret != 0 && ret != LIBUSB20_ERROR_BUSY) + return (LIBUSB_ERROR_OTHER); - libusb20_tr_open(&xfer, 0, 0, endpoint); - libusb20_tr_clear_stall_sync(&xfer); + libusb20_tr_clear_stall_sync(xfer); + if (ret == 0) /* check if we have open the device */ + libusb20_tr_close(xfer); return (0); } @@ -484,7 +499,6 @@ return (0); } - /* * stub function. * libusb20 doesn't support this feature. @@ -542,12 +556,21 @@ libusb_submit_transfer(struct libusb_transfer *xfer) { struct libusb20_transfer *usb20_xfer; + struct libusb20_device *pdev; int ret; - usb20_xfer = malloc(sizeof(*usb20_xfer)); + pdev = xfer->dev_handle->os_priv; + GET_XFER(usb20_xfer, xfer->endpoint, pdev); xfer->os_priv = usb20_xfer; - libusb20_tr_open(usb20_xfer, xfer->length, xfer->num_iso_packets, xfer->endpoint); + ret = libusb20_tr_open(usb20_xfer, xfer->length, xfer->num_iso_packets, + xfer->endpoint); + + if (ret == LIBUSB20_ERROR_BUSY) + return (LIBUSB_ERROR_BUSY); + if (ret != 0) + return (LIBUSB_ERROR_OTHER); + libusb20_tr_set_timeout(usb20_xfer, xfer->timeout); libusb20_tr_set_buffer(usb20_xfer, xfer->buffer, xfer->num_iso_packets); libusb20_tr_set_length(usb20_xfer, xfer->length, xfer->num_iso_packets); @@ -601,42 +624,79 @@ int libusb_try_lock_events(libusb_context * ctx) { + int ret; + + pthread_mutex_lock(&ctx->pollfd_modify_lock); + ret = ctx->pollfd_modify; + pthread_mutex_unlock(&ctx->pollfd_modify_lock); + + if (ret != 0) + return (1); + + ret = pthread_mutex_trylock(&ctx->events_lock); + + if (ret != 0) + return (1); + + ctx->event_handler_active = 1; return (0); } void libusb_lock_events(libusb_context * ctx) { - return; + pthread_mutex_lock(&ctx->events_lock); + ctx->event_handler_active = 1; } void libusb_unlock_events(libusb_context * ctx) { - return; + ctx->event_handler_active = 0; + pthread_mutex_unlock(&ctx->events_lock); + + pthread_mutex_lock(&ctx->event_waiters_lock); + pthread_cond_broadcast(&ctx->event_waiters_cond); + pthread_mutex_unlock(&ctx->event_waiters_lock); } int libusb_event_handling_ok(libusb_context * ctx) { - return (0); + int ret; + + pthread_mutex_lock(&ctx->pollfd_modify_lock); + ret = ctx->pollfd_modify; + pthread_mutex_unlock(&ctx->pollfd_modify_lock); + if (ret) + return (0); + return (1); } int libusb_event_handler_active(libusb_context * ctx) { - return (0); + int ret; + + pthread_mutex_lock(&ctx->pollfd_modify_lock); + ret = ctx->pollfd_modify; + pthread_mutex_unlock(&ctx->pollfd_modify_lock); + if (ret) + return (1); + return (ctx->event_handler_active); } void libusb_lock_event_waiters(libusb_context * ctx) { + pthread_mutex_lock(&ctx->event_waiters_lock); return; } void libusb_unlock_event_waiters(libusb_context * ctx) { + pthread_mutex_unlock(&ctx->event_waiters_lock); return; } @@ -679,7 +739,9 @@ libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data) { - return; + ctx->fd_added_cb = added_cb; + ctx->fd_removed_cb = removed_cb; + ctx->fd_cb_user_data = user_data; } struct libusb_pollfd **