diff mbox

[28/38] char: replace avail_connections

Message ID 20161022100951.19562-5-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau Oct. 22, 2016, 10:09 a.m. UTC
No need to count the users of a CharDriverState, it can rely on the fact
of whether there is a CharBackend associated or if there is enough space
in the muxer.

Simplify and fold chr_mux_new_fe() in qemu_chr_fe_init() since there is
a single user now. Also switch from fprintf to raising error instead.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/bt/hci-csr.c       |  1 -
 qemu-char.c           | 40 +++++++++++++---------------------------
 include/sysemu/char.h |  1 -
 3 files changed, 13 insertions(+), 29 deletions(-)
diff mbox

Patch

diff --git a/hw/bt/hci-csr.c b/hw/bt/hci-csr.c
index cdf52a9..fbb3109 100644
--- a/hw/bt/hci-csr.c
+++ b/hw/bt/hci-csr.c
@@ -468,7 +468,6 @@  CharDriverState *uart_hci_init(void)
     s->chr.opaque = s;
     s->chr.chr_write = csrhci_write;
     s->chr.chr_ioctl = csrhci_ioctl;
-    s->chr.avail_connections = 1;
 
     s->hci = qemu_next_hci();
     s->hci->opaque = s;
diff --git a/qemu-char.c b/qemu-char.c
index 36ee7a7..f386dcd 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -808,20 +808,6 @@  static void mux_chr_free(struct CharDriverState *chr)
     g_free(d);
 }
 
-static int mux_chr_new_fe(CharDriverState *chr, CharBackend *be, Error **errp)
-{
-    MuxDriver *d = chr->opaque;
-
-    if (d->mux_cnt >= MAX_MUX) {
-        fprintf(stderr, "Cannot add I/O handlers, MUX array is full\n");
-        return -1;
-    }
-
-    d->backends[d->mux_cnt] = be;
-
-    return d->mux_cnt++;
-}
-
 static void mux_chr_set_handlers(CharDriverState *chr, GMainContext *context)
 {
     MuxDriver *d = chr->opaque;
@@ -906,17 +892,17 @@  bool qemu_chr_fe_init(CharBackend *b, CharDriverState *s, Error **errp)
     assert(b);
     assert(s);
 
-    if (s->avail_connections < 1) {
-        error_setg(errp, QERR_DEVICE_IN_USE, s->label);
-        return false;
-    }
-    s->avail_connections--;
-
     if (s->is_mux) {
-        tag = mux_chr_new_fe(s, b, errp);
-        if (tag < 0) {
-            return false;
+        MuxDriver *d = s->opaque;
+
+        if (d->mux_cnt >= MAX_MUX) {
+            goto unavailable;
         }
+
+        d->backends[d->mux_cnt] = b;
+        tag = d->mux_cnt++;
+    } else if (s->be) {
+        goto unavailable;
     } else {
         s->be = b;
     }
@@ -924,8 +910,11 @@  bool qemu_chr_fe_init(CharBackend *b, CharDriverState *s, Error **errp)
     b->fe_open = false;
     b->tag = tag;
     b->chr = s;
-
     return true;
+
+unavailable:
+    error_setg(errp, QERR_DEVICE_IN_USE, s->label);
+    return false;
 }
 
 void qemu_chr_fe_deinit(CharBackend *b)
@@ -934,7 +923,6 @@  void qemu_chr_fe_deinit(CharBackend *b)
 
     if (b->chr) {
         qemu_chr_fe_set_handlers(b, NULL, NULL, NULL, NULL, NULL, true);
-        b->chr->avail_connections++;
         b->chr->be = NULL;
         if (b->chr->is_mux) {
             MuxDriver *d = b->chr->opaque;
@@ -4787,8 +4775,6 @@  ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
     }
 
     chr->label = g_strdup(id);
-    chr->avail_connections =
-        (backend->type == CHARDEV_BACKEND_KIND_MUX) ? MAX_MUX : 1;
     if (!chr->filename) {
         chr->filename = g_strdup(ChardevBackendKind_lookup[backend->type]);
     }
diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index 6bad856..0628b14 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -110,7 +110,6 @@  struct CharDriverState {
     int logfd;
     int be_open;
     int explicit_be_open;
-    int avail_connections;
     int is_mux;
     guint fd_in_tag;
     bool replay;