From owner-p4-projects@FreeBSD.ORG Fri Jan 18 19:45:04 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 555D116A41B; Fri, 18 Jan 2008 19:45:04 +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 1AA3416A418 for ; Fri, 18 Jan 2008 19:45:04 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EF6C113C43E for ; Fri, 18 Jan 2008 19:45:03 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0IJj3Sr052845 for ; Fri, 18 Jan 2008 19:45:03 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0IJj39c052842 for perforce@freebsd.org; Fri, 18 Jan 2008 19:45:03 GMT (envelope-from hselasky@FreeBSD.org) Date: Fri, 18 Jan 2008 19:45:03 GMT Message-Id: <200801181945.m0IJj39c052842@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 133581 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: Fri, 18 Jan 2008 19:45:04 -0000 http://perforce.freebsd.org/chv.cgi?CH=133581 Change 133581 by hselasky@hselasky_laptop001 on 2008/01/18 19:44:16 Factor out some code into a separate function in an attempt to avoid compiler warnings about variables being accessed uninitialized on FreeBSD 6.3 . Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#106 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#106 (text+ko) ==== @@ -2080,6 +2080,38 @@ return; } +static void +usbd_callback_intr_td_sub(struct usbd_xfer **xfer, uint8_t dropcount) +{ + struct usbd_memory_info *info = xfer[0]->usb_root; + + mtx_unlock(info->usb_mtx); + + /* + * We exploit the fact that the mutex is the same for + * all callbacks: + */ + mtx_lock(info->priv_mtx); + + /* call callback(s) */ + switch (dropcount) { + case 4: + usbd_callback_wrapper(xfer[3], info, USBD_CONTEXT_CALLBACK); + case 3: + usbd_callback_wrapper(xfer[2], info, USBD_CONTEXT_CALLBACK); + case 2: + usbd_callback_wrapper(xfer[1], info, USBD_CONTEXT_CALLBACK); + case 1: + usbd_callback_wrapper(xfer[0], info, USBD_CONTEXT_CALLBACK); + default: + break; + } + mtx_unlock(info->priv_mtx); + mtx_lock(info->usb_mtx); + info->memory_refcount -= dropcount; + return; +} + /*------------------------------------------------------------------------* * usbd_callback_intr_td * @@ -2093,7 +2125,6 @@ struct usbd_memory_info *info = arg; struct usbd_xfer *xfer[4]; struct thread *td; - uint8_t dropcount; /* adjust priority */ td = curthread; @@ -2110,60 +2141,31 @@ repeat: xfer[0] = LIST_FIRST(&(info->done_head)); if (xfer[0]) { - do { - LIST_REMOVE(xfer[0], done_list); - xfer[0]->done_list.le_prev = NULL; - xfer[1] = LIST_FIRST(&(info->done_head)); - if (xfer[1] == NULL) { - dropcount = 1; - break; - } - LIST_REMOVE(xfer[1], done_list); - xfer[1]->done_list.le_prev = NULL; - xfer[2] = LIST_FIRST(&(info->done_head)); - if (xfer[2] == NULL) { - dropcount = 2; - break; - } - LIST_REMOVE(xfer[2], done_list); - xfer[2]->done_list.le_prev = NULL; - xfer[3] = LIST_FIRST(&(info->done_head)); - if (xfer[3] == NULL) { - dropcount = 3; - break; - } - LIST_REMOVE(xfer[3], done_list); - xfer[3]->done_list.le_prev = NULL; - dropcount = 4; - } while (0); - - mtx_unlock(info->usb_mtx); - - /* - * we exploit the fact that the mutex is the same for - * all callbacks - */ - mtx_lock(info->priv_mtx); - - /* call callback(s) */ - switch (dropcount) { - case 4: - usbd_callback_wrapper(xfer[3], info, USBD_CONTEXT_CALLBACK); - case 3: - usbd_callback_wrapper(xfer[2], info, USBD_CONTEXT_CALLBACK); - case 2: - usbd_callback_wrapper(xfer[1], info, USBD_CONTEXT_CALLBACK); - case 1: - usbd_callback_wrapper(xfer[0], info, USBD_CONTEXT_CALLBACK); - default: - break; + LIST_REMOVE(xfer[0], done_list); + xfer[0]->done_list.le_prev = NULL; + xfer[1] = LIST_FIRST(&(info->done_head)); + if (xfer[1] == NULL) { + usbd_callback_intr_td_sub(xfer, 1); + goto repeat; + } + LIST_REMOVE(xfer[1], done_list); + xfer[1]->done_list.le_prev = NULL; + xfer[2] = LIST_FIRST(&(info->done_head)); + if (xfer[2] == NULL) { + usbd_callback_intr_td_sub(xfer, 2); + goto repeat; + } + LIST_REMOVE(xfer[2], done_list); + xfer[2]->done_list.le_prev = NULL; + xfer[3] = LIST_FIRST(&(info->done_head)); + if (xfer[3] == NULL) { + usbd_callback_intr_td_sub(xfer, 3); + goto repeat; } - mtx_unlock(info->priv_mtx); - - mtx_lock(info->usb_mtx); - info->memory_refcount -= dropcount; + LIST_REMOVE(xfer[3], done_list); + xfer[3]->done_list.le_prev = NULL; + usbd_callback_intr_td_sub(xfer, 4); goto repeat; - } else { if (info->memory_refcount != 0) { info->done_sleep = 1;