Re: [Qemu-devel] [PATCH 32/38] char: use a static array for backends

2016-10-23 Thread Paolo Bonzini


On 22/10/2016 12:09, Marc-André Lureau wrote:
> Number and kinds of backends is known at compile-time, use a fixed-sized
> static array to simplify iterations & lookups.
> 
> Signed-off-by: Marc-André Lureau 
> ---
>  backends/baum.c   |   2 +-
>  backends/msmouse.c|   2 +-
>  backends/testdev.c|   2 +-
>  qemu-char.c   | 117 
> +++---
>  spice-qemu-char.c |   4 +-
>  ui/console.c  |   2 +-
>  include/sysemu/char.h |   2 +-
>  7 files changed, 70 insertions(+), 61 deletions(-)
> 
> diff --git a/backends/baum.c b/backends/baum.c
> index 4fe11de..0a65c99 100644
> --- a/backends/baum.c
> +++ b/backends/baum.c
> @@ -644,7 +644,7 @@ fail_handle:
>  static void register_types(void)
>  {
>  static const CharDriver driver = {
> -"braille", CHARDEV_BACKEND_KIND_BRAILLE, NULL, chr_baum_init
> +{ "braille" }, CHARDEV_BACKEND_KIND_BRAILLE, NULL, chr_baum_init
>  };
>  
>  register_char_driver(&driver);
> diff --git a/backends/msmouse.c b/backends/msmouse.c
> index d6ab4ca..3367d67 100644
> --- a/backends/msmouse.c
> +++ b/backends/msmouse.c
> @@ -180,7 +180,7 @@ static CharDriverState *qemu_chr_open_msmouse(const char 
> *id,
>  static void register_types(void)
>  {
>  static const CharDriver driver = {
> -"msmouse", CHARDEV_BACKEND_KIND_MSMOUSE, NULL, qemu_chr_open_msmouse
> +{ "msmouse" }, CHARDEV_BACKEND_KIND_MSMOUSE, NULL, 
> qemu_chr_open_msmouse
>  };
>  register_char_driver(&driver);
>  }
> diff --git a/backends/testdev.c b/backends/testdev.c
> index 5936189..d41352a 100644
> --- a/backends/testdev.c
> +++ b/backends/testdev.c
> @@ -131,7 +131,7 @@ static CharDriverState *chr_testdev_init(const char *id,
>  static void register_types(void)
>  {
>  static const CharDriver driver = {
> -"testdev", CHARDEV_BACKEND_KIND_TESTDEV, NULL, chr_testdev_init
> +{ "testdev" }, CHARDEV_BACKEND_KIND_TESTDEV, NULL, chr_testdev_init
>  };
>  register_char_driver(&driver);
>  }
> diff --git a/qemu-char.c b/qemu-char.c
> index 594e795..7348cb0 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -4042,20 +4042,20 @@ static void qemu_chr_parse_udp(QemuOpts *opts, 
> ChardevBackend *backend,
>  }
>  }
>  
> -static GSList *backends;
> +static const CharDriver *backends[CHARDEV_BACKEND_KIND__MAX];
>  
>  void register_char_driver(const CharDriver *driver)
>  {
> -backends = g_slist_append(backends, (void *)driver);
> +backends[driver->kind] = driver;
>  }
>  
>  CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
>  Error **errp)
>  {
>  Error *local_err = NULL;
> -CharDriver *cd;
> +const CharDriver *cd;
>  CharDriverState *chr;
> -GSList *i;
> +int i;
>  ChardevReturn *ret = NULL;
>  ChardevBackend *backend;
>  const char *id = qemu_opts_id(opts);
> @@ -4069,9 +4069,14 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
>  
>  if (is_help_option(qemu_opt_get(opts, "backend"))) {
>  fprintf(stderr, "Available chardev backend types:\n");
> -for (i = backends; i; i = i->next) {
> -cd = i->data;
> -fprintf(stderr, "%s\n", cd->name);
> +for (i = 0; i < ARRAY_SIZE(backends); i++) {
> +cd = backends[i];
> +if (cd) {
> +fprintf(stderr, "%s\n", cd->name[0]);
> +if (cd->name[1]) {
> +fprintf(stderr, "%s\n", cd->name[1]);
> +}
> +}
>  }
>  exit(!is_help_option(qemu_opt_get(opts, "backend")));
>  }
> @@ -4081,14 +4086,17 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts 
> *opts,
>  goto err;
>  }
>  
> -for (i = backends; i; i = i->next) {
> -cd = i->data;
> +cd = NULL;
> +for (i = 0; i < ARRAY_SIZE(backends); i++) {
> +const char *name = qemu_opt_get(opts, "backend");
> +cd = backends[i];
>  
> -if (strcmp(cd->name, qemu_opt_get(opts, "backend")) == 0) {
> +if (cd && (g_str_equal(cd->name[0], name) ||
> +   (cd->name[1] && g_str_equal(cd->name[1], name {
>  break;
>  }
>  }
> -if (i == NULL) {
> +if (cd == NULL) {
>  error_setg(errp, "chardev: backend \"%s\" not found",
> qemu_opt_get(opts, "backend"));
>  goto err;
> @@ -4293,20 +4301,32 @@ ChardevInfoList *qmp_query_chardev(Error **errp)
>  return chr_list;
>  }
>  
> +static ChardevBackendInfoList *
> +qmp_prepend_backend(ChardevBackendInfoList *list, const CharDriver *c,
> +const char *name)
> +{
> +ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
> +info->value = g_malloc0(sizeof(*info->value));
> +info->value->name = g_strdup(name);
> +info->next = list;
> +return info;
> +
> +}
> +
>  ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
>  {

[Qemu-devel] [PATCH 32/38] char: use a static array for backends

2016-10-22 Thread Marc-André Lureau
Number and kinds of backends is known at compile-time, use a fixed-sized
static array to simplify iterations & lookups.

Signed-off-by: Marc-André Lureau 
---
 backends/baum.c   |   2 +-
 backends/msmouse.c|   2 +-
 backends/testdev.c|   2 +-
 qemu-char.c   | 117 +++---
 spice-qemu-char.c |   4 +-
 ui/console.c  |   2 +-
 include/sysemu/char.h |   2 +-
 7 files changed, 70 insertions(+), 61 deletions(-)

diff --git a/backends/baum.c b/backends/baum.c
index 4fe11de..0a65c99 100644
--- a/backends/baum.c
+++ b/backends/baum.c
@@ -644,7 +644,7 @@ fail_handle:
 static void register_types(void)
 {
 static const CharDriver driver = {
-"braille", CHARDEV_BACKEND_KIND_BRAILLE, NULL, chr_baum_init
+{ "braille" }, CHARDEV_BACKEND_KIND_BRAILLE, NULL, chr_baum_init
 };
 
 register_char_driver(&driver);
diff --git a/backends/msmouse.c b/backends/msmouse.c
index d6ab4ca..3367d67 100644
--- a/backends/msmouse.c
+++ b/backends/msmouse.c
@@ -180,7 +180,7 @@ static CharDriverState *qemu_chr_open_msmouse(const char 
*id,
 static void register_types(void)
 {
 static const CharDriver driver = {
-"msmouse", CHARDEV_BACKEND_KIND_MSMOUSE, NULL, qemu_chr_open_msmouse
+{ "msmouse" }, CHARDEV_BACKEND_KIND_MSMOUSE, NULL, 
qemu_chr_open_msmouse
 };
 register_char_driver(&driver);
 }
diff --git a/backends/testdev.c b/backends/testdev.c
index 5936189..d41352a 100644
--- a/backends/testdev.c
+++ b/backends/testdev.c
@@ -131,7 +131,7 @@ static CharDriverState *chr_testdev_init(const char *id,
 static void register_types(void)
 {
 static const CharDriver driver = {
-"testdev", CHARDEV_BACKEND_KIND_TESTDEV, NULL, chr_testdev_init
+{ "testdev" }, CHARDEV_BACKEND_KIND_TESTDEV, NULL, chr_testdev_init
 };
 register_char_driver(&driver);
 }
diff --git a/qemu-char.c b/qemu-char.c
index 594e795..7348cb0 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -4042,20 +4042,20 @@ static void qemu_chr_parse_udp(QemuOpts *opts, 
ChardevBackend *backend,
 }
 }
 
-static GSList *backends;
+static const CharDriver *backends[CHARDEV_BACKEND_KIND__MAX];
 
 void register_char_driver(const CharDriver *driver)
 {
-backends = g_slist_append(backends, (void *)driver);
+backends[driver->kind] = driver;
 }
 
 CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
 Error **errp)
 {
 Error *local_err = NULL;
-CharDriver *cd;
+const CharDriver *cd;
 CharDriverState *chr;
-GSList *i;
+int i;
 ChardevReturn *ret = NULL;
 ChardevBackend *backend;
 const char *id = qemu_opts_id(opts);
@@ -4069,9 +4069,14 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
 
 if (is_help_option(qemu_opt_get(opts, "backend"))) {
 fprintf(stderr, "Available chardev backend types:\n");
-for (i = backends; i; i = i->next) {
-cd = i->data;
-fprintf(stderr, "%s\n", cd->name);
+for (i = 0; i < ARRAY_SIZE(backends); i++) {
+cd = backends[i];
+if (cd) {
+fprintf(stderr, "%s\n", cd->name[0]);
+if (cd->name[1]) {
+fprintf(stderr, "%s\n", cd->name[1]);
+}
+}
 }
 exit(!is_help_option(qemu_opt_get(opts, "backend")));
 }
@@ -4081,14 +4086,17 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts,
 goto err;
 }
 
-for (i = backends; i; i = i->next) {
-cd = i->data;
+cd = NULL;
+for (i = 0; i < ARRAY_SIZE(backends); i++) {
+const char *name = qemu_opt_get(opts, "backend");
+cd = backends[i];
 
-if (strcmp(cd->name, qemu_opt_get(opts, "backend")) == 0) {
+if (cd && (g_str_equal(cd->name[0], name) ||
+   (cd->name[1] && g_str_equal(cd->name[1], name {
 break;
 }
 }
-if (i == NULL) {
+if (cd == NULL) {
 error_setg(errp, "chardev: backend \"%s\" not found",
qemu_opt_get(opts, "backend"));
 goto err;
@@ -4293,20 +4301,32 @@ ChardevInfoList *qmp_query_chardev(Error **errp)
 return chr_list;
 }
 
+static ChardevBackendInfoList *
+qmp_prepend_backend(ChardevBackendInfoList *list, const CharDriver *c,
+const char *name)
+{
+ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
+info->value = g_malloc0(sizeof(*info->value));
+info->value->name = g_strdup(name);
+info->next = list;
+return info;
+
+}
+
 ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
 {
 ChardevBackendInfoList *backend_list = NULL;
-CharDriver *c = NULL;
-GSList *i = NULL;
-
-for (i = backends; i; i = i->next) {
-ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
-c = i->data;
-info->value = g_malloc0(sizeof(*info->value));
-info->value->name = g_strdup(c->name);
+