From: Kevin Wolf <kwolf@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: jsnow@redhat.com, qemu-devel@nongnu.org
Subject: Re: [PATCH 2/6] qapi: Remember alias definitions in qobject-input-visitor
Date: Thu, 11 Feb 2021 17:27:40 +0100 [thread overview]
Message-ID: <20210211162740.GA5327@merkur.fritz.box> (raw)
In-Reply-To: <87sg65pff8.fsf@dusky.pond.sub.org>
Am 09.02.2021 um 13:57 hat Markus Armbruster geschrieben:
> Let me look at the actual code now Kevin reduced my confusion about the
> interface and the data structures.
>
> Kevin Wolf <kwolf@redhat.com> writes:
>
> > This makes qobject-input-visitor remember the currently valid aliases in
> > each StackObject. It doesn't actually allow using the aliases yet.
> >
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> > qapi/qobject-input-visitor.c | 115 +++++++++++++++++++++++++++++++++++
> > 1 file changed, 115 insertions(+)
> > @@ -203,6 +229,38 @@ static const char *qobject_input_get_keyval(QObjectInputVisitor *qiv,
> > return qstring_get_str(qstr);
> > }
> >
> > +/*
> > + * Propagates aliases from the parent StackObject @src to its direct
> > + * child StackObject @dst, which is representing the child struct @name.
>
> @name must equal dst->name, I think. Drop the parameter?
>
> > + *
> > + * Every alias whose source path begins with @name and which still
> > + * applies in @dst (i.e. it is either a wildcard alias or has at least
> > + * one more source path element) is propagated to @dst with the first
>
> I'm not sure I get the parenthesis. Perhaps the code will enlighten me.
>
> > + * element (i.e. @name) removed from the source path.
> > + */
> > +static void propagate_aliases(StackObject *dst, StackObject *src,
> > + const char *name)
> > +{
> > + InputVisitorAlias *a;
> > +
> > + QSLIST_FOREACH(a, &src->aliases, next) {
> > + if (!a->src[0] || strcmp(a->src[0], name)) {
> > + continue;
> > + }
>
> We only look at the aliases that apply to @dst or below. They do only
> when ->src[0] equals dst->name. Makes sense.
>
> > + if (a->src[1] || !a->alias) {
>
> If a->src[1], the alias applies below @dst, not to @dst. To get it to
> the place where it applies, we first need to propagate to @dst.
>
> Else, the alias applies to @dst. If !a->alias, we're looking at a
> wildcard alias, i.e. all members of the object described by @dst are
> aliased. Why do we need to propagate only wildcard aliases to @dst?
If it's not a wildcard alias and a->src[1] == NULL, then the alias
referred to @dst's name inside @src. It's not valid inside @dst any
more.
This is what the parenthesis above tried to tell you.
I've added another comment in the code to explain this case more
explicitly.
> > + InputVisitorAlias *alias = g_new(InputVisitorAlias, 1);
> > +
> > + *alias = (InputVisitorAlias) {
> > + .alias = a->alias,
> > + .alias_so = a->alias_so,
> > + .src = &a->src[1],
> > + };
> > +
> > + QSLIST_INSERT_HEAD(&dst->aliases, alias, next);
> > + }
> > + }
> > +}
> > +
> > static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
> > const char *name,
> > QObject *obj, void *qapi)
> > @@ -226,6 +284,9 @@ static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
> > g_hash_table_insert(h, (void *)qdict_entry_key(entry), NULL);
> > }
> > tos->h = h;
> > + if (!QSLIST_EMPTY(&qiv->stack)) {
> > + propagate_aliases(tos, QSLIST_FIRST(&qiv->stack), name);
> > + }
>
> What if QSLIST_EMPTY(&qiv->stack) and tos->aliases contains aliases that
> apply deeper?
tos->aliases doesn't contain any aliases, we only created it a few lines
above.
We would normally propagate aliases from the parent StackObject (which
is QSLIST_FIRST(&qiv->stack)), but if there is no parent StackObject,
then there can't be aliases to be inherited from the parent either.
Kevin
next prev parent reply other threads:[~2021-02-11 16:31 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-12 17:28 [PATCH 0/6] qapi: Add support for aliases Kevin Wolf
2020-11-12 17:28 ` [PATCH 1/6] qapi: Add interfaces for alias support to Visitor Kevin Wolf
2021-01-26 15:59 ` Markus Armbruster
2021-01-27 12:51 ` Markus Armbruster
2021-01-27 20:31 ` Kevin Wolf
2021-02-02 13:51 ` Markus Armbruster
2020-11-12 17:28 ` [PATCH 2/6] qapi: Remember alias definitions in qobject-input-visitor Kevin Wolf
2021-01-27 13:06 ` Markus Armbruster
2021-01-27 20:59 ` Kevin Wolf
2021-02-09 12:55 ` Markus Armbruster
2021-02-09 12:57 ` Markus Armbruster
2021-02-11 16:27 ` Kevin Wolf [this message]
2020-11-12 17:28 ` [PATCH 3/6] qapi: Simplify full_name_nth() " Kevin Wolf
2021-01-27 13:56 ` Markus Armbruster
2021-01-27 21:42 ` Kevin Wolf
2021-01-28 7:43 ` Markus Armbruster
2021-01-28 10:57 ` Kevin Wolf
2020-11-12 17:28 ` [PATCH 4/6] qapi: Apply aliases " Kevin Wolf
2021-02-09 16:02 ` Markus Armbruster
2020-11-12 17:28 ` [PATCH 5/6] qapi: Add support for aliases Kevin Wolf
2020-11-12 18:34 ` Eric Blake
2020-11-13 9:46 ` Kevin Wolf
2020-11-20 14:41 ` Peter Krempa
2020-11-20 15:06 ` Daniel P. Berrangé
2021-02-10 9:17 ` Markus Armbruster
2021-02-10 12:26 ` Kevin Wolf
2021-02-10 13:47 ` Markus Armbruster
2021-02-10 14:29 ` Markus Armbruster
2020-11-12 17:28 ` [PATCH 6/6] tests/qapi-schema: Test cases " Kevin Wolf
2021-02-10 13:09 ` Markus Armbruster
2020-12-04 9:46 ` [PATCH 0/6] qapi: Add support " Kevin Wolf
2021-02-10 14:38 ` Markus Armbruster
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=20210211162740.GA5327@merkur.fritz.box \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).