qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v5 1/7] object: add object_get_canonical_basename()
Date: Fri, 28 Feb 2014 19:27:55 +0100	[thread overview]
Message-ID: <20140228192755.1ced51e9@nial.usersys.redhat.com> (raw)
In-Reply-To: <5310C44B.1050302@suse.de>

On Fri, 28 Feb 2014 18:15:55 +0100
Andreas Färber <afaerber@suse.de> wrote:

> Am 28.02.2014 16:18, schrieb Stefan Hajnoczi:
> > It is often useful to find an object's child property name.  Also use
> > this new function to simplify the implementation of
> > object_get_canonical_path().
> > 
> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> > ---
> >  include/qom/object.h |  8 ++++++++
> >  qom/object.c         | 53 ++++++++++++++++++++++++++++++----------------------
> >  2 files changed, 39 insertions(+), 22 deletions(-)
> > 
> > diff --git a/include/qom/object.h b/include/qom/object.h
> > index 9c7c361..8c6db7c 100644
> > --- a/include/qom/object.h
> > +++ b/include/qom/object.h
> > @@ -974,6 +974,14 @@ const char *object_property_get_type(Object *obj, const char *name,
> >  Object *object_get_root(void);
> >  
> >  /**
> > + * object_get_canonical_basename:
> > + *
> > + * Returns: The final component in the object's canonical path.  The canonical
> > + * path is the path within the composition tree starting from the root.
> > + */
> > +gchar *object_get_canonical_basename(Object *obj);
> 
> I find this name very confusing. There is no such thing as a canonical
> base name, ..._canonical_path_component would make its purpose much more
> obvious.
> 
> An underlying issue here probably is that Anthony didn't want a public
> API to access the Object::parent. But the only other user is
> iothread_get_id() in 4/7, so we might just loop over its known path
> prefix there to discover the right child<>. On the other hand, couldn't
> device IDs in /machine/peripheral benefit from this today, too?
there is another user for this, I need similar routine for memdev object.

alternatively it seems that Object that has parent is always name so we could
add 'name' property to Object and replace with it device's 'id'

> 
> In any way I would've liked to get CC'ed on this QOM API proposal please.
> 
> > +
> > +/**
> >   * object_get_canonical_path:
> >   *
> >   * Returns: The canonical path for a object.  This is the path within the
> > diff --git a/qom/object.c b/qom/object.c
> > index 660859c..0cdc319 100644
> > --- a/qom/object.c
> > +++ b/qom/object.c
> > @@ -1102,39 +1102,48 @@ void object_property_add_link(Object *obj, const char *name,
> >      g_free(full_type);
> >  }
> >  
> > +gchar *object_get_canonical_basename(Object *obj)
> > +{
> > +    ObjectProperty *prop = NULL;
> > +
> > +    g_assert(obj->parent != NULL);
> 
> It might make sense to assert obj first? Accessing ->parent would not be
> much different from ->parent->properties otherwise. But applies to the
> original code as well and the movement looks OK.
> 
> Regards,
> Andreas
> 
> > +
> > +    QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
> > +        if (!object_property_is_child(prop)) {
> > +            continue;
> > +        }
> > +
> > +        if (prop->opaque == obj) {
> > +            return g_strdup(prop->name);
> > +        }
> > +    }
> > +
> > +    /* obj had a parent but was not a child, should never happen */
> > +    g_assert_not_reached();
> > +    return NULL;
> > +}
> > +
> >  gchar *object_get_canonical_path(Object *obj)
> >  {
> >      Object *root = object_get_root();
> > -    char *newpath = NULL, *path = NULL;
> > +    char *newpath, *path = NULL;
> >  
> >      while (obj != root) {
> > -        ObjectProperty *prop = NULL;
> > -
> > -        g_assert(obj->parent != NULL);
> > -
> > -        QTAILQ_FOREACH(prop, &obj->parent->properties, node) {
> > -            if (!object_property_is_child(prop)) {
> > -                continue;
> > -            }
> > +        char *component = object_get_canonical_basename(obj);
> >  
> > -            if (prop->opaque == obj) {
> > -                if (path) {
> > -                    newpath = g_strdup_printf("%s/%s", prop->name, path);
> > -                    g_free(path);
> > -                    path = newpath;
> > -                } else {
> > -                    path = g_strdup(prop->name);
> > -                }
> > -                break;
> > -            }
> > +        if (path) {
> > +            newpath = g_strdup_printf("%s/%s", component, path);
> > +            g_free(component);
> > +            g_free(path);
> > +            path = newpath;
> > +        } else {
> > +            path = component;
> >          }
> >  
> > -        g_assert(prop != NULL);
> > -
> >          obj = obj->parent;
> >      }
> >  
> > -    newpath = g_strdup_printf("/%s", path);
> > +    newpath = g_strdup_printf("/%s", path ? path : "");
> >      g_free(path);
> >  
> >      return newpath;
> 

  reply	other threads:[~2014-02-28 18:28 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-28 15:18 [Qemu-devel] [PATCH v5 0/7] dataplane: switch to N:M devices-per-thread model Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 1/7] object: add object_get_canonical_basename() Stefan Hajnoczi
2014-02-28 17:15   ` Andreas Färber
2014-02-28 18:27     ` Igor Mammedov [this message]
2014-03-03  9:52     ` Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 2/7] rfifolock: add recursive FIFO lock Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 3/7] aio: add aio_context_acquire() and aio_context_release() Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 4/7] iothread: add I/O thread object Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 5/7] qdev: make get_pointer() handle temporary strings Stefan Hajnoczi
2014-02-28 16:49   ` Andreas Färber
2014-03-03  9:41     ` Stefan Hajnoczi
2014-03-03 12:43       ` Igor Mammedov
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 6/7] iothread: add "iothread" qdev property type Stefan Hajnoczi
2014-02-28 15:18 ` [Qemu-devel] [PATCH v5 7/7] dataplane: replace internal thread with IOThread Stefan Hajnoczi

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=20140228192755.1ced51e9@nial.usersys.redhat.com \
    --to=imammedo@redhat.com \
    --cc=afaerber@suse.de \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --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).