From patchwork Wed Mar 20 09:43:31 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 229282 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id AF5AC2C00B7 for ; Wed, 20 Mar 2013 20:46:50 +1100 (EST) Received: from localhost ([::1]:39162 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFbc-0007SD-V8 for incoming@patchwork.ozlabs.org; Wed, 20 Mar 2013 05:46:48 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYo-00047f-SR for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:44:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UIFYk-0005lw-7C for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49137) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UIFYj-0005lJ-UZ for qemu-devel@nongnu.org; Wed, 20 Mar 2013 05:43:50 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r2K9hn0N018854 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 20 Mar 2013 05:43:49 -0400 Received: from rincewind.home.kraxel.org (ovpn-116-26.ams2.redhat.com [10.36.116.26]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r2K9hlUV010194; Wed, 20 Mar 2013 05:43:48 -0400 Received: by rincewind.home.kraxel.org (Postfix, from userid 500) id 634DB429E9; Wed, 20 Mar 2013 10:43:46 +0100 (CET) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 20 Mar 2013 10:43:31 +0100 Message-Id: <1363772625-9182-10-git-send-email-kraxel@redhat.com> In-Reply-To: <1363772625-9182-1-git-send-email-kraxel@redhat.com> References: <1363772625-9182-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Anthony Liguori , Gerd Hoffmann Subject: [Qemu-devel] [PATCH 09/23] console: displaystate init revamp X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org We have only one DisplayState, so there is no need for the "next" linking, rip it. Also consolidate all displaystate initialization into init_displaystate(). This function is called by vl.c after creating the devices (and thus all QemuConsoles) and before initializing DisplayChangeListensers (aka gtk/sdl/vnc/spice ui). Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 5 +--- ui/console.c | 73 +++++++++++++++++++++++--------------------------- vl.c | 6 +---- 3 files changed, 36 insertions(+), 48 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index a234c72..3725dae 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -189,12 +189,9 @@ struct DisplayState { bool have_text; QLIST_HEAD(, DisplayChangeListener) listeners; - - struct DisplayState *next; }; -void register_displaystate(DisplayState *ds); -DisplayState *get_displaystate(void); +DisplayState *init_displaystate(void); DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp, int linesize, uint8_t *data, bool byteswap); diff --git a/ui/console.c b/ui/console.c index 45fa580..2c8fd91 100644 --- a/ui/console.c +++ b/ui/console.c @@ -163,6 +163,8 @@ static QemuConsole *active_console; static QemuConsole *consoles[MAX_CONSOLES]; static int nb_consoles = 0; +static void text_console_do_init(CharDriverState *chr, DisplayState *ds); + void vga_hw_update(void) { if (active_console && active_console->hw_update) @@ -1323,39 +1325,37 @@ bool dpy_cursor_define_supported(QemuConsole *con) return false; } -static void dumb_display_init(void) -{ - DisplayState *ds = g_malloc0(sizeof(DisplayState)); - int width = 640; - int height = 480; - - if (is_fixedsize_console()) { - width = active_console->g_width; - height = active_console->g_height; - } - ds->surface = qemu_create_displaysurface(width, height); - - register_displaystate(ds); -} - /***********************************************************/ /* register display */ -void register_displaystate(DisplayState *ds) +/* console.c internal use only */ +static DisplayState *get_alloc_displaystate(void) { - DisplayState **s; - s = &display_state; - while (*s != NULL) - s = &(*s)->next; - ds->next = NULL; - *s = ds; + if (!display_state) { + display_state = g_new0(DisplayState, 1); + } + return display_state; } -DisplayState *get_displaystate(void) +/* + * Called by main(), after creating QemuConsoles + * and before initializing ui (sdl/vnc/...). + */ +DisplayState *init_displaystate(void) { + int i; + if (!display_state) { - dumb_display_init (); + display_state = g_new0(DisplayState, 1); } + + for (i = 0; i < nb_consoles; i++) { + if (consoles[i]->console_type != GRAPHIC_CONSOLE && + consoles[i]->ds == NULL) { + text_console_do_init(consoles[i]->chr, display_state); + } + } + return display_state; } @@ -1365,10 +1365,12 @@ QemuConsole *graphic_console_init(vga_hw_update_ptr update, vga_hw_text_update_ptr text_update, void *opaque) { + int width = 640; + int height = 480; QemuConsole *s; DisplayState *ds; - ds = (DisplayState *) g_malloc0(sizeof(DisplayState)); + ds = get_alloc_displaystate(); trace_console_gfx_new(); s = new_console(ds, GRAPHIC_CONSOLE); s->hw_update = update; @@ -1377,9 +1379,9 @@ QemuConsole *graphic_console_init(vga_hw_update_ptr update, s->hw_text_update = text_update; s->hw = opaque; - ds->surface = qemu_create_displaysurface(640, 480); - - register_displaystate(ds); + if (!ds->surface) { + ds->surface = qemu_create_displaysurface(width, height); + } return s; } @@ -1505,6 +1507,10 @@ static CharDriverState *text_console_init(ChardevVC *vc) s->g_height = height; chr->opaque = s; chr->chr_set_echo = text_console_set_echo; + + if (display_state) { + text_console_do_init(chr, display_state); + } return chr; } @@ -1520,17 +1526,6 @@ void register_vc_handler(VcHandler *handler) vc_handler = handler; } -void text_consoles_set_display(DisplayState *ds) -{ - int i; - - for (i = 0; i < nb_consoles; i++) { - if (consoles[i]->console_type != GRAPHIC_CONSOLE) { - text_console_do_init(consoles[i]->chr, ds); - } - } -} - void qemu_console_resize(QemuConsole *s, int width, int height) { s->g_width = width; diff --git a/vl.c b/vl.c index ce51e65..c5eb9a7 100644 --- a/vl.c +++ b/vl.c @@ -4300,8 +4300,7 @@ int main(int argc, char **argv, char **envp) net_check_clients(); - /* just use the first displaystate for the moment */ - ds = get_displaystate(); + ds = init_displaystate(); /* init local displays */ switch (display_type) { @@ -4357,9 +4356,6 @@ int main(int argc, char **argv, char **envp) } #endif - /* display setup */ - text_consoles_set_display(ds); - if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { exit(1); }