From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:45653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZG5x-0006Rj-CE for qemu-devel@nongnu.org; Mon, 06 May 2013 03:44:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UZG5w-0000WT-2A for qemu-devel@nongnu.org; Mon, 06 May 2013 03:44:25 -0400 Received: from mail-ea0-x232.google.com ([2a00:1450:4013:c01::232]:56673) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UZG5v-0000WO-R6 for qemu-devel@nongnu.org; Mon, 06 May 2013 03:44:23 -0400 Received: by mail-ea0-f178.google.com with SMTP id m14so1605045eaj.23 for ; Mon, 06 May 2013 00:44:22 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <51875F4D.2090005@redhat.com> Date: Mon, 06 May 2013 09:44:13 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1367597032-28934-1-git-send-email-mdroth@linux.vnet.ibm.com> <1367597032-28934-3-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1367597032-28934-3-git-send-email-mdroth@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/9] qom: add object_property_add_unnamed_child List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org, stefanha@redhat.com, qemulist@gmail.com 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 > --- > 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) > { >