Re: [Qemu-devel] [PATCH 2/9] qom: add object_property_add_unnamed_child

2013-05-08 Thread Stefan Hajnoczi
On Mon, May 06, 2013 at 01:48:34PM -0500, mdroth wrote:
 On Mon, May 06, 2013 at 09:44:13AM +0200, Paolo Bonzini wrote:
  Il 03/05/2013 18:03, Michael Roth ha scritto:
   This interface allows us to add a child property without specifying a
   name. Instead, a unique name is created and passed back after adding
   the property.
   
   Signed-off-by: Michael Roth mdr...@linux.vnet.ibm.com
   ---
include/qom/object.h |   16 
qom/object.c |   25 +
2 files changed, 41 insertions(+)
   
   diff --git a/include/qom/object.h b/include/qom/object.h
   index 86f1e2e..ca0fce8 100644
   --- a/include/qom/object.h
   +++ b/include/qom/object.h
   @@ -1041,6 +1041,22 @@ void object_property_add_child(Object *obj, const 
   char *name,
   Object *child, struct Error **errp);

/**
   + * object_property_add_unnamed_child:
   + *
   + * @obj: the object to add a property to
   + * @name: the name of the property
   + * @child: the child object
   + * @errp: if an error occurs, a pointer to an area to store the area
   + *
   + * Same as object_property_add_child, but will allocate a unique name to
   + * identify the child property.
   + *
   + * Returns: The name assigned to the child property, or NULL on failure.
   + */
   +char *object_property_add_unnamed_child(Object *obj, Object *child,
   +struct Error **errp);
   +
   +/**
 * object_property_add_link:
 * @obj: the object to add a property to
 * @name: the name of the property
   diff --git a/qom/object.c b/qom/object.c
   index c932f64..229a9a7 100644
   --- a/qom/object.c
   +++ b/qom/object.c
   @@ -926,6 +926,31 @@ static void object_finalize_child_property(Object 
   *obj, const char *name,
object_unref(child);
}

   +char *object_property_add_unnamed_child(Object *obj, Object *child, 
   Error **errp)
   +{
   +int idx = 0;
   +bool next_idx_found = false;
   +char name[64];
   +ObjectProperty *prop;
   +
   +while (!next_idx_found) {
   +sprintf(name, unnamed[%d], idx);
   +QTAILQ_FOREACH(prop, obj-properties, node) {
   +if (strcmp(name, prop-name) == 0) {
   +idx++;
   +break;
   +}
   +}
   +if (!prop) {
   +next_idx_found = true;
   +}
   +}
   +
   +object_property_add_child(obj, name, child, errp);
   +
   +return error_is_set(errp) ? NULL : g_strdup(name);
   +}
  
  This is O(n^3) for adding N children.  O(n^2) would be not-that-great
  but fine; can you take the occasion to convert the properties list to a
  hashtable?
 
 Sure, I'll look into it.

Given that we already have the child pointer, perhaps just use the
uintptr_t child memory address as a unique name.  It's guaranteed to be
unique unless you add the same child twice.

Stefan



Re: [Qemu-devel] [PATCH 2/9] qom: add object_property_add_unnamed_child

2013-05-06 Thread Paolo Bonzini
Il 03/05/2013 18:03, Michael Roth ha scritto:
 This interface allows us to add a child property without specifying a
 name. Instead, a unique name is created and passed back after adding
 the property.
 
 Signed-off-by: Michael Roth mdr...@linux.vnet.ibm.com
 ---
  include/qom/object.h |   16 
  qom/object.c |   25 +
  2 files changed, 41 insertions(+)
 
 diff --git a/include/qom/object.h b/include/qom/object.h
 index 86f1e2e..ca0fce8 100644
 --- a/include/qom/object.h
 +++ b/include/qom/object.h
 @@ -1041,6 +1041,22 @@ void object_property_add_child(Object *obj, const char 
 *name,
 Object *child, struct Error **errp);
  
  /**
 + * object_property_add_unnamed_child:
 + *
 + * @obj: the object to add a property to
 + * @name: the name of the property
 + * @child: the child object
 + * @errp: if an error occurs, a pointer to an area to store the area
 + *
 + * Same as object_property_add_child, but will allocate a unique name to
 + * identify the child property.
 + *
 + * Returns: The name assigned to the child property, or NULL on failure.
 + */
 +char *object_property_add_unnamed_child(Object *obj, Object *child,
 +struct Error **errp);
 +
 +/**
   * object_property_add_link:
   * @obj: the object to add a property to
   * @name: the name of the property
 diff --git a/qom/object.c b/qom/object.c
 index c932f64..229a9a7 100644
 --- a/qom/object.c
 +++ b/qom/object.c
 @@ -926,6 +926,31 @@ static void object_finalize_child_property(Object *obj, 
 const char *name,
  object_unref(child);
  }
  
 +char *object_property_add_unnamed_child(Object *obj, Object *child, Error 
 **errp)
 +{
 +int idx = 0;
 +bool next_idx_found = false;
 +char name[64];
 +ObjectProperty *prop;
 +
 +while (!next_idx_found) {
 +sprintf(name, unnamed[%d], idx);
 +QTAILQ_FOREACH(prop, obj-properties, node) {
 +if (strcmp(name, prop-name) == 0) {
 +idx++;
 +break;
 +}
 +}
 +if (!prop) {
 +next_idx_found = true;
 +}
 +}
 +
 +object_property_add_child(obj, name, child, errp);
 +
 +return error_is_set(errp) ? NULL : g_strdup(name);
 +}

This is O(n^3) for adding N children.  O(n^2) would be not-that-great
but fine; can you take the occasion to convert the properties list to a
hashtable?

Paolo

 +
  void object_property_add_child(Object *obj, const char *name,
 Object *child, Error **errp)
  {
 




Re: [Qemu-devel] [PATCH 2/9] qom: add object_property_add_unnamed_child

2013-05-06 Thread mdroth
On Mon, May 06, 2013 at 09:44:13AM +0200, Paolo Bonzini wrote:
 Il 03/05/2013 18:03, Michael Roth ha scritto:
  This interface allows us to add a child property without specifying a
  name. Instead, a unique name is created and passed back after adding
  the property.
  
  Signed-off-by: Michael Roth mdr...@linux.vnet.ibm.com
  ---
   include/qom/object.h |   16 
   qom/object.c |   25 +
   2 files changed, 41 insertions(+)
  
  diff --git a/include/qom/object.h b/include/qom/object.h
  index 86f1e2e..ca0fce8 100644
  --- a/include/qom/object.h
  +++ b/include/qom/object.h
  @@ -1041,6 +1041,22 @@ void object_property_add_child(Object *obj, const 
  char *name,
  Object *child, struct Error **errp);
   
   /**
  + * object_property_add_unnamed_child:
  + *
  + * @obj: the object to add a property to
  + * @name: the name of the property
  + * @child: the child object
  + * @errp: if an error occurs, a pointer to an area to store the area
  + *
  + * Same as object_property_add_child, but will allocate a unique name to
  + * identify the child property.
  + *
  + * Returns: The name assigned to the child property, or NULL on failure.
  + */
  +char *object_property_add_unnamed_child(Object *obj, Object *child,
  +struct Error **errp);
  +
  +/**
* object_property_add_link:
* @obj: the object to add a property to
* @name: the name of the property
  diff --git a/qom/object.c b/qom/object.c
  index c932f64..229a9a7 100644
  --- a/qom/object.c
  +++ b/qom/object.c
  @@ -926,6 +926,31 @@ static void object_finalize_child_property(Object 
  *obj, const char *name,
   object_unref(child);
   }
   
  +char *object_property_add_unnamed_child(Object *obj, Object *child, Error 
  **errp)
  +{
  +int idx = 0;
  +bool next_idx_found = false;
  +char name[64];
  +ObjectProperty *prop;
  +
  +while (!next_idx_found) {
  +sprintf(name, unnamed[%d], idx);
  +QTAILQ_FOREACH(prop, obj-properties, node) {
  +if (strcmp(name, prop-name) == 0) {
  +idx++;
  +break;
  +}
  +}
  +if (!prop) {
  +next_idx_found = true;
  +}
  +}
  +
  +object_property_add_child(obj, name, child, errp);
  +
  +return error_is_set(errp) ? NULL : g_strdup(name);
  +}
 
 This is O(n^3) for adding N children.  O(n^2) would be not-that-great
 but fine; can you take the occasion to convert the properties list to a
 hashtable?

Sure, I'll look into it.

 
 Paolo
 
  +
   void object_property_add_child(Object *obj, const char *name,
  Object *child, Error **errp)
   {
  
 



[Qemu-devel] [PATCH 2/9] qom: add object_property_add_unnamed_child

2013-05-03 Thread Michael Roth
This interface allows us to add a child property without specifying a
name. Instead, a unique name is created and passed back after adding
the property.

Signed-off-by: Michael Roth mdr...@linux.vnet.ibm.com
---
 include/qom/object.h |   16 
 qom/object.c |   25 +
 2 files changed, 41 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index 86f1e2e..ca0fce8 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1041,6 +1041,22 @@ void object_property_add_child(Object *obj, const char 
*name,
Object *child, struct Error **errp);
 
 /**
+ * object_property_add_unnamed_child:
+ *
+ * @obj: the object to add a property to
+ * @name: the name of the property
+ * @child: the child object
+ * @errp: if an error occurs, a pointer to an area to store the area
+ *
+ * Same as object_property_add_child, but will allocate a unique name to
+ * identify the child property.
+ *
+ * Returns: The name assigned to the child property, or NULL on failure.
+ */
+char *object_property_add_unnamed_child(Object *obj, Object *child,
+struct Error **errp);
+
+/**
  * object_property_add_link:
  * @obj: the object to add a property to
  * @name: the name of the property
diff --git a/qom/object.c b/qom/object.c
index c932f64..229a9a7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -926,6 +926,31 @@ static void object_finalize_child_property(Object *obj, 
const char *name,
 object_unref(child);
 }
 
+char *object_property_add_unnamed_child(Object *obj, Object *child, Error 
**errp)
+{
+int idx = 0;
+bool next_idx_found = false;
+char name[64];
+ObjectProperty *prop;
+
+while (!next_idx_found) {
+sprintf(name, unnamed[%d], idx);
+QTAILQ_FOREACH(prop, obj-properties, node) {
+if (strcmp(name, prop-name) == 0) {
+idx++;
+break;
+}
+}
+if (!prop) {
+next_idx_found = true;
+}
+}
+
+object_property_add_child(obj, name, child, errp);
+
+return error_is_set(errp) ? NULL : g_strdup(name);
+}
+
 void object_property_add_child(Object *obj, const char *name,
Object *child, Error **errp)
 {
-- 
1.7.9.5