deactivate_urbs didn't return the number of still-active URBs when not
unlinking asynchronously, which would prevent calling wait_clear_urbs
when some URBs actually are being unlinked asynchronously, so these
URBs would be freed while still in use.

I removed deactivate_urb's return value because wait_clear_urbs does
its own counting anyway.


Regards,
Clemens

-- 
Index: alsa-kernel/usb/usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.73
diff -u -r1.73 usbaudio.c
--- alsa-kernel/usb/usbaudio.c  26 Nov 2003 18:50:14 -0000      1.73
+++ alsa-kernel/usb/usbaudio.c  8 Dec 2003 13:14:10 -0000
@@ -612,12 +612,11 @@

 /*
  * unlink active urbs.
- * return the number of active urbs.
  */
 static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep)
 {
        unsigned int i;
-       int alive, async;
+       int async;

        subs->running = 0;

@@ -629,10 +628,8 @@
        if (! async && in_interrupt())
                return 0;

-       alive = 0;
        for (i = 0; i < subs->nurbs; i++) {
                if (test_bit(i, &subs->active_mask)) {
-                       alive++;
                        if (! test_and_set_bit(i, &subs->unlink_mask)) {
                                struct urb *u = subs->dataurb[i].urb;
                                if (async)
@@ -646,7 +643,6 @@
        if (subs->syncpipe) {
                for (i = 0; i < SYNC_URBS; i++) {
                        if (test_bit(i+16, &subs->active_mask)) {
-                               alive++;
                                if (! test_and_set_bit(i+16, &subs->unlink_mask)) {
                                        struct urb *u = subs->syncurb[i].urb;
                                        if (async)
@@ -658,7 +654,7 @@
                        }
                }
        }
-       return async ? alive : 0;
+       return 0;
 }


@@ -803,8 +799,8 @@
        int i;

        /* stop urbs (to be sure) */
-       if (deactivate_urbs(subs, force, 1) > 0)
-               wait_clear_urbs(subs);
+       deactivate_urbs(subs, force, 1);
+       wait_clear_urbs(subs);

        for (i = 0; i < MAX_URBS; i++)
                release_urb_ctx(&subs->dataurb[i]);
@@ -1277,8 +1273,8 @@
        subs->phase = 0;

        /* clear urbs (to be sure) */
-       if (deactivate_urbs(subs, 0, 0) > 0)
-               wait_clear_urbs(subs);
+       deactivate_urbs(subs, 0, 1);
+       wait_clear_urbs(subs);

        return 0;
 }




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to