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

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?

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;

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

  reply	other threads:[~2014-02-28 17:16 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 [this message]
2014-02-28 18:27     ` Igor Mammedov
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=5310C44B.1050302@suse.de \
    --to=afaerber@suse.de \
    --cc=famz@redhat.com \
    --cc=imammedo@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.