diff mbox

[for-2.9,2/2] qdev: Change signature of PropertyInfo::release

Message ID 1479322664-2253-3-git-send-email-ehabkost@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Eduardo Habkost Nov. 16, 2016, 6:57 p.m. UTC
Change the function signature to make implementations simpler and
safer. No void pointers and Object->DeviceState casts inside each
release function.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/core/qdev-properties-system.c |  8 ++------
 hw/core/qdev-properties.c        | 10 +++++-----
 hw/core/qdev.c                   | 10 +++++++++-
 include/hw/qdev-core.h           |  2 +-
 4 files changed, 17 insertions(+), 13 deletions(-)

Comments

Markus Armbruster Nov. 17, 2016, 12:26 p.m. UTC | #1
Eduardo Habkost <ehabkost@redhat.com> writes:

> Change the function signature to make implementations simpler and
> safer. No void pointers and Object->DeviceState casts inside each
> release function.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>  hw/core/qdev-properties-system.c |  8 ++------
>  hw/core/qdev-properties.c        | 10 +++++-----
>  hw/core/qdev.c                   | 10 +++++++++-
>  include/hw/qdev-core.h           |  2 +-
>  4 files changed, 17 insertions(+), 13 deletions(-)
>
> diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
> index 1b7ea50..4f49109 100644
> --- a/hw/core/qdev-properties-system.c
> +++ b/hw/core/qdev-properties-system.c
> @@ -112,10 +112,8 @@ fail:
>      }
>  }
>  
> -static void release_drive(Object *obj, const char *name, void *opaque)
> +static void release_drive(DeviceState *dev, Property *prop)
>  {
> -    DeviceState *dev = DEVICE(obj);
> -    Property *prop = opaque;
>      BlockBackend **ptr = qdev_get_prop_ptr(dev, prop);
>  
>      if (*ptr) {
> @@ -210,10 +208,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
>      g_free(str);
>  }
>  
> -static void release_chr(Object *obj, const char *name, void *opaque)
> +static void release_chr(DeviceState *dev, Property *prop)
>  {
> -    DeviceState *dev = DEVICE(obj);
> -    Property *prop = opaque;
>      CharBackend *be = qdev_get_prop_ptr(dev, prop);
>  
>      qemu_chr_fe_deinit(be);
> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
> index 2a82768..3709050 100644
> --- a/hw/core/qdev-properties.c
> +++ b/hw/core/qdev-properties.c
> @@ -383,10 +383,9 @@ PropertyInfo qdev_prop_uint64 = {
>  
>  /* --- string --- */
>  
> -static void release_string(Object *obj, const char *name, void *opaque)
> +static void release_string(DeviceState *dev, Property *prop)
>  {
> -    Property *prop = opaque;
> -    g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
> +    g_free(*(char **)qdev_get_prop_ptr(dev, prop));
>  }

Type-punning moved from the three release methods to ...

>  
>  static void get_string(Object *obj, Visitor *v, const char *name,
> @@ -823,7 +822,7 @@ PropertyInfo qdev_prop_pci_host_devaddr = {
>  typedef struct {
>      struct Property prop;
>      char *propname;
> -    ObjectPropertyRelease *release;
> +    void (*release)(DeviceState *dev, Property *prop);
>  } ArrayElementProperty;
>  
>  /* object property release callback for array element properties:
> @@ -832,9 +831,10 @@ typedef struct {
>   */
>  static void array_element_release(Object *obj, const char *name, void *opaque)
>  {
> +    DeviceState *dev = DEVICE(obj);
>      ArrayElementProperty *p = opaque;
>      if (p->release) {
> -        p->release(obj, name, opaque);
> +        p->release(dev, &p->prop);
>      }
>      g_free(p->propname);
>      g_free(p);

... this old wrapper and ...

> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 5783442..b859e15 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -774,6 +774,14 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
>      g_free(name);
>  }
>  
> +static void qdev_release_prop(Object *obj, const char *name, void *opaque)
> +{
> +    DeviceState *dev = DEVICE(obj);
> +    Property *prop = opaque;

... a new one.  Hmm.

> +
> +    prop->info->release(dev, prop);

Roundabout way to say prop->info->release(DEVICE(obj), opaque).  Matter
of taste.

> +}
> +
>  /**
>   * qdev_property_add_static:
>   * @dev: Device to add the property to.
> @@ -801,7 +809,7 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
>  
>      object_property_add(obj, prop->name, prop->info->name,
>                          prop->info->get, prop->info->set,
> -                        prop->info->release,
> +                        prop->info->release ? qdev_release_prop : NULL,
>                          prop, &local_err);
>  
>      if (local_err) {
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index 2c97347..5ea2095 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -251,7 +251,7 @@ struct PropertyInfo {
>      int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
>      ObjectPropertyAccessor *get;
>      ObjectPropertyAccessor *set;
> -    ObjectPropertyRelease *release;
> +    void (*release)(DeviceState *dev, Property *prop);
>  };
>  
>  /**

The transformation looks correct to me, but I'm not sure it's
worthwhile.

Moreover, it creates an inconsistency between set()/get() and release(),
both here and in the concrete implementations.  For instance,
get_string() and set_string() continue to take obj, name, opaque, while
release_string() is changed to take dev, prop.  I don't like that.
Eduardo Habkost Nov. 17, 2016, 1:40 p.m. UTC | #2
On Thu, Nov 17, 2016 at 01:26:47PM +0100, Markus Armbruster wrote:
[...]
> The transformation looks correct to me, but I'm not sure it's
> worthwhile.
> 
> Moreover, it creates an inconsistency between set()/get() and release(),
> both here and in the concrete implementations.  For instance,
> get_string() and set_string() continue to take obj, name, opaque, while
> release_string() is changed to take dev, prop.  I don't like that.

My main goal was just to make it more difficult to mistakenly use
the qdev propery release functions (that should be called at
object destruction time) as the release functions for class
properties (that should be called at class destruction time). But
this is not as important if patch 1/2 removes the class property
release functions. We can drop this patch.
diff mbox

Patch

diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 1b7ea50..4f49109 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -112,10 +112,8 @@  fail:
     }
 }
 
-static void release_drive(Object *obj, const char *name, void *opaque)
+static void release_drive(DeviceState *dev, Property *prop)
 {
-    DeviceState *dev = DEVICE(obj);
-    Property *prop = opaque;
     BlockBackend **ptr = qdev_get_prop_ptr(dev, prop);
 
     if (*ptr) {
@@ -210,10 +208,8 @@  static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
     g_free(str);
 }
 
-static void release_chr(Object *obj, const char *name, void *opaque)
+static void release_chr(DeviceState *dev, Property *prop)
 {
-    DeviceState *dev = DEVICE(obj);
-    Property *prop = opaque;
     CharBackend *be = qdev_get_prop_ptr(dev, prop);
 
     qemu_chr_fe_deinit(be);
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 2a82768..3709050 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -383,10 +383,9 @@  PropertyInfo qdev_prop_uint64 = {
 
 /* --- string --- */
 
-static void release_string(Object *obj, const char *name, void *opaque)
+static void release_string(DeviceState *dev, Property *prop)
 {
-    Property *prop = opaque;
-    g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
+    g_free(*(char **)qdev_get_prop_ptr(dev, prop));
 }
 
 static void get_string(Object *obj, Visitor *v, const char *name,
@@ -823,7 +822,7 @@  PropertyInfo qdev_prop_pci_host_devaddr = {
 typedef struct {
     struct Property prop;
     char *propname;
-    ObjectPropertyRelease *release;
+    void (*release)(DeviceState *dev, Property *prop);
 } ArrayElementProperty;
 
 /* object property release callback for array element properties:
@@ -832,9 +831,10 @@  typedef struct {
  */
 static void array_element_release(Object *obj, const char *name, void *opaque)
 {
+    DeviceState *dev = DEVICE(obj);
     ArrayElementProperty *p = opaque;
     if (p->release) {
-        p->release(obj, name, opaque);
+        p->release(dev, &p->prop);
     }
     g_free(p->propname);
     g_free(p);
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 5783442..b859e15 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -774,6 +774,14 @@  static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
     g_free(name);
 }
 
+static void qdev_release_prop(Object *obj, const char *name, void *opaque)
+{
+    DeviceState *dev = DEVICE(obj);
+    Property *prop = opaque;
+
+    prop->info->release(dev, prop);
+}
+
 /**
  * qdev_property_add_static:
  * @dev: Device to add the property to.
@@ -801,7 +809,7 @@  void qdev_property_add_static(DeviceState *dev, Property *prop,
 
     object_property_add(obj, prop->name, prop->info->name,
                         prop->info->get, prop->info->set,
-                        prop->info->release,
+                        prop->info->release ? qdev_release_prop : NULL,
                         prop, &local_err);
 
     if (local_err) {
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 2c97347..5ea2095 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -251,7 +251,7 @@  struct PropertyInfo {
     int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
     ObjectPropertyAccessor *get;
     ObjectPropertyAccessor *set;
-    ObjectPropertyRelease *release;
+    void (*release)(DeviceState *dev, Property *prop);
 };
 
 /**