qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 42/53] qdev: Reuse object_property_add_field() when adding arr


From: Eduardo Habkost
Subject: [PATCH v3 42/53] qdev: Reuse object_property_add_field() when adding array elements
Date: Thu, 12 Nov 2020 16:43:39 -0500

Now that we call object_property_add() with exactly the same
arguments as object_property_add_field() does, we can just reuse
the function.  We can now use a stack variable for the new
Property struct, because object_property_add_field() will copy
the struct.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Changes v2 -> v3:
* Fix memory leak from v2, after making
  object_property_add_field() copy the Property struct

Changes v1 -> v2:
* Now we don't need to hack ObjectProperty.release anymore,
  patch became trivial
---
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org
---
 hw/core/qdev-properties.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 451bb54cf6..83fd45add0 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -576,23 +576,17 @@ static void set_prop_arraylen(Object *obj, Visitor *v, 
const char *name,
     *arrayptr = eltptr = g_malloc0(*alenptr * prop->arrayfieldsize);
     for (i = 0; i < *alenptr; i++, eltptr += prop->arrayfieldsize) {
         g_autofree char *propname = g_strdup_printf("%s[%d]", arrayname, i);
-        Property *arrayprop = g_new0(Property, 1);
-        ObjectProperty *elmop;
-        arrayprop->info = prop->arrayinfo;
+        Property arrayprop = { };
+        arrayprop.info = prop->arrayinfo;
         /* This ugly piece of pointer arithmetic sets up the offset so
          * that when the underlying get/set hooks call qdev_get_prop_ptr
          * they get the right answer despite the array element not actually
          * being inside the device struct.
          */
-        arrayprop->offset = eltptr - (void *)obj;
-        assert(object_field_prop_ptr(obj, arrayprop) == eltptr);
-        elmop = object_property_add(obj, propname,
-                                    arrayprop->info->name,
-                                    field_prop_getter(arrayprop->info),
-                                    field_prop_setter(arrayprop->info),
-                                    static_prop_release_dynamic_prop,
-                                    arrayprop);
-        elmop->allow_set = op->allow_set;
+        arrayprop.offset = eltptr - (void *)obj;
+        assert(object_field_prop_ptr(obj, &arrayprop) == eltptr);
+        object_property_add_field(obj, propname, &arrayprop,
+                                  op->allow_set);
     }
 }
 
-- 
2.28.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]