hal: Add clear_devices to avoid memory leakage
In case of device update, it will alloc memory for new device,
Add the corresponding clear_devices to avoid the memory leakage.
Change-Id: If8498bad04146f383073e521a7d74fe20564f880
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 7684f21..bc06c88 100755
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1398,6 +1398,7 @@
platform_set_echo_reference(adev, true, &out_devices);
in->ec_opened = true;
+ clear_devices(&out_devices);
}
}
} else if ((usecase->type == TRANSCODE_LOOPBACK_TX) || ((usecase->type == PCM_HFP_CALL) &&
@@ -1524,6 +1525,7 @@
list_init(&out_devices);
platform_set_echo_reference(in->dev, false, &out_devices);
in->ec_opened = false;
+ clear_devices(&out_devices);
}
}
if (usecase->id == adev->fluence_nn_usecase_id) {
@@ -1933,6 +1935,9 @@
}
}
+ clear_devices(&a1);
+ clear_devices(&a2);
+
end:
return d2; // return whatever was calculated before.
}
@@ -2923,6 +2928,7 @@
out_snd_device = platform_get_output_snd_device(adev->platform, &stream_out, usecase->type);
assign_devices(&usecase->device_list,
&usecase->stream.inout->out_config.device_list);
+ clear_devices(&stream_out.device_list);
} else if (usecase->type == TRANSCODE_LOOPBACK_TX ) {
if (usecase->stream.inout == NULL) {
ALOGE("%s: stream.inout is NULL", __func__);
@@ -2934,6 +2940,7 @@
&out_devices, usecase->type);
assign_devices(&usecase->device_list,
&usecase->stream.inout->in_config.device_list);
+ clear_devices(&out_devices);
} else {
/*
* If the voice call is active, use the sound devices of voice call usecase
@@ -3073,6 +3080,7 @@
priority_in,
&out_devices,
usecase->type);
+ clear_devices(&out_devices);
}
}
}
@@ -3405,6 +3413,7 @@
audio_extn_keep_alive_stop(KEEP_ALIVE_OUT_PRIMARY);
list_remove(&uc_info->list);
+ clear_devices(&uc_info->device_list);
free(uc_info);
if (priority_in == in) {
@@ -4056,6 +4065,7 @@
}
}
+ clear_devices(&uc_info->device_list);
free(uc_info);
ALOGV("%s: exit: status(%d)", __func__, ret);
return ret;
@@ -4240,6 +4250,7 @@
AUDIO_DEVICE_OUT_SPEAKER, "");
select_devices(adev, out->usecase);
assign_devices(&out->device_list, &dev);
+ clear_devices(&dev);
}
} else {
select_devices(adev, out->usecase);
@@ -4257,6 +4268,7 @@
AUDIO_DEVICE_OUT_SPEAKER, "");
select_devices(adev, out->usecase);
assign_devices(&out->device_list, &dev);
+ clear_devices(&dev);
} else {
ret = -EINVAL;
goto error_open;
@@ -8046,6 +8058,7 @@
}
}
+ clear_devices(&devices);
pthread_mutex_unlock(&adev->lock);
pthread_mutex_unlock(&in->lock);
}
@@ -9033,6 +9046,7 @@
pthread_mutex_destroy(&out->position_query_lock);
pthread_mutex_lock(&adev->lock);
+ clear_devices(&out->device_list);
free(stream);
pthread_mutex_unlock(&adev->lock);
ALOGV("%s: exit", __func__);
@@ -10212,6 +10226,7 @@
struct listnode out_devices;
list_init(&out_devices);
platform_set_echo_reference(adev, false, &out_devices);
+ clear_devices(&out_devices);
} else
audio_extn_sound_trigger_update_ec_ref_status(false);
@@ -10263,6 +10278,7 @@
ALOGV("%s: sound trigger pcm stop lab", __func__);
audio_extn_sound_trigger_stop_lab(in);
}
+ clear_devices(&in->device_list);
free(stream);
pthread_mutex_unlock(&adev->lock);
return;
@@ -10575,7 +10591,6 @@
if (stream != NULL) {
if (p_info->patch_type == PATCH_PLAYBACK) {
ret = route_output_stream((struct stream_out *) stream, &devices);
- clear_devices(&devices);
} else if (p_info->patch_type == PATCH_CAPTURE) {
ret = route_input_stream((struct stream_in *) stream, &devices, input_source);
}
@@ -10599,6 +10614,7 @@
}
done:
+ clear_devices(&devices);
audio_extn_hw_loopback_create_audio_patch(dev,
num_sources,
sources,
@@ -10684,6 +10700,7 @@
ret = route_output_stream((struct stream_out *) stream, &devices);
else if (patch_type == PATCH_CAPTURE)
ret = route_input_stream((struct stream_in *) stream, &devices, input_source);
+ clear_devices(&devices);
}
if (ret < 0)
@@ -10921,6 +10938,7 @@
}
pthread_mutex_unlock(&out->latch_lock);
}
+ clear_devices(&devices);
ALOGV("%s: exit", __func__);
return 0;
}