qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: Blue Swirl <blauwirbel@gmail.com>,
	Dong Xu Wang <wdongxu@vnet.linux.ibm.com>,
	stefanha@redhat.com, Markus Armbruster <armbru@redhat.com>,
	kwolf@redhat.com
Subject: Re: [Qemu-devel] [PATCH V11 2/4] Create four opts list related functions
Date: Fri, 01 Feb 2013 15:55:45 +0800	[thread overview]
Message-ID: <510B7501.6090601@linux.vnet.ibm.com> (raw)
In-Reply-To: <CAAu8pHvVnRSgiHnErmjyB33OfqdTU-LidVxt9FmBgd+_KKag8g@mail.gmail.com>

于 2013-1-26 2:13, Blue Swirl 写道:
> On Thu, Jan 24, 2013 at 6:59 PM, Markus Armbruster <armbru@redhat.com> wrote:
>> Dong Xu Wang <wdongxu@vnet.linux.ibm.com> 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 <wdongxu@vnet.linux.ibm.com>
>>> ---
>>> 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().
>>
>>>   #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.
>>
>>> +
>>> +    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.
>>
>> Please wrap your lines a bit earlier.  Column 70 is a good limit.
>>
>>> +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?
>>
>>> +
>>> +    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.
>>
>>> +    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.
>>
>>> +    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.
>>
>>> +       }
>>> +        i++;
>>
>> Indentation's off.
>>
>>> +    }
>>> +    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.
>>
>>> +    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.
>>
>>> +
>>> +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");
>
> It's a GNU extension with very little chance of becoming standard. I
> don't think it should be used.
>
> In this case, if you want to avoid typing (and readers reading,
> possibly wondering if they are identical in all cases) list->desc[i]
> several times, introduce a pointer variable as a shortcut.
>
>>
>>> +        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.
>>
>
>

Hi, I am working with V12, but did not test completely, I will take 
Chinese Spring Festival vocation next 2 weeks, I will continue once I am 
back. :)

           reply	other threads:[~2013-02-01  7:56 UTC|newest]

Thread overview: expand[flat|nested]  mbox.gz  Atom feed
 [parent not found: <CAAu8pHvVnRSgiHnErmjyB33OfqdTU-LidVxt9FmBgd+_KKag8g@mail.gmail.com>]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=510B7501.6090601@linux.vnet.ibm.com \
    --to=wdongxu@linux.vnet.ibm.com \
    --cc=armbru@redhat.com \
    --cc=blauwirbel@gmail.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=wdongxu@vnet.linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).