mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
qmp: Wean off qerror_report()
The traditional QMP command handler interface
int qmp_FOO(Monitor *mon, const QDict *params, QObject **ret_data);
doesn't provide for returning an Error object. Instead, the handler
is expected to stash it in the monitor with qerror_report().
When we rebased QMP on top of QAPI, we didn't change this interface.
Instead, commit 776574d
introduced "middle mode" as a temporary aid
for converting existing QMP commands to QAPI one by one. More than
three years later, we're still using it.
Middle mode has two effects:
* Instead of the native input marshallers
static void qmp_marshal_input_FOO(QDict *, QObject **, Error **)
it generates input marshallers conforming to the traditional QMP
command handler interface.
* It suppresses generation of code to register them with
qmp_register_command()
This permits giving them internal linkage.
As long as we need qmp-commands.hx, we can't use the registry behind
qmp_register_command(), so the latter has to stay for now.
The former has to go to get rid of qerror_report(). Changing all QMP
commands to fit the QAPI mold in one go was impractical back when we
started, but by now there are just a few stragglers left:
do_qmp_capabilities(), qmp_qom_set(), qmp_qom_get(), qmp_object_add(),
qmp_netdev_add(), do_device_add().
Switch middle mode to generate native input marshallers, and adapt the
stragglers. Simplifies both the monitor code and the stragglers.
Rename do_qmp_capabilities() to qmp_capabilities(), and
do_device_add() to qmp_device_add, because that's how QMP command
handlers are named today.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
8b53a19675
commit
485febc6d1
11 changed files with 50 additions and 126 deletions
|
@ -195,12 +195,10 @@ out:
|
|||
return ret
|
||||
|
||||
def gen_marshal_input_decl(name, args, ret_type, middle_mode):
|
||||
if middle_mode:
|
||||
return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_name(name)
|
||||
else:
|
||||
return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name)
|
||||
|
||||
|
||||
ret = 'void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name)
|
||||
if not middle_mode:
|
||||
ret = "static " + ret
|
||||
return ret
|
||||
|
||||
def gen_marshal_input(name, args, ret_type, middle_mode):
|
||||
hdr = gen_marshal_input_decl(name, args, ret_type, middle_mode)
|
||||
|
@ -212,11 +210,6 @@ def gen_marshal_input(name, args, ret_type, middle_mode):
|
|||
''',
|
||||
header=hdr)
|
||||
|
||||
if middle_mode:
|
||||
ret += mcgen('''
|
||||
QDict *args = (QDict *)qdict;
|
||||
''')
|
||||
|
||||
if ret_type:
|
||||
if is_c_ptr(ret_type):
|
||||
retval = " %s retval = NULL;" % c_type(ret_type)
|
||||
|
@ -252,36 +245,14 @@ def gen_marshal_input(name, args, ret_type, middle_mode):
|
|||
ret += mcgen('''
|
||||
|
||||
out:
|
||||
''')
|
||||
if not middle_mode:
|
||||
ret += mcgen('''
|
||||
error_propagate(errp, local_err);
|
||||
''')
|
||||
ret += mcgen('''
|
||||
error_propagate(errp, local_err);
|
||||
%(visitor_input_block_cleanup)s
|
||||
}
|
||||
''',
|
||||
visitor_input_block_cleanup=gen_visitor_input_block(args,
|
||||
dealloc=True))
|
||||
|
||||
if middle_mode:
|
||||
ret += mcgen('''
|
||||
|
||||
if (local_err) {
|
||||
qerror_report_err(local_err);
|
||||
error_free(local_err);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
''')
|
||||
else:
|
||||
ret += mcgen('''
|
||||
return;
|
||||
''')
|
||||
|
||||
ret += mcgen('''
|
||||
}
|
||||
''')
|
||||
|
||||
return ret
|
||||
|
||||
def gen_registry(commands):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue