diff mbox

[1/3] char: clean up remaining chardevs when leaving

Message ID 1466075835-28494-2-git-send-email-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau June 16, 2016, 11:17 a.m. UTC
From: Marc-André Lureau <marcandre.lureau@redhat.com>

This helps to remove various chardev resources leaks when leaving qemu.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/sysemu/char.h | 7 +++++++
 qemu-char.c           | 9 +++++++++
 vl.c                  | 1 +
 3 files changed, 17 insertions(+)

Comments

Paolo Bonzini June 16, 2016, 12:19 p.m. UTC | #1
On 16/06/2016 13:17, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> This helps to remove various chardev resources leaks when leaving qemu.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/sysemu/char.h | 7 +++++++
>  qemu-char.c           | 9 +++++++++
>  vl.c                  | 1 +
>  3 files changed, 17 insertions(+)
> 
> diff --git a/include/sysemu/char.h b/include/sysemu/char.h
> index 372a6fd..8954be1 100644
> --- a/include/sysemu/char.h
> +++ b/include/sysemu/char.h
> @@ -382,6 +382,13 @@ void qemu_chr_be_write_impl(CharDriverState *s, uint8_t *buf, int len);
>   */
>  void qemu_chr_be_event(CharDriverState *s, int event);
>  
> +/**
> + * @qemu_chr_cleanup:
> + *
> + * Delete all chardevs (when leaving qemu)
> + */
> +void qemu_chr_cleanup(void);
> +
>  void qemu_chr_add_handlers(CharDriverState *s,
>                             IOCanReadHandler *fd_can_read,
>                             IOReadHandler *fd_read,
> diff --git a/qemu-char.c b/qemu-char.c
> index b13ecbb..bf098a1 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -4088,6 +4088,15 @@ CharDriverState *qemu_chr_find(const char *name)
>      return NULL;
>  }
>  
> +void qemu_chr_cleanup(void)
> +{
> +    CharDriverState *chr;
> +
> +    QTAILQ_FOREACH(chr, &chardevs, next) {
> +        qemu_chr_delete(chr);
> +    }
> +}
> +
>  QemuOptsList qemu_chardev_opts = {
>      .name = "chardev",
>      .implied_opt_name = "backend",
> diff --git a/vl.c b/vl.c
> index 45eff56..ac92b1d 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4628,6 +4628,7 @@ int main(int argc, char **argv, char **envp)
>  #ifdef CONFIG_TPM
>      tpm_cleanup();
>  #endif
> +    qemu_chr_cleanup();

Given the amount of exit(1) calls surviving in QEMU, it's probably
better to use atexit here.

Paolo

>      return 0;
>  }
>
Marc-Andre Lureau June 16, 2016, 12:25 p.m. UTC | #2
Hi

----- Original Message -----
> > +
> >  QemuOptsList qemu_chardev_opts = {
> >      .name = "chardev",
> >      .implied_opt_name = "backend",
> > diff --git a/vl.c b/vl.c
> > index 45eff56..ac92b1d 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -4628,6 +4628,7 @@ int main(int argc, char **argv, char **envp)
> >  #ifdef CONFIG_TPM
> >      tpm_cleanup();
> >  #endif
> > +    qemu_chr_cleanup();
> 
> Given the amount of exit(1) calls surviving in QEMU, it's probably
> better to use atexit here.

Agreed, fixed
diff mbox

Patch

diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index 372a6fd..8954be1 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -382,6 +382,13 @@  void qemu_chr_be_write_impl(CharDriverState *s, uint8_t *buf, int len);
  */
 void qemu_chr_be_event(CharDriverState *s, int event);
 
+/**
+ * @qemu_chr_cleanup:
+ *
+ * Delete all chardevs (when leaving qemu)
+ */
+void qemu_chr_cleanup(void);
+
 void qemu_chr_add_handlers(CharDriverState *s,
                            IOCanReadHandler *fd_can_read,
                            IOReadHandler *fd_read,
diff --git a/qemu-char.c b/qemu-char.c
index b13ecbb..bf098a1 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -4088,6 +4088,15 @@  CharDriverState *qemu_chr_find(const char *name)
     return NULL;
 }
 
+void qemu_chr_cleanup(void)
+{
+    CharDriverState *chr;
+
+    QTAILQ_FOREACH(chr, &chardevs, next) {
+        qemu_chr_delete(chr);
+    }
+}
+
 QemuOptsList qemu_chardev_opts = {
     .name = "chardev",
     .implied_opt_name = "backend",
diff --git a/vl.c b/vl.c
index 45eff56..ac92b1d 100644
--- a/vl.c
+++ b/vl.c
@@ -4628,6 +4628,7 @@  int main(int argc, char **argv, char **envp)
 #ifdef CONFIG_TPM
     tpm_cleanup();
 #endif
+    qemu_chr_cleanup();
 
     return 0;
 }