Commit 546aa566 authored by Peter Xu's avatar Peter Xu Committed by Eric Blake
Browse files

monitor: introduce monitor_qmp_respond()



A tiny refactoring, preparing to split the QMP dispatcher away.

Reviewed-by: default avatarFam Zheng <famz@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
Message-Id: <20180309090006.10018-12-peterx@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
[eblake: rebase to qobject_to() usage]
Signed-off-by: default avatarEric Blake <eblake@redhat.com>
parent 02130314
Loading
Loading
Loading
Loading
+33 −17
Original line number Diff line number Diff line
@@ -3822,6 +3822,38 @@ static int monitor_can_read(void *opaque)
    return (mon->suspend_cnt == 0) ? 1 : 0;
}

/*
 * 1. This function takes ownership of rsp, err, and id.
 * 2. rsp, err, and id may be NULL.
 * 3. If err != NULL then rsp must be NULL.
 */
static void monitor_qmp_respond(Monitor *mon, QObject *rsp,
                                Error *err, QObject *id)
{
    QDict *qdict = NULL;

    if (err) {
        assert(!rsp);
        qdict = qdict_new();
        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
        error_free(err);
        rsp = QOBJECT(qdict);
    }

    if (rsp) {
        if (id) {
            /* This is for the qdict below. */
            qobject_incref(id);
            qdict_put_obj(qobject_to(QDict, rsp), "id", id);
        }

        monitor_json_emitter(mon, rsp);
    }

    qobject_decref(id);
    qobject_decref(rsp);
}

static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
{
    QObject *req, *rsp = NULL, *id = NULL;
@@ -3873,24 +3905,8 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
    }

err_out:
    if (err) {
        qdict = qdict_new();
        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
        error_free(err);
        rsp = QOBJECT(qdict);
    }
    monitor_qmp_respond(mon, rsp, err, id);

    if (rsp) {
        if (id) {
            qdict_put_obj(qobject_to(QDict, rsp), "id", id);
            id = NULL;
        }

        monitor_json_emitter(mon, rsp);
    }

    qobject_decref(id);
    qobject_decref(rsp);
    qobject_decref(req);
}