Update of /cvsroot/alsa/alsa-kernel/usb
In directory sc8-pr-cvs1:/tmp/cvs-serv1446

Modified Files:
        usbaudio.c 
Log Message:
Clemens Ladisch <[EMAIL PROTECTED]>
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.


Index: usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- usbaudio.c  26 Nov 2003 18:50:14 -0000      1.73
+++ usbaudio.c  19 Dec 2003 09:20:40 -0000      1.74
@@ -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: IBM Linux Tutorials.
Become an expert in LINUX or just sharpen your skills.  Sign up for IBM's
Free Linux Tutorials.  Learn everything from the bash shell to sys admin.
Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to