ALSA: hda - Allocate hda_pcm objects dynamically
So far, the hda_codec object kept the hda_pcm list in an array, and the codec driver was expected to assign the array. However, this makes the object life cycle management harder, because the assigned array is freed at the codec driver detach while it might be still accessed by the opened streams. In this patch, we allocate each hda_pcm object dynamically and manage it as a linked list. Each object has a kref refcount, and both the codec driver binder and the PCM open/close touches it, so that the object won't be freed while in use. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -99,10 +99,10 @@ static void print_nid_array(struct snd_info_buffer *buffer,
|
||||
static void print_nid_pcms(struct snd_info_buffer *buffer,
|
||||
struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
int pcm, type;
|
||||
int type;
|
||||
struct hda_pcm *cpcm;
|
||||
for (pcm = 0; pcm < codec->num_pcms; pcm++) {
|
||||
cpcm = &codec->pcm_info[pcm];
|
||||
|
||||
list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
|
||||
for (type = 0; type < 2; type++) {
|
||||
if (cpcm->stream[type].nid != nid || cpcm->pcm == NULL)
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user