[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 5/9] QemuOpts: Convert qemu_opts_foreach() to Er
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH 5/9] QemuOpts: Convert qemu_opts_foreach() to Error |
Date: |
Tue, 02 Jun 2015 13:33:42 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
Eric Blake <address@hidden> writes:
> On 05/28/2015 06:21 AM, Markus Armbruster wrote:
>> Retain the function value for now, to permit selective conversion of
>> its callers.
>>
>> Signed-off-by: Markus Armbruster <address@hidden>
>> ---
>> block/blkdebug.c | 6 ++--
>> hw/core/qdev-properties-system.c | 5 +--
>> include/qemu/option.h | 4 +--
>> include/ui/console.h | 2 +-
>> net/net.c | 9 ++---
>> net/vhost-user.c | 4 +--
>> numa.c | 5 +--
>> tpm.c | 6 ++--
>> ui/vnc.c | 2 +-
>> util/qemu-config.c | 4 +--
>> util/qemu-option.c | 7 ++--
>> vl.c | 72
>> ++++++++++++++++++++++++----------------
>> 12 files changed, 72 insertions(+), 54 deletions(-)
>>
>
>> diff --git a/block/blkdebug.c b/block/blkdebug.c
>> index 58f5105..50ef1fc 100644
>> --- a/block/blkdebug.c
>> +++ b/block/blkdebug.c
>> @@ -219,7 +219,7 @@ struct add_rule_data {
>> Error **errp;
>> };
>>
>> -static int add_rule(QemuOpts *opts, void *opaque)
>> +static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
>
>> +++ b/include/qemu/option.h
>> @@ -125,9 +125,9 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const
>> QDict *qdict,
>> QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
>> void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
>>
>> -typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque);
>> +typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error
>> **errp);
>
> Might be nice to justify in the commit message why swapping the
> arguments of the callback made sense. But doesn't affect code
> correctness, so:
>
> Reviewed-by: Eric Blake <address@hidden>
Not sure what to write. Not even quite sure why I like it better this
way, only that I do. Could be because it puts the object we're
modifying (when we modify any of the argument objects) on the left.
>> +++ b/util/qemu-option.c
>> @@ -1047,13 +1047,14 @@ void qemu_opts_validate(QemuOpts *opts, const
>> QemuOptDesc *desc, Error **errp)
>> }
>>
>> /**
>> - * For each member of @list, call @func(member, @opaque).
>> + * For each member of @list, call @func(@opaque, member, @errp).
>> * Call it with the current location temporarily set to the member's.
>> + * @func() may store an Error through @errp, but must return non-zero then.
>> * When @func() returns non-zero, break the loop and return that value.
>> * Return zero when the loop completes.
>> */
>> int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
>> - void *opaque)
>> + void *opaque, Error **errp)
>> {
>> Location loc;
>> QemuOpts *opts;
>> @@ -1062,7 +1063,7 @@ int qemu_opts_foreach(QemuOptsList *list,
>> qemu_opts_loopfunc func,
>> loc_push_none(&loc);
>> QTAILQ_FOREACH(opts, &list->head, next) {
>> loc_restore(&opts->loc);
>> - rc = func(opts, opaque);
>> + rc = func(opaque, opts, errp);
>> if (rc) {
>> return rc;
>> }
>
> Do you want to enforce that if errp is set, that rc is non-zero, to
> match your contract? Perhaps by assert(!*errp) at this point? But if
> the return value goes away later in the series in favor of only using
> errp, it may be a moot question.
assert(!*errp) is incorrect, because callers may pass a null errp to
ignore errors. Could do
if (rc) {
return rc;
}
assert(!errp || !*errp);
Catches misbehaving func() only when caller passes non-null errp. To
catcht it always, we'd need to use Error *err here, and
error_propagate(errp, err). I doubt it's worth the trouble.
What do you think?
- Re: [Qemu-devel] [PATCH 5/9] QemuOpts: Convert qemu_opts_foreach() to Error,
Markus Armbruster <=