aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2015-06-22 18:20:18 +0200
committerMarc-André Lureau <marcandre.lureau@redhat.com>2015-10-24 18:02:48 +0200
commit1ad78ea51aad7978638299a27004049935c2d913 (patch)
treedb3a45569be0c91e195a54e89425b61323fb90b9
parentbbfc2efefe9779f85dfe2713aec1568b1ba871ad (diff)
downloadqemu-1ad78ea51aad7978638299a27004049935c2d913.zip
qemu-1ad78ea51aad7978638299a27004049935c2d913.tar.gz
qemu-1ad78ea51aad7978638299a27004049935c2d913.tar.bz2
char: add qemu_chr_free()
If a chardev is allowed to be created outside of QMP, then it must be also possible to free it. This is useful for ivshmem that creates chardev anonymously and must be able to free them. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Claudio Fontana <claudio.fontana@huawei.com>
-rw-r--r--include/sysemu/char.h10
-rw-r--r--qemu-char.c9
2 files changed, 16 insertions, 3 deletions
diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index edf7669..aff193f 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -128,11 +128,19 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename,
/**
* @qemu_chr_delete:
*
- * Destroy a character backend.
+ * Destroy a character backend and remove it from the list of
+ * identified character backends.
*/
void qemu_chr_delete(CharDriverState *chr);
/**
+ * @qemu_chr_free:
+ *
+ * Destroy a character backend.
+ */
+void qemu_chr_free(CharDriverState *chr);
+
+/**
* @qemu_chr_fe_set_echo:
*
* Ask the backend to override its normal echo setting. This only really
diff --git a/qemu-char.c b/qemu-char.c
index 908e712..c4eb4ee 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -3876,9 +3876,8 @@ void qemu_chr_fe_release(CharDriverState *s)
s->avail_connections++;
}
-void qemu_chr_delete(CharDriverState *chr)
+void qemu_chr_free(CharDriverState *chr)
{
- QTAILQ_REMOVE(&chardevs, chr, next);
if (chr->chr_close) {
chr->chr_close(chr);
}
@@ -3888,6 +3887,12 @@ void qemu_chr_delete(CharDriverState *chr)
g_free(chr);
}
+void qemu_chr_delete(CharDriverState *chr)
+{
+ QTAILQ_REMOVE(&chardevs, chr, next);
+ qemu_chr_free(chr);
+}
+
ChardevInfoList *qmp_query_chardev(Error **errp)
{
ChardevInfoList *chr_list = NULL;