diff options
author | Takashi Iwai <tiwai@suse.de> | 2005-11-18 12:52:14 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-01-03 06:29:08 -0500 |
commit | b32425ac93370e1ba5556110e662f896b2e143b3 (patch) | |
tree | c5837ee90c16d2aa358e399f2ad79ca4eb770e94 /sound/drivers/dummy.c | |
parent | 2eb061f41cf74f829bfe90a9c79c765172be9f0b (diff) |
[ALSA] Fix possible races in timer callbacks
Fix possible races in timer callbacks.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/drivers/dummy.c')
-rw-r--r-- | sound/drivers/dummy.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index a276f7c80360..186117571745 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c | |||
@@ -231,8 +231,9 @@ static int snd_card_dummy_pcm_prepare(struct snd_pcm_substream *substream) | |||
231 | static void snd_card_dummy_pcm_timer_function(unsigned long data) | 231 | static void snd_card_dummy_pcm_timer_function(unsigned long data) |
232 | { | 232 | { |
233 | struct snd_dummy_pcm *dpcm = (struct snd_dummy_pcm *)data; | 233 | struct snd_dummy_pcm *dpcm = (struct snd_dummy_pcm *)data; |
234 | unsigned long flags; | ||
234 | 235 | ||
235 | spin_lock(&dpcm->lock); | 236 | spin_lock_irqsave(&dpcm->lock, flags); |
236 | dpcm->timer.expires = 1 + jiffies; | 237 | dpcm->timer.expires = 1 + jiffies; |
237 | add_timer(&dpcm->timer); | 238 | add_timer(&dpcm->timer); |
238 | dpcm->pcm_irq_pos += dpcm->pcm_jiffie; | 239 | dpcm->pcm_irq_pos += dpcm->pcm_jiffie; |
@@ -240,11 +241,10 @@ static void snd_card_dummy_pcm_timer_function(unsigned long data) | |||
240 | dpcm->pcm_buf_pos %= dpcm->pcm_size; | 241 | dpcm->pcm_buf_pos %= dpcm->pcm_size; |
241 | if (dpcm->pcm_irq_pos >= dpcm->pcm_count) { | 242 | if (dpcm->pcm_irq_pos >= dpcm->pcm_count) { |
242 | dpcm->pcm_irq_pos %= dpcm->pcm_count; | 243 | dpcm->pcm_irq_pos %= dpcm->pcm_count; |
243 | spin_unlock(&dpcm->lock); | 244 | spin_unlock_irqrestore(&dpcm->lock, flags); |
244 | snd_pcm_period_elapsed(dpcm->substream); | 245 | snd_pcm_period_elapsed(dpcm->substream); |
245 | spin_lock(&dpcm->lock); | 246 | } else |
246 | } | 247 | spin_unlock_irqrestore(&dpcm->lock, flags); |
247 | spin_unlock(&dpcm->lock); | ||
248 | } | 248 | } |
249 | 249 | ||
250 | static snd_pcm_uframes_t snd_card_dummy_pcm_pointer(struct snd_pcm_substream *substream) | 250 | static snd_pcm_uframes_t snd_card_dummy_pcm_pointer(struct snd_pcm_substream *substream) |