qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V11 2/4] Create four opts list related functions


From: Dong Xu Wang
Subject: Re: [Qemu-devel] [PATCH V11 2/4] Create four opts list related functions
Date: Mon, 28 Jan 2013 15:54:57 +0800
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130107 Thunderbird/17.0.2

于 2013-1-25 2:59, Markus Armbruster 写道:
> Dong Xu Wang <address@hidden> writes:
> 
>> This patch will create 4 functions, count_opts_list, append_opts_list,
>> free_opts_list and print_opts_list, they will used in following commits.
>>
>> Signed-off-by: Dong Xu Wang <address@hidden>
>> ---
>> v6->v7):
>> 1) Fix typo.
>>
>> v5->v6):
>> 1) allocate enough space in append_opts_list function.
>>
>>   include/qemu/option.h |  4 +++
>>   util/qemu-option.c    | 90 
>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 94 insertions(+)
>>
>> diff --git a/include/qemu/option.h b/include/qemu/option.h
>> index 394170a..f784c2e 100644
>> --- a/include/qemu/option.h
>> +++ b/include/qemu/option.h
>> @@ -156,4 +156,8 @@ int qemu_opts_print(QemuOpts *opts, void *dummy);
>>   int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, void 
>> *opaque,
>>                         int abort_on_failure);
>>   
>> +QemuOptsList *append_opts_list(QemuOptsList *dest,
>> +                               QemuOptsList *list);
>> +void free_opts_list(QemuOptsList *list);
>> +void print_opts_list(QemuOptsList *list);
> 
> Please stick to the existing naming convention: qemu_opts_append(),
> qemu_opts_free(), qemu_opts_print().
> 
Okay, will fix.

>>   #endif
>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>> index 1aed418..f4bbbf8 100644
>> --- a/util/qemu-option.c
>> +++ b/util/qemu-option.c
>> @@ -1152,3 +1152,93 @@ int qemu_opts_foreach(QemuOptsList *list, 
>> qemu_opts_loopfunc func, void *opaque,
>>       loc_pop(&loc);
>>       return rc;
>>   }
>> +
>> +static size_t count_opts_list(QemuOptsList *list)
>> +{
>> +    size_t i = 0;
>> +
>> +    while (list && list->desc[i].name) {
>> +        i++;
>> +    }
> 
> Please don't invent your own way to interate over list->desc[]!  Imitate
> the existing code.
> 
>      for (i = 0; list && list->desc[i].name; i++) ;
> 
> Same several times below.
> 
Okay, will fix.
>> +
>> +    return i;
>> +}
>> +
>> +/* Create a new QemuOptsList and make its desc to the merge of first and 
>> second.
>> + * It will allocate space for one new QemuOptsList plus enough space for
>> + * QemuOptDesc in first and second QemuOptsList. First argument's 
>> QemuOptDesc
>> + * members take precedence over second's.
>> + */
> 
> Unlike most functions dealing with QemuOptsLists, this one can take null
> arguments.  Worth mentioning.
> 
Okay.

> Please wrap your lines a bit earlier.  Column 70 is a good limit.
> 
Okay, will use 70 column next version.
>> +QemuOptsList *append_opts_list(QemuOptsList *first,
>> +                               QemuOptsList *second)
>> +{
>> +    size_t num_first_options, num_second_options;
>> +    QemuOptsList *dest = NULL;
>> +    int i = 0;
>> +    int index = 0;
>> +
>> +    num_first_options = count_opts_list(first);
>> +    num_second_options = count_opts_list(second);
>> +    if (num_first_options + num_second_options == 0) {
>> +        return NULL;
>> +    }
> 
> Why do you need this extra case?  Shouldn't the code below just work?
> 
Yes, without this the code below can work.
>> +
>> +    dest = g_malloc0(sizeof(QemuOptsList)
>> +        + (num_first_options + num_second_options + 1) * 
>> sizeof(QemuOptDesc));
>> +
>> +    dest->name = "append_opts_list";
>> +    dest->implied_opt_name = NULL;
> 
> Not copied from an argument.  Tolerable, because all you lose is the
> convenience to omit name= in one place, but worth mentioning in the
> function comment.
> 
Okay.

>> +    dest->merge_lists = false;
> 
> Not copied from an argument.  I'm afraid the result will make no sense
> if either argument has it set.  Consider asserting they don't, and
> documenting the requirement in the function comment.
Okay.
> 
>> +    QTAILQ_INIT(&dest->head);
>> +    while (first && (first->desc[i].name)) {
>> +        if (!find_desc_by_name(dest->desc, first->desc[i].name)) {
>> +            dest->desc[index].name = g_strdup(first->desc[i].name);
>> +            dest->desc[index].help = g_strdup(first->desc[i].help);
>> +            dest->desc[index].type = first->desc[i].type;
>> +            dest->desc[index].def_value_str =
>> +                g_strdup(first->desc[i].def_value_str);
>> +            ++index;
> 
> index++ please, for consistency with the similar increment two lines
> below.
> 
Okay.
>> +       }
>> +        i++;
> 
> Indentation's off.
> 
Yes, will fix.

>> +    }
>> +    i = 0;
>> +    while (second && (second->desc[i].name)) {
>> +        if (!find_desc_by_name(dest->desc, second->desc[i].name)) {
>> +            dest->desc[index].name = g_strdup(first->desc[i].name);
>> +            dest->desc[index].help = g_strdup(first->desc[i].help);
>> +            dest->desc[index].type = second->desc[i].type;
>> +            dest->desc[index].def_value_str =
>> +                g_strdup(second->desc[i].def_value_str);
>> +            ++index;
>> +        }
>> +        i++;
>> +    }
> 
> We've seen this loop before.  Please avoid the code duplication, as I
> asked you before.
> 
Okay.
>> +    dest->desc[index].name = NULL;
>> +    return dest;
>> +}
>> +
>> +void free_opts_list(QemuOptsList *list)
>> +{
>> +    int i = 0;
>> +
>> +    while (list && list->desc[i].name) {
>> +        g_free((char *)list->desc[i].name);
>> +        g_free((char *)list->desc[i].help);
>> +        g_free((char *)list->desc[i].def_value_str);
>> +        i++;
>> +    }
>> +
>> +    g_free(list);
>> +}
> 
> Unlike most functions dealing with QemuOptsLists, this one can take null
> arguments.  Makes sense, but it's worth mentioning in a function
> comment.
> 
Okay.
>> +
>> +void print_opts_list(QemuOptsList *list)
>> +{
>> +    int i = 0;
>> +    printf("Supported options:\n");
>> +    while (list && list->desc[i].name) {
> 
> 
>> +        printf("%-16s %s\n", list->desc[i].name,
>> +            list->desc[i].help ?
>> +                list->desc[i].help : "No description available");
> 
> Clearer:
> 
>                    list->desc[i].help ?: "No description available");
> 
>> +        i++;
>> +    }
>> +}
> 
> Unlike most functions dealing with QemuOptsLists, this one can take null
> arguments.  Later patches feed it the result of append_opts_list(),
> which can be null, but that makes little sense to me.
> 
> 





reply via email to

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