[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 45/53] qdev: Move core field property code to QOM
From: |
Eduardo Habkost |
Subject: |
[PATCH v3 45/53] qdev: Move core field property code to QOM |
Date: |
Thu, 12 Nov 2020 16:43:42 -0500 |
Move the core of the static property code to qom/field-property.c.
The actual property type implementations are still in
qdev-properties.c, they will be moved later.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Changes v2 -> v3:
* Redone patch after changes in previous patches of this series
* Reordered patch, tried to place it a bit earlier in the series
Changes v1 -> v2:
* Rename static-property.* to field-property.*
---
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org
---
include/hw/qdev-properties.h | 49 +------
.../qom/field-property-internal.h | 6 +-
include/qom/field-property.h | 57 ++++++++
include/qom/qom.h | 1 +
hw/core/qdev-properties-system.c | 2 +-
hw/core/qdev-properties.c | 134 +----------------
qom/field-property.c | 137 ++++++++++++++++++
qom/meson.build | 1 +
8 files changed, 202 insertions(+), 185 deletions(-)
rename hw/core/qdev-prop-internal.h => include/qom/field-property-internal.h
(95%)
create mode 100644 include/qom/field-property.h
create mode 100644 qom/field-property.c
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 1208e12b9b..6585a8e693 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -2,52 +2,7 @@
#define QEMU_QDEV_PROPERTIES_H
#include "hw/qdev-core.h"
-
-/**
- * Property:
- * @set_default: true if the default value should be set from @defval,
- * in which case @info->set_default_value must not be NULL
- * (if false then no default value is set by the property system
- * and the field retains whatever value it was given by instance_init).
- * @defval: default value for the property. This is used only if @set_default
- * is true.
- */
-struct Property {
- /**
- * @name_template: Property name template
- *
- * This is a string containing the template to be used when
- * creating the property. It can be NULL, and code shouldn't
- * assume it will contain the actual property name.
- */
- const char *name_template;
- const PropertyInfo *info;
- ptrdiff_t offset;
- uint8_t bitnr;
- bool set_default;
- union {
- int64_t i;
- uint64_t u;
- } defval;
- int arrayoffset;
- const PropertyInfo *arrayinfo;
- int arrayfieldsize;
- const char *link_type;
-};
-
-struct PropertyInfo {
- const char *name;
- const char *description;
- const QEnumLookup *enum_table;
- int (*print)(Object *obj, Property *prop, char *dest, size_t len);
- void (*set_default_value)(ObjectProperty *op, const Property *prop);
- ObjectProperty *(*create)(ObjectClass *oc, const char *name,
- Property *prop);
- ObjectPropertyAccessor *get;
- ObjectPropertyAccessor *set;
- ObjectPropertyRelease *release;
-};
-
+#include "qom/field-property.h"
/*** qdev-properties.c ***/
@@ -200,8 +155,6 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char
*name,
const uint8_t *value);
void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
-void *object_field_prop_ptr(Object *obj, Property *prop);
-
void qdev_prop_register_global(GlobalProperty *prop);
const GlobalProperty *qdev_find_global_prop(Object *obj,
const char *name);
diff --git a/hw/core/qdev-prop-internal.h
b/include/qom/field-property-internal.h
similarity index 95%
rename from hw/core/qdev-prop-internal.h
rename to include/qom/field-property-internal.h
index 47bab46810..a7b7e2b69d 100644
--- a/hw/core/qdev-prop-internal.h
+++ b/include/qom/field-property-internal.h
@@ -1,12 +1,12 @@
/*
- * qdev property parsing
+ * QOM field property internal API (for implementing custom types)
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
-#ifndef HW_CORE_QDEV_PROP_INTERNAL_H
-#define HW_CORE_QDEV_PROP_INTERNAL_H
+#ifndef QOM_STATIC_PROPERTY_INTERNAL_H
+#define QOM_STATIC_PROPERTY_INTERNAL_H
void field_prop_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp);
diff --git a/include/qom/field-property.h b/include/qom/field-property.h
new file mode 100644
index 0000000000..91e7a43165
--- /dev/null
+++ b/include/qom/field-property.h
@@ -0,0 +1,57 @@
+/*
+ * QOM field property API
+ */
+#ifndef QOM_FIELD_PROPERTY_H
+#define QOM_FIELD_PROPERTY_H
+
+#include "qom/object.h"
+#include "qapi/util.h"
+
+/**
+ * Property:
+ * @set_default: true if the default value should be set from @defval,
+ * in which case @info->set_default_value must not be NULL
+ * (if false then no default value is set by the property system
+ * and the field retains whatever value it was given by instance_init).
+ * @defval: default value for the property. This is used only if @set_default
+ * is true.
+ */
+struct Property {
+ /**
+ * @name_template: Property name template
+ *
+ * This is a string containing the template to be used when
+ * creating the property. It can be NULL, and code shouldn't
+ * assume it will contain the actual property name.
+ */
+ const char *name_template;
+ const PropertyInfo *info;
+ ptrdiff_t offset;
+ uint8_t bitnr;
+ bool set_default;
+ union {
+ int64_t i;
+ uint64_t u;
+ } defval;
+ int arrayoffset;
+ const PropertyInfo *arrayinfo;
+ int arrayfieldsize;
+ const char *link_type;
+};
+
+struct PropertyInfo {
+ const char *name;
+ const char *description;
+ const QEnumLookup *enum_table;
+ int (*print)(Object *obj, Property *prop, char *dest, size_t len);
+ void (*set_default_value)(ObjectProperty *op, const Property *prop);
+ ObjectProperty *(*create)(ObjectClass *oc, const char *name,
+ Property *prop);
+ ObjectPropertyAccessor *get;
+ ObjectPropertyAccessor *set;
+ ObjectPropertyRelease *release;
+};
+
+void *object_field_prop_ptr(Object *obj, Property *prop);
+
+#endif
diff --git a/include/qom/qom.h b/include/qom/qom.h
index 3286605083..9dbc88801d 100644
--- a/include/qom/qom.h
+++ b/include/qom/qom.h
@@ -8,3 +8,4 @@
#include "qom/object.h"
#include "qom/object_interfaces.h"
#include "qom/qom-qobject.h"
+#include "qom/field-property.h"
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 8781b856d3..8da68f076c 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -24,7 +24,7 @@
#include "qemu/units.h"
#include "qemu/uuid.h"
#include "qemu/error-report.h"
-#include "qdev-prop-internal.h"
+#include "qom/field-property-internal.h"
#include "audio/audio.h"
#include "chardev/char-fe.h"
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 7aa5d2ff45..c79cb9a89b 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -8,7 +8,7 @@
#include "qapi/visitor.h"
#include "qemu/units.h"
#include "qemu/cutils.h"
-#include "qdev-prop-internal.h"
+#include "qom/field-property-internal.h"
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
Error **errp)
@@ -50,48 +50,6 @@ void qdev_prop_allow_set_link_before_realize(const Object
*obj,
}
}
-void *object_field_prop_ptr(Object *obj, Property *prop)
-{
- void *ptr = obj;
- ptr += prop->offset;
- return ptr;
-}
-
-static void field_prop_get(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- Property *prop = opaque;
- return prop->info->get(obj, v, name, opaque, errp);
-}
-
-/**
- * field_prop_getter: Return getter function to be used for property
- *
- * Return value can be NULL if @info has no getter function.
- */
-static ObjectPropertyAccessor *field_prop_getter(const PropertyInfo *info)
-{
- return info->get ? field_prop_get : NULL;
-}
-
-static void field_prop_set(Object *obj, Visitor *v, const char *name,
- void *opaque, Error **errp)
-{
- Property *prop = opaque;
-
- return prop->info->set(obj, v, name, opaque, errp);
-}
-
-/**
- * field_prop_setter: Return setter function to be used for property
- *
- * Return value can be NULL if @info has not setter function.
- */
-static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
-{
- return info->set ? field_prop_set : NULL;
-}
-
void field_prop_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
@@ -802,96 +760,6 @@ const PropertyInfo prop_info_link = {
.create = create_link_property,
};
-/*
- * Property release callback for dynamically-created properties:
- * We call the underlying element's property release hook, and
- * then free the memory we allocated when we added the property.
- */
-static void static_prop_release_dynamic_prop(Object *obj, const char *name,
- void *opaque)
-{
- Property *prop = opaque;
- if (prop->info->release) {
- prop->info->release(obj, name, opaque);
- }
- g_free(prop);
-}
-
-ObjectProperty *
-object_property_add_field(Object *obj, const char *name,
- Property *prop,
- ObjectPropertyAllowSet allow_set)
-{
- ObjectProperty *op;
- Property *newprop = g_new0(Property, 1);
-
- assert(allow_set);
- assert(!prop->info->create);
-
- *newprop = *prop;
- op = object_property_add(obj, name, newprop->info->name,
- field_prop_getter(newprop->info),
- field_prop_setter(newprop->info),
- static_prop_release_dynamic_prop,
- newprop);
-
- object_property_set_description(obj, name,
- newprop->info->description);
-
- if (newprop->set_default) {
- newprop->info->set_default_value(op, newprop);
- if (op->init) {
- op->init(obj, op);
- }
- }
-
- op->allow_set = allow_set;
- return op;
-}
-
-ObjectProperty *
-object_class_property_add_field_static(ObjectClass *oc, const char *name,
- Property *prop,
- ObjectPropertyAllowSet allow_set)
-{
- ObjectProperty *op;
-
- assert(allow_set);
-
- if (prop->info->create) {
- op = prop->info->create(oc, name, prop);
- } else {
- op = object_class_property_add(oc,
- name, prop->info->name,
- field_prop_getter(prop->info),
- field_prop_setter(prop->info),
- prop->info->release,
- prop);
- }
- if (prop->set_default) {
- prop->info->set_default_value(op, prop);
- }
- if (prop->info->description) {
- object_class_property_set_description(oc, name,
- prop->info->description);
- }
-
- op->allow_set = allow_set;
- return op;
-}
-
-void object_class_add_field_properties(ObjectClass *oc, Property *props,
- ObjectPropertyAllowSet allow_set)
-{
- Property *prop;
-
- for (prop = props; prop && prop->name_template; prop++) {
- object_class_property_add_field_static(oc, prop->name_template, prop,
- allow_set);
- }
-}
-
-
void qdev_property_add_static(DeviceState *dev, Property *prop)
{
object_property_add_field(OBJECT(dev), prop->name_template, prop,
diff --git a/qom/field-property.c b/qom/field-property.c
new file mode 100644
index 0000000000..1fd11f2ad3
--- /dev/null
+++ b/qom/field-property.c
@@ -0,0 +1,137 @@
+/*
+ * QOM field property API implementation
+ */
+#include "qemu/osdep.h"
+#include "qom/field-property.h"
+#include "qom/field-property-internal.h"
+
+void *object_field_prop_ptr(Object *obj, Property *prop)
+{
+ void *ptr = obj;
+ ptr += prop->offset;
+ return ptr;
+}
+
+static void field_prop_get(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ Property *prop = opaque;
+ return prop->info->get(obj, v, name, opaque, errp);
+}
+
+/**
+ * field_prop_getter: Return getter function to be used for property
+ *
+ * Return value can be NULL if @info has no getter function.
+ */
+static ObjectPropertyAccessor *field_prop_getter(const PropertyInfo *info)
+{
+ return info->get ? field_prop_get : NULL;
+}
+
+static void field_prop_set(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ Property *prop = opaque;
+
+ return prop->info->set(obj, v, name, opaque, errp);
+}
+
+/**
+ * field_prop_setter: Return setter function to be used for property
+ *
+ * Return value can be NULL if @info has not setter function.
+ */
+static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info)
+{
+ return info->set ? field_prop_set : NULL;
+}
+
+/*
+ * Property release callback for dynamically-created properties:
+ * We call the underlying element's property release hook, and
+ * then free the memory we allocated when we added the property.
+ */
+static void static_prop_release_dynamic_prop(Object *obj, const char *name,
+ void *opaque)
+{
+ Property *prop = opaque;
+ if (prop->info->release) {
+ prop->info->release(obj, name, opaque);
+ }
+ g_free(prop);
+}
+
+ObjectProperty *
+object_property_add_field(Object *obj, const char *name,
+ Property *prop,
+ ObjectPropertyAllowSet allow_set)
+{
+ ObjectProperty *op;
+ Property *newprop = g_new0(Property, 1);
+
+ assert(allow_set);
+ assert(!prop->info->create);
+
+ *newprop = *prop;
+ op = object_property_add(obj, name, newprop->info->name,
+ field_prop_getter(newprop->info),
+ field_prop_setter(newprop->info),
+ static_prop_release_dynamic_prop,
+ newprop);
+
+ object_property_set_description(obj, name,
+ newprop->info->description);
+
+ if (newprop->set_default) {
+ newprop->info->set_default_value(op, newprop);
+ if (op->init) {
+ op->init(obj, op);
+ }
+ }
+
+ op->allow_set = allow_set;
+ return op;
+}
+
+ObjectProperty *
+object_class_property_add_field_static(ObjectClass *oc, const char *name,
+ Property *prop,
+ ObjectPropertyAllowSet allow_set)
+{
+ ObjectProperty *op;
+
+ assert(allow_set);
+
+ if (prop->info->create) {
+ op = prop->info->create(oc, name, prop);
+ } else {
+ op = object_class_property_add(oc,
+ name, prop->info->name,
+ field_prop_getter(prop->info),
+ field_prop_setter(prop->info),
+ prop->info->release,
+ prop);
+ }
+ if (prop->set_default) {
+ prop->info->set_default_value(op, prop);
+ }
+ if (prop->info->description) {
+ object_class_property_set_description(oc, name,
+ prop->info->description);
+ }
+
+ op->allow_set = allow_set;
+ return op;
+}
+
+void object_class_add_field_properties(ObjectClass *oc, Property *props,
+ ObjectPropertyAllowSet allow_set)
+{
+ Property *prop;
+
+ for (prop = props; prop && prop->name_template; prop++) {
+ object_class_property_add_field_static(oc, prop->name_template, prop,
+ allow_set);
+ }
+}
diff --git a/qom/meson.build b/qom/meson.build
index 062a3789d8..e83794454d 100644
--- a/qom/meson.build
+++ b/qom/meson.build
@@ -4,6 +4,7 @@ qom_ss.add(files(
'object.c',
'object_interfaces.c',
'qom-qobject.c',
+ 'field-property.c',
))
qmp_ss.add(files('qom-qmp-cmds.c'))
--
2.28.0
- [PATCH v3 36/53] qdev: Don't set .name_template for array elements, (continued)
- [PATCH v3 36/53] qdev: Don't set .name_template for array elements, Eduardo Habkost, 2020/11/12
- [PATCH v3 35/53] qdev: Rename Property.name to Property.name_template, Eduardo Habkost, 2020/11/12
- [PATCH v3 37/53] qdev: Remove ArrayElementProperty.propname field, Eduardo Habkost, 2020/11/12
- [PATCH v3 38/53] qdev: Remove ArrayElementProperty.release field, Eduardo Habkost, 2020/11/12
- [PATCH v3 39/53] qdev: Get rid of ArrayElementProperty struct, Eduardo Habkost, 2020/11/12
- [PATCH v3 40/53] qdev: Rename array_element_release() to static_prop_release_dynamic_prop(), Eduardo Habkost, 2020/11/12
- [PATCH v3 41/53] qdev: Make object_property_add_field() copy the Property struct, Eduardo Habkost, 2020/11/12
- [PATCH v3 44/53] qom: Add new qom.h header, Eduardo Habkost, 2020/11/12
- [PATCH v3 43/53] qdev: Move static_prop_release_dynamic_prop() closer to its usage, Eduardo Habkost, 2020/11/12
- [PATCH v3 42/53] qdev: Reuse object_property_add_field() when adding array elements, Eduardo Habkost, 2020/11/12
- [PATCH v3 45/53] qdev: Move core field property code to QOM,
Eduardo Habkost <=
- [PATCH v3 46/53] qdev: Move base property types to qom/property-types.c, Eduardo Habkost, 2020/11/12
- [PATCH v3 47/53] qom: Include static property API reference in documentation, Eduardo Habkost, 2020/11/12
- [PATCH v3 48/53] qom: object_class_property_add_field() function, Eduardo Habkost, 2020/11/12
- [PATCH v3 49/53] qom: FIELD_PROP macro, Eduardo Habkost, 2020/11/12
- [PATCH v3 50/53] qom: Delete DEFINE_PROP_*SIGNED_NODEFAULT macro, Eduardo Habkost, 2020/11/12
- [PATCH v3 52/53] tests: Use field property at check-qom-proplist test case, Eduardo Habkost, 2020/11/12
- [PATCH v3 51/53] qom: PROP_* macros, Eduardo Habkost, 2020/11/12
- [PATCH v3 53/53] sev: Use class properties, Eduardo Habkost, 2020/11/12