ALSA: timer: Sync timer deletion at closing the system timer
ALSA timer core framework has no sync point at stopping because it's called inside the spinlock. Thus we need a sync point at close for avoiding the stray timer task. This is simply done by implementing the close callback just calling del_timer_sync(). (It's harmless to call it unconditionally, as the core timer itself cares of the already deleted timer instance.) Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
f784beb75c
commit
f146357f06
|
@ -1058,11 +1058,21 @@ static int snd_timer_s_stop(struct snd_timer * timer)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int snd_timer_s_close(struct snd_timer *timer)
|
||||||
|
{
|
||||||
|
struct snd_timer_system_private *priv;
|
||||||
|
|
||||||
|
priv = (struct snd_timer_system_private *)timer->private_data;
|
||||||
|
del_timer_sync(&priv->tlist);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct snd_timer_hardware snd_timer_system =
|
static struct snd_timer_hardware snd_timer_system =
|
||||||
{
|
{
|
||||||
.flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
|
.flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
|
||||||
.resolution = 1000000000L / HZ,
|
.resolution = 1000000000L / HZ,
|
||||||
.ticks = 10000000L,
|
.ticks = 10000000L,
|
||||||
|
.close = snd_timer_s_close,
|
||||||
.start = snd_timer_s_start,
|
.start = snd_timer_s_start,
|
||||||
.stop = snd_timer_s_stop
|
.stop = snd_timer_s_stop
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue