diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2016-10-22 13:09:41 +0300 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-10-24 15:46:10 +0200 |
commit | 3aef23d7d8ba559c6e74e931702c63b4c5e23dcd (patch) | |
tree | fb68178f0600bed8a08a8426e2a3aadc1e37f0a3 | |
parent | 58fa54947e6b8a26aaeb1b719eabfd0e1461a2b3 (diff) |
char: replace avail_connections
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>
Message-Id: <20161022100951.19562-5-marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | hw/bt/hci-csr.c | 1 | ||||
-rw-r--r-- | include/sysemu/char.h | 1 | ||||
-rw-r--r-- | qemu-char.c | 34 |
3 files changed, 13 insertions, 23 deletions
diff --git a/hw/bt/hci-csr.c b/hw/bt/hci-csr.c index cdf52a9edc..fbb3109cc1 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/include/sysemu/char.h b/include/sysemu/char.h index 6bad8564bc..0628b14531 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; diff --git a/qemu-char.c b/qemu-char.c index 9bd2e652ed..02adea4166 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; @@ -902,10 +888,16 @@ bool qemu_chr_fe_init(CharBackend *b, CharDriverState *s, Error **errp) int tag = 0; 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; } @@ -913,8 +905,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; } static bool qemu_chr_is_busy(CharDriverState *s) @@ -933,7 +928,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; @@ -4782,8 +4776,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]); } |