Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f146357f authored by Takashi Iwai's avatar Takashi Iwai
Browse files

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: default avatarTakashi Iwai <tiwai@suse.de>
parent f784beb7
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1058,11 +1058,21 @@ static int snd_timer_s_stop(struct snd_timer * timer)
	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 =
{
	.flags =	SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
	.resolution =	1000000000L / HZ,
	.ticks =	10000000L,
	.close =	snd_timer_s_close,
	.start =	snd_timer_s_start,
	.stop =		snd_timer_s_stop
};