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);
>>> + }
>
next prev parent 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).