On 06/25/2012 11:32 AM, Andreas Färber wrote:
Am 25.06.2012 18:09, schrieb Anthony Liguori:
Signed-off-by: Anthony Liguori<aligu...@us.ibm.com>
---
  include/qemu/object.h |   16 ++++++++++++++
  qom/object.c          |   56 +++++++++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/include/qemu/object.h b/include/qemu/object.h
index 8b17776..3711054 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -933,6 +933,22 @@ void object_property_add_str(Object *obj, const char *name,
                               struct Error **errp);

  /**
+ * object_property_add_bool:
+ * @obj: the object to add a property to
+ * @name: the name of the property
+ * @get: the getter or NULL if the property is write-only.
+ * @set: the setter or NULL if the property is read-only
+ * @errp: if an error occurs, a pointer to an area to store the error
+ *
+ * Add a bool property using getters/setters.  This function will add a
+ * property of type 'bool'.
+ */
+void object_property_add_bool(Object *obj, const char *name,
+                             bool (*get)(Object *, struct Error **),
+                             void (*set)(Object *, bool, struct Error **),
+                             struct Error **errp);

Indentation is off by one.

doh, c&p error.

+
+/**
   * object_child_foreach:
   * @obj: the object whose children will be navigated
   * @fn: the iterator function to be called
diff --git a/qom/object.c b/qom/object.c
index 00bb3b0..1357397 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1232,6 +1232,62 @@ void object_property_add_str(Object *obj, const char 
*name,
                          prop, errp);
  }

+typedef struct BoolProperty
+{
+    bool (*get)(Object *, Error **);
+    void (*set)(Object *, bool, Error **);
+} BoolProperty;

This follows the modelling of the StringProperty and looks okay to me.
However, I stumbled over whether we should allow passing an opaque to
the typed accessors, too?

I'd prefer not to.

You don't have to use these interfaces. They are just convenient wrappers. Adding more parameters just makes them less convenient to use.

The use case I have in mind is having a dummy device bundle properties
for some parent (wild example: /machine/cpu[1]/features x2apic rather
than /machine/cpu[1] x2apic-feature), i.e. where the obj passed to the
property and the storage of the value differ somehow.

Not a blocker for this series, general design question. CC'ing Paolo.

I'm not sure I totally understand the use case. I think you mean forwarding properties? If so, can you give a more detailed concrete use-case?

That makes me a bit nervous because I think it will be hard to maintain compatibility over time if we allow too much of an ad-hoc interface with properties.

Regards,

Anthony Liguori


Andreas

+
+static void property_get_bool(Object *obj, Visitor *v, void *opaque,
+                              const char *name, Error **errp)
+{
+    BoolProperty *prop = opaque;
+    bool value;
+
+    value = prop->get(obj, errp);
+    visit_type_bool(v,&value, name, errp);
+}
+
+static void property_set_bool(Object *obj, Visitor *v, void *opaque,
+                              const char *name, Error **errp)
+{
+    BoolProperty *prop = opaque;
+    bool value;
+    Error *local_err = NULL;
+
+    visit_type_bool(v,&value, name,&local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    prop->set(obj, value, errp);
+}
+
+static void property_release_bool(Object *obj, const char *name,
+                                  void *opaque)
+{
+    BoolProperty *prop = opaque;
+    g_free(prop);
+}
+
+void object_property_add_bool(Object *obj, const char *name,
+                              bool (*get)(Object *, Error **),
+                              void (*set)(Object *, bool, Error **),
+                              Error **errp)
+{
+    BoolProperty *prop = g_malloc0(sizeof(*prop));
+
+    prop->get = get;
+    prop->set = set;
+
+    object_property_add(obj, name, "bool",
+                        get ? property_get_bool : NULL,
+                        set ? property_set_bool : NULL,
+                        property_release_bool,
+                        prop, errp);
+}
+
  static char *qdev_get_type(Object *obj, Error **errp)
  {
      return g_strdup(object_get_typename(obj));




Reply via email to