diff mbox

[v4,10/22] libqtest: Skip round-trip through QObject

Message ID 20170804012551.2714-11-eblake@redhat.com
State New
Headers show

Commit Message

Eric Blake Aug. 4, 2017, 1:25 a.m. UTC
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.

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().

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

Comments

Markus Armbruster Aug. 9, 2017, 10:10 a.m. UTC | #1
Eric Blake <eblake@redhat.com> 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 <eblake@redhat.com>
> ---
>  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
diff mbox

Patch

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 {
+        qstr = qstring_from_str(fmt);
+    }

     /*
      * BUG: QMP doesn't react to input until it sees a newline, an