From 41ac54b253f41df924c350ef63564df8e1d8ad88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 21 Oct 2016 23:44:44 +0300 Subject: char: allocate CharDriverState as a single object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a single allocation for CharDriverState, this avoids extra allocations & pointers, and is a step towards more object-oriented CharDriver. Gtk console is a bit peculiar, gd_vc_chr_set_echo() used to have a temporary VirtualConsole to save the echo bit. Instead now, we consider whether vcd->console is set or not, and restore the echo bit saved in VCDriverState when calling gd_vc_vte_init(). The casts added are temporary, they are replaced with QOM type-safe macros in a later patch in this series. Signed-off-by: Marc-André Lureau Reviewed-by: Eric Blake Signed-off-by: Paolo Bonzini --- ui/console.c | 21 +++++++++++++++------ ui/gtk.c | 30 +++++++++++++++++++----------- 2 files changed, 34 insertions(+), 17 deletions(-) (limited to 'ui') diff --git a/ui/console.c b/ui/console.c index f48ba26..495d5a2 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1046,9 +1046,15 @@ void console_select(unsigned int index) } } +typedef struct VCDriverState { + CharDriverState parent; + QemuConsole *console; +} VCDriverState; + static int console_puts(CharDriverState *chr, const uint8_t *buf, int len) { - QemuConsole *s = chr->opaque; + VCDriverState *drv = (VCDriverState *)chr; + QemuConsole *s = drv->console; int i; if (!s->ds) { @@ -1958,7 +1964,8 @@ int qemu_console_get_height(QemuConsole *con, int fallback) static void text_console_set_echo(CharDriverState *chr, bool echo) { - QemuConsole *s = chr->opaque; + VCDriverState *drv = (VCDriverState *)chr; + QemuConsole *s = drv->console; s->echo = echo; } @@ -1998,12 +2005,11 @@ static const GraphicHwOps text_console_ops = { static void text_console_do_init(CharDriverState *chr, DisplayState *ds) { - QemuConsole *s; + VCDriverState *drv = (VCDriverState *)chr; + QemuConsole *s = drv->console; int g_width = 80 * FONT_WIDTH; int g_height = 24 * FONT_HEIGHT; - s = chr->opaque; - s->out_fifo.buf = s->out_fifo_buf; s->out_fifo.buf_size = sizeof(s->out_fifo_buf); s->kbd_timer = timer_new_ms(QEMU_CLOCK_REALTIME, kbd_send_chars, s); @@ -2056,6 +2062,7 @@ static CharDriverState *text_console_init(ChardevVC *vc, Error **errp) { ChardevCommon *common = qapi_ChardevVC_base(vc); CharDriverState *chr; + VCDriverState *drv; QemuConsole *s; unsigned width = 0; unsigned height = 0; @@ -2092,7 +2099,8 @@ static CharDriverState *text_console_init(ChardevVC *vc, Error **errp) } s->chr = chr; - chr->opaque = s; + drv = (VCDriverState *)chr; + drv->console = s; if (display_state) { text_console_do_init(chr, display_state); @@ -2196,6 +2204,7 @@ static const TypeInfo qemu_console_info = { }; static const CharDriver vc_driver = { + .instance_size = sizeof(VCDriverState), .kind = CHARDEV_BACKEND_KIND_VC, .parse = qemu_chr_parse_vc, .create = vc_init, diff --git a/ui/gtk.c b/ui/gtk.c index 608400b..90cf4d5 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -181,6 +181,12 @@ struct GtkDisplayState { bool ignore_keys; }; +typedef struct VCDriverState { + CharDriverState parent; + VirtualConsole *console; + bool echo; +} VCDriverState; + static void gd_grab_pointer(VirtualConsole *vc, const char *reason); static void gd_ungrab_pointer(GtkDisplayState *s); static void gd_grab_keyboard(VirtualConsole *vc, const char *reason); @@ -1685,7 +1691,8 @@ static void gd_vc_adjustment_changed(GtkAdjustment *adjustment, void *opaque) static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len) { - VirtualConsole *vc = chr->opaque; + VCDriverState *vcd = (VCDriverState *)chr; + VirtualConsole *vc = vcd->console; vte_terminal_feed(VTE_TERMINAL(vc->vte.terminal), (const char *)buf, len); return len; @@ -1693,9 +1700,14 @@ static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len) static void gd_vc_chr_set_echo(CharDriverState *chr, bool echo) { - VirtualConsole *vc = chr->opaque; + VCDriverState *vcd = (VCDriverState *)chr; + VirtualConsole *vc = vcd->console; - vc->vte.echo = echo; + if (vc) { + vc->vte.echo = echo; + } else { + vcd->echo = echo; + } } static int nb_vcs; @@ -1704,6 +1716,7 @@ static CharDriverState *vcs[MAX_VCS]; static CharDriverState *gd_vc_handler(ChardevVC *vc, Error **errp) { static const CharDriver gd_vc_driver = { + .instance_size = sizeof(VCDriverState), .kind = CHARDEV_BACKEND_KIND_VC, .chr_write = gd_vc_chr_write, .chr_set_echo = gd_vc_chr_set_echo, @@ -1722,9 +1735,6 @@ static CharDriverState *gd_vc_handler(ChardevVC *vc, Error **errp) return NULL; } - /* Temporary, until gd_vc_vte_init runs. */ - chr->opaque = g_new0(VirtualConsole, 1); - vcs[nb_vcs++] = chr; return chr; @@ -1765,14 +1775,12 @@ static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, GtkWidget *box; GtkWidget *scrollbar; GtkAdjustment *vadjustment; - VirtualConsole *tmp_vc = chr->opaque; + VCDriverState *vcd = (VCDriverState *)chr; vc->s = s; - vc->vte.echo = tmp_vc->vte.echo; - + vc->vte.echo = vcd->echo; vc->vte.chr = chr; - chr->opaque = vc; - g_free(tmp_vc); + vcd->console = vc; snprintf(buffer, sizeof(buffer), "vc%d", idx); vc->label = g_strdup_printf("%s", vc->vte.chr->label -- cgit v1.1