PERFORCE change 133581 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Jan 18 11:45:04 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=133581
Change 133581 by hselasky at 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;
More information about the p4-projects
mailing list