ALSA: pcm: Unify snd_pcm_group initialization
There are multiple open codes that initialize the same object. Create a common helper function instead. Also, use kzalloc() to be safer at creating a group object, and move the initialization out of the critical section. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d819fb21ee
commit
73365cb10b
@ -753,9 +753,7 @@ int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
substream->group = &substream->self_group;
|
substream->group = &substream->self_group;
|
||||||
spin_lock_init(&substream->self_group.lock);
|
snd_pcm_group_init(&substream->self_group);
|
||||||
mutex_init(&substream->self_group.mutex);
|
|
||||||
INIT_LIST_HEAD(&substream->self_group.substreams);
|
|
||||||
list_add_tail(&substream->link_list, &substream->self_group.substreams);
|
list_add_tail(&substream->link_list, &substream->self_group.substreams);
|
||||||
atomic_set(&substream->mmap_count, 0);
|
atomic_set(&substream->mmap_count, 0);
|
||||||
prev = substream;
|
prev = substream;
|
||||||
|
@ -66,5 +66,6 @@ static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void __snd_pcm_xrun(struct snd_pcm_substream *substream);
|
void __snd_pcm_xrun(struct snd_pcm_substream *substream);
|
||||||
|
void snd_pcm_group_init(struct snd_pcm_group *group);
|
||||||
|
|
||||||
#endif /* __SOUND_CORE_PCM_LOCAL_H */
|
#endif /* __SOUND_CORE_PCM_LOCAL_H */
|
||||||
|
@ -100,6 +100,13 @@ static inline void down_write_nonfifo(struct rw_semaphore *lock)
|
|||||||
msleep(1);
|
msleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void snd_pcm_group_init(struct snd_pcm_group *group)
|
||||||
|
{
|
||||||
|
spin_lock_init(&group->lock);
|
||||||
|
mutex_init(&group->mutex);
|
||||||
|
INIT_LIST_HEAD(&group->substreams);
|
||||||
|
}
|
||||||
|
|
||||||
#define PCM_LOCK_DEFAULT 0
|
#define PCM_LOCK_DEFAULT 0
|
||||||
#define PCM_LOCK_IRQ 1
|
#define PCM_LOCK_IRQ 1
|
||||||
#define PCM_LOCK_IRQSAVE 2
|
#define PCM_LOCK_IRQSAVE 2
|
||||||
@ -1969,11 +1976,12 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
|
|||||||
}
|
}
|
||||||
pcm_file = f.file->private_data;
|
pcm_file = f.file->private_data;
|
||||||
substream1 = pcm_file->substream;
|
substream1 = pcm_file->substream;
|
||||||
group = kmalloc(sizeof(*group), GFP_KERNEL);
|
group = kzalloc(sizeof(*group), GFP_KERNEL);
|
||||||
if (!group) {
|
if (!group) {
|
||||||
res = -ENOMEM;
|
res = -ENOMEM;
|
||||||
goto _nolock;
|
goto _nolock;
|
||||||
}
|
}
|
||||||
|
snd_pcm_group_init(group);
|
||||||
down_write_nonfifo(&snd_pcm_link_rwsem);
|
down_write_nonfifo(&snd_pcm_link_rwsem);
|
||||||
write_lock_irq(&snd_pcm_link_rwlock);
|
write_lock_irq(&snd_pcm_link_rwlock);
|
||||||
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN ||
|
if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN ||
|
||||||
@ -1989,9 +1997,6 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
|
|||||||
if (!snd_pcm_stream_linked(substream)) {
|
if (!snd_pcm_stream_linked(substream)) {
|
||||||
substream->group = group;
|
substream->group = group;
|
||||||
group = NULL;
|
group = NULL;
|
||||||
spin_lock_init(&substream->group->lock);
|
|
||||||
mutex_init(&substream->group->mutex);
|
|
||||||
INIT_LIST_HEAD(&substream->group->substreams);
|
|
||||||
list_add_tail(&substream->link_list, &substream->group->substreams);
|
list_add_tail(&substream->link_list, &substream->group->substreams);
|
||||||
substream->group->count = 1;
|
substream->group->count = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user