qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v6 04/22] qapi: extend qdict_flatten() for QLists
Date: Fri, 20 Dec 2013 18:23:26 +0100	[thread overview]
Message-ID: <52B47D0E.50906@redhat.com> (raw)
In-Reply-To: <52B47C1F.3080006@redhat.com>

On 20.12.2013 18:19, Max Reitz wrote:
> On 20.12.2013 10:46, Stefan Hajnoczi wrote:
>> On Thu, Dec 19, 2013 at 08:47:05PM +0100, Max Reitz wrote:
>>> Reversing qdict_array_split(), qdict_flatten() should flatten QLists as
>>> well by interpreting them as QDicts where every entry's key is its
>>> index.
>>>
>>> This allows bringing QDicts with QLists from QMP commands to the same
>>> form as they would be given as command-line options, thereby allowing
>>> them to be parsed the same way.
>>>
>>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>>> ---
>>>   qobject/qdict.c | 57 
>>> +++++++++++++++++++++++++++++++++++++++++++++++++++------
>>>   1 file changed, 51 insertions(+), 6 deletions(-)
>> Please add a tests/check-qdict.c test case.
>>
>>> diff --git a/qobject/qdict.c b/qobject/qdict.c
>>> index fca1902..7b6b08a 100644
>>> --- a/qobject/qdict.c
>>> +++ b/qobject/qdict.c
>>> @@ -477,7 +477,46 @@ static void qdict_destroy_obj(QObject *obj)
>>>       g_free(qdict);
>>>   }
>>>   -static void qdict_do_flatten(QDict *qdict, QDict *target, const 
>>> char *prefix)
>>> +static void qdict_flatten_qdict(QDict *qdict, QDict *target,
>>> +                                const char *prefix);
>>> +
>>> +static void qdict_flatten_qlist(QList *qlist, QDict *target, const 
>>> char *prefix)
>>> +{
>>> +    QObject *value;
>>> +    const QListEntry *entry;
>>> +    char *new_key;
>>> +    int i;
>>> +
>>> +    /* This function is never called with prefix == NULL, i.e., it 
>>> is always
>>> +     * called from within qdict_flatten_q(list|dict)(). Therefore, 
>>> it does not
>>> +     * need to remove list entries during the iteration (the whole 
>>> list will be
>>> +     * deleted eventually anyway from qdict_flatten_qdict()). */
>>> +    assert(prefix);
>>> +
>>> +    entry = qlist_first(qlist);
>>> +
>>> +    for (i = 0; entry; entry = qlist_next(entry), i++) {
>>> +        value = qlist_entry_obj(entry);
>>> +
>>> +        qobject_incref(value);
>>> +        new_key = g_strdup_printf("%s.%i", prefix, i);
>>> +        qdict_put_obj(target, new_key, value);
>> It seems this operation is clobbered by what follows and should be
>> deleted.  Is the incref also superfluous or...
>>
>>> +
>>> +        if (qobject_type(value) == QTYPE_QDICT) {
>>> +            qdict_flatten_qdict(qobject_to_qdict(value), target, 
>>> new_key);
>>> +        } else if (qobject_type(value) == QTYPE_QLIST) {
>>> +            qdict_flatten_qlist(qobject_to_qlist(value), target, 
>>> new_key);
>>> +        } else {
>>> +            /* All other types are moved to the target unchanged. */
>>> +            qobject_incref(value);
>> ...should this one be deleted?
>
> Oh great, I've been fixing working code, then. *g*
>
> I added the else branch in v5, I guess, it was correct not to have it 
> (however, the condition in the else if was missing in v4). I'll drop 
> it again, thanks.

On second thought, that would be even more wrong. I'll leave the else 
branch and drop the qobject_incref() and qdict_put_obj() above the 
condition.

Max

>
>>> +            qdict_put_obj(target, new_key, value);
>>> +        }
>>> +
>>> +        g_free(new_key);
>>> +    }
>

  reply	other threads:[~2013-12-20 17:22 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-19 19:47 [Qemu-devel] [PATCH v6 00/22] blkdebug/blkverify: Allow QMP configuration Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 01/22] blkdebug: Use errp for read_config() Max Reitz
2013-12-19 20:21   ` Eric Blake
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 02/22] blkdebug: Don't require sophisticated filename Max Reitz
2013-12-19 20:56   ` Eric Blake
2013-12-19 20:58     ` Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 03/22] qdict: Add qdict_array_split() Max Reitz
2013-12-19 21:20   ` Eric Blake
2013-12-20  9:38   ` Stefan Hajnoczi
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 04/22] qapi: extend qdict_flatten() for QLists Max Reitz
2013-12-19 21:49   ` Eric Blake
2013-12-20  9:46   ` Stefan Hajnoczi
2013-12-20 17:19     ` Max Reitz
2013-12-20 17:23       ` Max Reitz [this message]
2014-01-02  4:01         ` Stefan Hajnoczi
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 05/22] qemu-option: Add qemu_config_parse_qdict() Max Reitz
2013-12-19 22:15   ` Eric Blake
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 06/22] blkdebug: Always call read_config() Max Reitz
2013-12-19 23:06   ` Eric Blake
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 07/22] blkdebug: Use command-line in read_config() Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 08/22] block: Allow reference for bdrv_file_open() Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 09/22] block: Pass reference to bdrv_file_open() Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 10/22] block: Allow block devices without files Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 11/22] block: Add bdrv_open_image() Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 12/22] block: Use bdrv_open_image() in bdrv_open() Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 13/22] block: Allow recursive "file"s Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 14/22] blockdev: Move "file" to legacy_opts Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 15/22] blkdebug: Allow command-line file configuration Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 16/22] blkverify: Allow command-line configuration Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 17/22] blkverify: Don't require protocol filename Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 18/22] qapi: Add "errno" to the list of polluted words Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 19/22] qapi: QMP interface for blkdebug and blkverify Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 20/22] qemu-io: Make filename optional Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 21/22] iotests: Test new blkdebug/blkverify interface Max Reitz
2013-12-19 19:47 ` [Qemu-devel] [PATCH v6 22/22] iotests: Test file format nesting Max Reitz

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=52B47D0E.50906@redhat.com \
    --to=mreitz@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    --cc=stefanha@redhat.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).