Update of /cvsroot/alsa/alsa-kernel/core/seq In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6058
Modified Files: seq_fifo.c seq_memory.c Log Message: - fixed the race conditions. Index: seq_fifo.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/seq/seq_fifo.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- seq_fifo.c 7 Jan 2004 14:34:22 -0000 1.7 +++ seq_fifo.c 11 Feb 2004 19:40:02 -0000 1.8 @@ -171,10 +171,12 @@ { snd_seq_event_cell_t *cell; unsigned long flags; + wait_queue_t wait; snd_assert(f != NULL, return -EINVAL); *cellp = NULL; + init_waitqueue_entry(&wait, current); spin_lock_irqsave(&f->lock, flags); while ((cell = fifo_cell_out(f)) == NULL) { if (nonblock) { @@ -182,17 +184,19 @@ spin_unlock_irqrestore(&f->lock, flags); return -EAGAIN; } - spin_unlock(&f->lock); - interruptible_sleep_on(&f->input_sleep); - spin_lock(&f->lock); - + set_current_state(TASK_INTERRUPTIBLE); + add_wait_queue(&f->input_sleep, &wait); + spin_unlock_irq(&f->lock); + schedule(); + spin_lock_irq(&f->lock); + remove_wait_queue(&f->input_sleep, &wait); if (signal_pending(current)) { spin_unlock_irqrestore(&f->lock, flags); return -ERESTARTSYS; } } - *cellp = cell; spin_unlock_irqrestore(&f->lock, flags); + *cellp = cell; return 0; } Index: seq_memory.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/seq/seq_memory.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- seq_memory.c 7 Jan 2004 14:34:22 -0000 1.13 +++ seq_memory.c 11 Feb 2004 19:40:02 -0000 1.14 @@ -220,12 +220,14 @@ snd_seq_event_cell_t *cell; unsigned long flags; int err = -EAGAIN; + wait_queue_t wait; if (pool == NULL) return -EINVAL; *cellp = NULL; + init_waitqueue_entry(&wait, current); spin_lock_irqsave(&pool->lock, flags); if (pool->ptr == NULL) { /* not initialized */ snd_printd("seq: pool is not initialized\n"); @@ -234,9 +236,12 @@ } while (pool->free == NULL && ! nonblock && ! pool->closing) { - spin_unlock(&pool->lock); - interruptible_sleep_on(&pool->output_sleep); - spin_lock(&pool->lock); + set_current_state(TASK_INTERRUPTIBLE); + add_wait_queue(&pool->output_sleep, &wait); + spin_unlock_irq(&pool->lock); + schedule(); + spin_lock_irq(&pool->lock); + remove_wait_queue(&pool->output_sleep, &wait); /* interrupted? */ if (signal_pending(current)) { err = -ERESTARTSYS; ------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog