Re: [Qemu-devel] [PATCH 32/38] char: use a static array for backends
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
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); +