ALSA: timer: Check ack_list emptiness instead of bit flag
authorTakashi Iwai <tiwai@suse.de>
Wed, 27 Mar 2019 15:56:08 +0000 (16:56 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 27 Mar 2019 15:56:08 +0000 (16:56 +0100)
For checking the pending timer instance that is still left on the
timer object that is being closed, we set/clear a bit flag
SNDRV_TIMER_IFLG_CALLBACK around the call of callbacks.  This can be
simplified by replace with the list_empty() call for ti->ack_list.
This covers the existence more comprehensively and safely.

A gratis bonus is that we can get rid of SNDRV_TIMER_IFLG_CALLBACK bit
flag definition as well.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/timer.h
sound/core/timer.c

index 7ae226a..bcfee20 100644 (file)
@@ -43,7 +43,6 @@
 #define SNDRV_TIMER_IFLG_START   0x00000004
 #define SNDRV_TIMER_IFLG_AUTO    0x00000008    /* auto restart */
 #define SNDRV_TIMER_IFLG_FAST    0x00000010    /* fast callback (do not use tasklet) */
-#define SNDRV_TIMER_IFLG_CALLBACK 0x00000020   /* timer callback is active */
 #define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040  /* exclusive owner - no more instances */
 #define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080        /* write early event to the poll queue */
 
index 107d8eb..e343de0 100644 (file)
@@ -366,7 +366,7 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri)
                timer->num_instances--;
                /* wait, until the active callback is finished */
                spin_lock_irq(&timer->lock);
-               while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) {
+               while (!list_empty(&timeri->ack_list)) {
                        spin_unlock_irq(&timer->lock);
                        udelay(10);
                        spin_lock_irq(&timer->lock);
@@ -731,19 +731,17 @@ static void snd_timer_process_callbacks(struct snd_timer *timer,
                ti = list_first_entry(head, struct snd_timer_instance,
                                      ack_list);
 
-               /* remove from ack_list and make empty */
-               list_del_init(&ti->ack_list);
-
                ticks = ti->pticks;
                ti->pticks = 0;
                resolution = ti->resolution;
 
-               ti->flags |= SNDRV_TIMER_IFLG_CALLBACK;
                spin_unlock(&timer->lock);
                if (ti->callback)
                        ti->callback(ti, resolution, ticks);
                spin_lock(&timer->lock);
-               ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
+
+               /* remove from ack_list and make empty */
+               list_del_init(&ti->ack_list);
        }
 }