qemu-devel
[Top][All Lists]
Advanced

[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?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]