From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41740) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bUBV5-0002Y7-I3 for qemu-devel@nongnu.org; Mon, 01 Aug 2016 07:35:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bUBV1-00045l-BP for qemu-devel@nongnu.org; Mon, 01 Aug 2016 07:35:15 -0400 Received: from mx3-phx2.redhat.com ([209.132.183.24]:53550) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bUBV1-00044z-3H for qemu-devel@nongnu.org; Mon, 01 Aug 2016 07:35:11 -0400 Date: Mon, 1 Aug 2016 07:35:09 -0400 (EDT) From: =?utf-8?Q?Marc-Andr=C3=A9?= Lureau Message-ID: <525184253.10249411.1470051309271.JavaMail.zimbra@redhat.com> In-Reply-To: <20160801112343.29082-3-marcandre.lureau@redhat.com> References: <20160801112343.29082-1-marcandre.lureau@redhat.com> <20160801112343.29082-3-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH for-2.7 2/2] audio: clean up before monitor clean up List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: marcandre lureau Cc: qemu-devel@nongnu.org, pbonzini@redhat.com Hi ----- Original Message ----- > From: Marc-Andr=C3=A9 Lureau >=20 > Since aa5cb7f5e, the chardevs are being cleaned up when leaving qemu, > before the atexit() handlers. audio_cleanup() may use the monitor to > notify of changes. For compatibility reasons, let's clean up audio > before the monitor so it keeps emitting monitor events. >=20 > The audio_atexit() function is made idempotent (so it can be called > multiple times), and renamed to audio_cleanup(). Since coreaudio > backend is using a 'isAtexit' code path, change it to check > audio_is_cleaning_up() instead, so the path is taken during normal > exit. >=20 > Signed-off-by: Marc-Andr=C3=A9 Lureau > --- > audio/audio.c | 26 ++++++++++++++++++-------- > audio/audio.h | 3 +++ > audio/coreaudio.c | 12 ++---------- > vl.c | 1 + > 4 files changed, 24 insertions(+), 18 deletions(-) >=20 > diff --git a/audio/audio.c b/audio/audio.c > index 9d4dcc7..c845a44 100644 > --- a/audio/audio.c > +++ b/audio/audio.c > @@ -1739,13 +1739,21 @@ static void audio_vm_change_state_handler (void > *opaque, int running, > audio_reset_timer (s); > } > =20 > -static void audio_atexit (void) > +static bool is_cleaning_up; > + > +bool audio_is_cleaning_up(void) > +{ > + return is_cleaning_up; > +} > + > +void audio_cleanup(void) > { > AudioState *s =3D &glob_audio_state; > - HWVoiceOut *hwo =3D NULL; > - HWVoiceIn *hwi =3D NULL; > + HWVoiceOut *hwo, *hwon; > + HWVoiceIn *hwi, *hwin; > =20 > - while ((hwo =3D audio_pcm_hw_find_any_out (hwo))) { > + is_cleaning_up =3D true; > + QLIST_FOREACH_SAFE(hwo, &glob_audio_state.hw_head_out, entries, hwon= ) { > SWVoiceCap *sc; > =20 > if (hwo->enabled) { > @@ -1761,17 +1769,20 @@ static void audio_atexit (void) > cb->ops.destroy (cb->opaque); > } > } > + QLIST_REMOVE(hwo, entries); > } > =20 > - while ((hwi =3D audio_pcm_hw_find_any_in (hwi))) { > + QLIST_FOREACH_SAFE(hwi, &glob_audio_state.hw_head_in, entries, hwin)= { > if (hwi->enabled) { > hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE); > } > hwi->pcm_ops->fini_in (hwi); > + QLIST_REMOVE(hwi, entries); > } > =20 > if (s->drv) { > s->drv->fini (s->drv_opaque); > + s->drv =3D NULL; > } > } > =20 > @@ -1799,7 +1810,7 @@ static void audio_init (void) > QLIST_INIT (&s->hw_head_out); > QLIST_INIT (&s->hw_head_in); > QLIST_INIT (&s->cap_head); > - atexit (audio_atexit); > + atexit(audio_cleanup); > =20 > s->ts =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, audio_timer, s); > =20 > @@ -1966,8 +1977,7 @@ CaptureVoiceOut *AUD_add_capture ( > QLIST_INSERT_HEAD (&s->cap_head, cap, entries); > QLIST_INSERT_HEAD (&cap->cb_head, cb, entries); > =20 > - hw =3D NULL; > - while ((hw =3D audio_pcm_hw_find_any_out (hw))) { > + QLIST_FOREACH(hw, &glob_audio_state.hw_head_out, entries) { > audio_attach_capture (hw); > } That hunk is unnecessary (although it removes the usage of an unpleasant gl= ue function) > return cap; > diff --git a/audio/audio.h b/audio/audio.h > index 11e56c9..c3c5198 100644 > --- a/audio/audio.h > +++ b/audio/audio.h > @@ -163,4 +163,7 @@ static inline void *advance (void *p, int incr) > int wav_start_capture (CaptureState *s, const char *path, int freq, > int bits, int nchannels); > =20 > +bool audio_is_cleaning_up(void); > +void audio_cleanup(void); > + > #endif /* QEMU_AUDIO_H */ > diff --git a/audio/coreaudio.c b/audio/coreaudio.c > index d4ad224..c751420 100644 > --- a/audio/coreaudio.c > +++ b/audio/coreaudio.c > @@ -36,8 +36,6 @@ > #define MAC_OS_X_VERSION_10_6 1060 > #endif > =20 > -static int isAtexit; > - > typedef struct { > int buffer_frames; > int nbuffers; > @@ -378,11 +376,6 @@ static inline UInt32 isPlaying (AudioDeviceID > outputDeviceID) > return result; > } > =20 > -static void coreaudio_atexit (void) > -{ > - isAtexit =3D 1; > -} > - > static int coreaudio_lock (coreaudioVoiceOut *core, const char *fn_name) > { > int err; > @@ -630,7 +623,7 @@ static void coreaudio_fini_out (HWVoiceOut *hw) > int err; > coreaudioVoiceOut *core =3D (coreaudioVoiceOut *) hw; > =20 > - if (!isAtexit) { > + if (!audio_is_cleaning_up()) { > /* stop playback */ > if (isPlaying(core->outputDeviceID)) { > status =3D AudioDeviceStop(core->outputDeviceID, core->iopro= cid); > @@ -673,7 +666,7 @@ static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd= , > ...) > =20 > case VOICE_DISABLE: > /* stop playback */ > - if (!isAtexit) { > + if (!audio_is_cleaning_up()) { > if (isPlaying(core->outputDeviceID)) { > status =3D AudioDeviceStop(core->outputDeviceID, > core->ioprocid); > @@ -697,7 +690,6 @@ static void *coreaudio_audio_init (void) > CoreaudioConf *conf =3D g_malloc(sizeof(CoreaudioConf)); > *conf =3D glob_conf; > =20 > - atexit(coreaudio_atexit); > return conf; > } > =20 > diff --git a/vl.c b/vl.c > index a14c438..c4eeaff 100644 > --- a/vl.c > +++ b/vl.c > @@ -4612,6 +4612,7 @@ int main(int argc, char **argv, char **envp) > =20 > /* vhost-user must be cleaned up before chardevs. */ > net_cleanup(); > + audio_cleanup(); > monitor_cleanup(); > qemu_chr_cleanup(); > =20 > -- > 2.9.0 >=20 >=20