From: Markus Armbruster <armbru@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org, peterx@redhat.com,
Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 11/12] qga: process_event() simplification
Date: Tue, 17 Jul 2018 17:25:21 +0200 [thread overview]
Message-ID: <87y3e9c2am.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20180706121354.2021-12-marcandre.lureau@redhat.com> ("Marc-André Lureau"'s message of "Fri, 6 Jul 2018 14:13:53 +0200")
Copying the maintainer Michael Roth.
Marc-André Lureau <marcandre.lureau@redhat.com> writes:
> Simplify the code around qmp_dispatch():
> - rely on qmp_dispatch/check_obj() for message checking
> - have a single send_response() point
> - constify send_response() argument
> - rsp/req variable renaming for clarity
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> qga/main.c | 58 ++++++++++++++----------------------------------------
> 1 file changed, 15 insertions(+), 43 deletions(-)
>
> diff --git a/qga/main.c b/qga/main.c
> index 0784761605..b0a88ee5cf 100644
> --- a/qga/main.c
> +++ b/qga/main.c
> @@ -545,15 +545,15 @@ fail:
> #endif
> }
>
> -static int send_response(GAState *s, QDict *payload)
> +static int send_response(GAState *s, const QDict *rsp)
> {
> const char *buf;
> QString *payload_qstr, *response_qstr;
> GIOStatus status;
>
> - g_assert(payload && s->channel);
> + g_assert(rsp && s->channel);
>
> - payload_qstr = qobject_to_json(QOBJECT(payload));
> + payload_qstr = qobject_to_json(QOBJECT(rsp));
> if (!payload_qstr) {
> return -EINVAL;
> }
> @@ -579,63 +579,35 @@ static int send_response(GAState *s, QDict *payload)
> return 0;
> }
>
> -static void process_command(GAState *s, QDict *req)
> -{
> - QDict *rsp;
> - int ret;
> -
> - g_assert(req);
> - g_debug("processing command");
> - rsp = qmp_dispatch(&ga_commands, QOBJECT(req), false);
> - if (rsp) {
> - ret = send_response(s, rsp);
> - if (ret < 0) {
> - g_warning("error sending response: %s", strerror(-ret));
> - }
> - qobject_unref(rsp);
> - }
> -}
> -
> /* handle requests/control events coming in over the channel */
> static void process_event(JSONMessageParser *parser, GQueue *tokens)
> {
> GAState *s = container_of(parser, GAState, parser);
> - QObject *obj;
> - QDict *qdict;
> + QObject *req;
> + QDict *rsp = NULL;
> Error *err = NULL;
> int ret;
>
> g_assert(s && parser);
>
> g_debug("process_event: called");
> - obj = json_parser_parse_err(tokens, NULL, &err);
> +
> + req = json_parser_parse_err(tokens, NULL, &err);
> if (err) {
> - goto err;
> - }
> - qdict = qobject_to(QDict, obj);
> - if (!qdict) {
> - error_setg(&err, QERR_JSON_PARSING);
> - goto err;
> - }
> - if (!qdict_haskey(qdict, "execute")) {
> - g_warning("unrecognized payload format");
> - error_setg(&err, QERR_UNSUPPORTED);
> - goto err;
> + rsp = qmp_error_response(err);
> + goto end;
> }
>
> - process_command(s, qdict);
> - qobject_unref(obj);
> - return;
> + g_debug("processing command");
> + rsp = qmp_dispatch(&ga_commands, req, false);
>
> -err:
> - g_warning("failed to parse event: %s", error_get_pretty(err));
> - qdict = qmp_error_response(err);
> - ret = send_response(s, qdict);
> +end:
> + ret = send_response(s, rsp);
> if (ret < 0) {
> g_warning("error sending error response: %s", strerror(-ret));
> }
> - qobject_unref(qdict);
> - qobject_unref(obj);
> + qobject_unref(rsp);
> + qobject_unref(req);
> }
>
> /* false return signals GAChannel to close the current client connection */
Nice. It changes a couple of error messages:
* When @req isn't a dictionary, from
Invalid JSON syntax
to
QMP input must be a JSON object
* When @req lacks member "execute", from
this feature or command is not currently supported
to
QMP input lacks member 'execute'
Improvement, except the QMP part is a bit odd.
Let's mention the error message improvments in the commit message.
next prev parent reply other threads:[~2018-07-17 15:25 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-06 12:13 [Qemu-devel] [PATCH 00/12] RFC: monitor: various code simplification and fixes Marc-André Lureau
2018-07-06 12:13 ` [Qemu-devel] [PATCH 01/12] tests: change /0.15/* tests to /qmp/* Marc-André Lureau
2018-07-06 12:13 ` [Qemu-devel] [PATCH 02/12] monitor: consitify qmp_send_response() QDict argument Marc-André Lureau
2018-07-12 12:27 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 03/12] qmp: constify qmp_is_oob() Marc-André Lureau
2018-07-12 12:27 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 04/12] Revert "qmp: isolate responses into io thread" Marc-André Lureau
2018-07-12 13:14 ` Markus Armbruster
2018-07-12 13:32 ` Marc-André Lureau
2018-07-12 14:27 ` Peter Xu
2018-07-06 12:13 ` [Qemu-devel] [PATCH 05/12] monitor: no need to save need_resume Marc-André Lureau
2018-07-17 5:38 ` Markus Armbruster
2018-07-17 6:05 ` Peter Xu
2018-07-06 12:13 ` [Qemu-devel] [PATCH 06/12] qga: process_event() simplification and leak fix Marc-André Lureau
2018-07-17 5:53 ` Markus Armbruster
2018-07-17 9:27 ` Marc-André Lureau
2018-07-17 12:14 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 07/12] json-parser: always set an error if return NULL Marc-André Lureau
2018-07-17 7:06 ` Markus Armbruster
2018-07-19 16:59 ` Marc-André Lureau
2018-07-20 6:03 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 08/12] json-lexer: make it safe to call multiple times Marc-André Lureau
2018-07-17 7:22 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 09/12] tests: add a few qemu-qmp tests Marc-André Lureau
2018-07-17 8:01 ` Markus Armbruster
2018-07-17 9:57 ` Marc-André Lureau
2018-07-17 13:15 ` Markus Armbruster
2018-07-19 17:20 ` Marc-André Lureau
2018-07-06 12:13 ` [Qemu-devel] [PATCH 10/12] tests: add a qmp success-response test Marc-André Lureau
2018-07-17 15:12 ` Markus Armbruster
2018-07-06 12:13 ` [Qemu-devel] [PATCH 11/12] qga: process_event() simplification Marc-André Lureau
2018-07-17 15:25 ` Markus Armbruster [this message]
2018-07-06 12:13 ` [Qemu-devel] [PATCH 12/12] RFC: qmp: rework 'id' handling Marc-André Lureau
2018-07-17 16:05 ` Markus Armbruster
2018-07-19 17:45 ` Marc-André Lureau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y3e9c2am.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.