[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 26/38] qmp: fold do_qmp_dispatch() in qmp_dispatc
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 26/38] qmp: fold do_qmp_dispatch() in qmp_dispatch() |
Date: |
Mon, 26 Mar 2018 17:09:04 +0200 |
qmp_dispatch() is now a simple wrapper for do_qmp_dispatch(). In order
to prepare for following asynchronous function, merge the two
functions, which result in less code.
Signed-off-by: Marc-André Lureau <address@hidden>
---
qapi/qmp-dispatch.c | 62 ++++++++++++++++++---------------------------
1 file changed, 25 insertions(+), 37 deletions(-)
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 92079c0621..4a73cf88b3 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -114,47 +114,50 @@ QDict *qmp_dispatch_check_obj(const QObject *request,
Error **errp)
return dict;
}
-static QObject *do_qmp_dispatch(QmpCommandList *cmds, QDict *dict,
- Error **errp)
+void qmp_dispatch(QmpSession *session, QDict *req)
{
- Error *local_err = NULL;
const char *command;
- QDict *args;
+ QDict *args = NULL;
QmpCommand *cmd;
- QObject *ret = NULL;
+ Error *err = NULL;
- command = qdict_get_str(dict, "execute");
- cmd = qmp_find_command(cmds, command);
+ command = qdict_get_str(req, "execute");
+ cmd = qmp_find_command(session->cmds, command);
if (cmd == NULL) {
- error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
+ error_set(&err, ERROR_CLASS_COMMAND_NOT_FOUND,
"The command %s has not been found", command);
- return NULL;
+ goto end;
}
if (!cmd->enabled) {
- error_setg(errp, "The command %s has been disabled for this instance",
+ error_setg(&err, "The command %s has been disabled for this instance",
command);
- return NULL;
+ goto end;
}
- if (!qdict_haskey(dict, "arguments")) {
+ if (!qdict_haskey(req, "arguments")) {
args = qdict_new();
} else {
- args = qdict_get_qdict(dict, "arguments");
+ args = qdict_get_qdict(req, "arguments");
QINCREF(args);
}
- cmd->fn(args, &ret, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- } else if (cmd->options & QCO_NO_SUCCESS_RESP) {
- g_assert(!ret);
- } else if (!ret) {
- ret = QOBJECT(qdict_new());
+ {
+ QObject *ret = NULL;
+ cmd->fn(args, &ret, &err);
+ if (err || cmd->options & QCO_NO_SUCCESS_RESP) {
+ assert(!ret);
+ goto end;
+ } else if (!ret) {
+ ret = QOBJECT(qdict_new());
+ }
+ qmp_return(qmp_return_new(session, req), ret);
}
+end:
+ if (err) {
+ qmp_return_error(qmp_return_new(session, req), err);
+ }
QDECREF(args);
-
- return ret;
}
/*
@@ -230,18 +233,3 @@ void qmp_session_destroy(QmpSession *session)
session->return_cb = NULL;
json_message_parser_destroy(&session->parser);
}
-
-void qmp_dispatch(QmpSession *session, QDict *req)
-{
- QmpReturn *qret = qmp_return_new(session, req);
- Error *err = NULL;
- QObject *ret;
-
- ret = do_qmp_dispatch(session->cmds, req, &err);
- if (err) {
- assert(!ret);
- qmp_return_error(qret, err);
- } else if (ret) {
- qmp_return(qret, ret);
- }
-}
--
2.17.0.rc1.1.g4c4f2b46a3
- [Qemu-devel] [PATCH v3 15/38] qmp: pass and return a QDict to qmp_dispatch(), (continued)
- [Qemu-devel] [PATCH v3 15/38] qmp: pass and return a QDict to qmp_dispatch(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 17/38] qmp: constify qmp_is_oob(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 16/38] qmp: move 'id' copy to qmp_dispatch(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 18/38] qmp: add QmpSession, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 20/38] QmpSession: add json parser and use it in qga, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 19/38] QmpSession: add a return_cb, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 21/38] QmpSession: add a dispatch callback, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 22/38] monitor: use QmpSession parsing and common dispatch code, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 24/38] qmp: remove qmp_build_error_object(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 23/38] QmpSession: introduce QmpReturn, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 26/38] qmp: fold do_qmp_dispatch() in qmp_dispatch(),
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 27/38] QmpSession: keep a queue of pending commands, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 25/38] qmp: remove need for qobject_from_jsonf(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 28/38] QmpSession: return orderly, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 30/38] scripts: learn 'async' qapi commands, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 29/38] qmp: introduce asynchronous command type, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 31/38] qmp: add qmp_return_is_cancelled(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 33/38] console: graphic_hw_update return true if async, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 34/38] console: add graphic_hw_update_done(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 35/38] console: make screendump asynchronous, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 36/38] monitor: start making qmp_human_monitor_command() asynchronous, Marc-André Lureau, 2018/03/26