qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObj


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject
Date: Wed, 09 Aug 2017 12:10:20 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)

Eric Blake <address@hidden> writes:

> When we don't have to do any % interpolation in qmp() and friends,
> there is no point wasting time allocating a QObject from the format
> string only to then format it back into the string we send over
> the wire.

True, but there's also no point in complicating things for efficiency
here.

> This is a temporary measure: it becomes important in the next
> patch, where test-qga will be refactored to do interpolation in
> place, and where we must not re-interpolate the string; but will
> go away when further refactoring makes it easier to directly
> output a string without going through qmp_fd_sendv().

Okay, let's see how that works out.

> Signed-off-by: Eric Blake <address@hidden>
> ---
>  tests/libqtest.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index cde737ec5a..0cb439eefa 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -448,7 +448,7 @@ QDict *qtest_qmp_receive(QTestState *s)
>   */
>  void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>  {
> -    QObject *qobj;
> +    QObject *qobj = NULL;
>      int log = getenv("QTEST_LOG") != NULL;
>      QString *qstr;
>      const char *str;
> @@ -462,9 +462,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      }
>      assert(*fmt);
>
> -    /* Going through qobject ensures we escape strings properly. */
> -    qobj = qobject_from_jsonv(fmt, ap);
> -    qstr = qobject_to_json(qobj);
> +    /*
> +     * A round trip through QObject is only needed if % interpolation
> +     * is used.  We interpolate through QObject rather than sprintf in
> +     * order to escape strings properly.
> +     */
> +    if (strchr(fmt, '%')) {
> +        qobj = qobject_from_jsonv(fmt, ap);
> +        qstr = qobject_to_json(qobj);
> +    } else {

qobj = NULL here would be clearer than the initializer.

> +        qstr = qstring_from_str(fmt);
> +    }
>
>      /*
>       * BUG: QMP doesn't react to input until it sees a newline, an



reply via email to

[Prev in Thread] Current Thread [Next in Thread]