qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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



  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).