Patchwork [v2] audio: Always call fini on exit

login
register
mail settings
Submitter Jan Kiszka
Date May 24, 2012, 3:05 p.m.
Message ID <4FBE4E2B.7070902@siemens.com>
Download mbox | patch
Permalink /patch/161149/
State New
Headers show

Comments

Jan Kiszka - May 24, 2012, 3:05 p.m.
Not only clean up enabled voices but any registered one. Backends like
pulsaudio rely on unconditional fini handler invocations.

This fixes "Memory pool destroyed but not all memory blocks freed!"
warnings on VM shutdowns when pa is used and lockups of QEMU on shutdown
as it got stuck on some pa-internal synchronization point.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

Changes in v2:
 - only disable ports that are enabled

 audio/audio.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)
malc - May 24, 2012, 3:36 p.m.
On Thu, 24 May 2012, Jan Kiszka wrote:

> Not only clean up enabled voices but any registered one. Backends like
> pulsaudio rely on unconditional fini handler invocations.
> 
> This fixes "Memory pool destroyed but not all memory blocks freed!"
> warnings on VM shutdowns when pa is used and lockups of QEMU on shutdown
> as it got stuck on some pa-internal synchronization point.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

Pushed, thanks to all involved.

[..snip..]

Patch

diff --git a/audio/audio.c b/audio/audio.c
index bd9237e..583ee51 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -1775,10 +1775,12 @@  static void audio_atexit (void)
     HWVoiceOut *hwo = NULL;
     HWVoiceIn *hwi = NULL;
 
-    while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+    while ((hwo = audio_pcm_hw_find_any_out (hwo))) {
         SWVoiceCap *sc;
 
-        hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
+        if (hwo->enabled) {
+            hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
+        }
         hwo->pcm_ops->fini_out (hwo);
 
         for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
@@ -1791,8 +1793,10 @@  static void audio_atexit (void)
         }
     }
 
-    while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
-        hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
+    while ((hwi = audio_pcm_hw_find_any_in (hwi))) {
+        if (hwi->enabled) {
+            hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
+        }
         hwi->pcm_ops->fini_in (hwi);
     }