Introduce a 'flags' field in the ObjectProperty structure to store
property-specific behavior modifiers.
Currently, ObjectPropertyFlags (READ/WRITE) are only used for property
creation (e.g., initialize accessors for pointer properties).
By caching these flags directly in ObjectProperty, we can:
1. Preserve the initial access intent (read/write) of the property.
* the READ/WRITE flags cached in ObjectProperty have no effect for
now, but they may be useful for cases need write-once, if needed.
2. Reuse existing ObjectPropertyFlags and provide a foundation for
future flags (e.g., to track if a property was explicitly set by
external user).
To avoid "incomplete type" error, move ObjectPropertyFlags before
ObjectProperty definition, and polish the comment of ObjectPropertyFlags
to clarify how READ/WRITE flags work for general properties.
Suggested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
---
include/qom/object.h | 34 +++++++++++++++++++++++++---------
qom/object.c | 16 +++++++++++++++-
2 files changed, 40 insertions(+), 10 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index 6226b88c1eda..05706d4d7e3a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -87,6 +87,30 @@ typedef void (ObjectPropertyRelease)(Object *obj,
*/
typedef void (ObjectPropertyInit)(Object *obj, ObjectProperty *prop);
+typedef enum {
+ /*
+ * The property is readable and has a getter.
+ *
+ * For pointer property, this flag (set in object_{class_}property_add_*_ptr())
+ * will automatically add a getter to this property.
+ */
+ OBJ_PROP_FLAG_READ = BIT(0),
+ /*
+ * The property is writable and has a setter.
+ *
+ * For pointer property, this flag (set in object_{class_}property_add_*_ptr())
+ * will automatically add a setter to this property.
+ */
+ OBJ_PROP_FLAG_WRITE = BIT(1),
+ /*
+ * The property is readable and writable, as well as has a getter and a setter.
+ *
+ * For pointer property, this flag (set in object_{class_}property_add_*_ptr())
+ * will automatically add a getter and a setter to this property.
+ */
+ OBJ_PROP_FLAG_READWRITE = (OBJ_PROP_FLAG_READ | OBJ_PROP_FLAG_WRITE),
+} ObjectPropertyFlags;
+
struct ObjectProperty
{
char *name;
@@ -99,6 +123,7 @@ struct ObjectProperty
ObjectPropertyInit *init;
void *opaque;
QObject *defval;
+ ObjectPropertyFlags flags;
};
/**
@@ -1840,15 +1865,6 @@ ObjectProperty *object_class_property_add_tm(ObjectClass *klass,
const char *name,
void (*get)(Object *, struct tm *, Error **));
-typedef enum {
- /* Automatically add a getter to the property */
- OBJ_PROP_FLAG_READ = BIT(0),
- /* Automatically add a setter to the property */
- OBJ_PROP_FLAG_WRITE = BIT(1),
- /* Automatically add a getter and a setter to the property */
- OBJ_PROP_FLAG_READWRITE = (OBJ_PROP_FLAG_READ | OBJ_PROP_FLAG_WRITE),
-} ObjectPropertyFlags;
-
/**
* object_property_add_uint8_ptr:
* @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index ff8ede8a328e..f5801f4624c8 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1233,6 +1233,19 @@ void object_unref(void *objptr)
}
}
+static inline void object_property_flags_init(ObjectProperty *prop)
+{
+ uint8_t flags = 0;
+
+ if (prop->set) {
+ flags |= OBJ_PROP_FLAG_WRITE;
+ }
+ if (prop->get) {
+ flags |= OBJ_PROP_FLAG_READ;
+ }
+ prop->flags |= flags;
+}
+
ObjectProperty *
object_property_try_add(Object *obj, const char *name, const char *type,
ObjectPropertyAccessor *get,
@@ -1279,6 +1292,7 @@ object_property_try_add(Object *obj, const char *name, const char *type,
prop->set = set;
prop->release = release;
prop->opaque = opaque;
+ object_property_flags_init(prop);
g_hash_table_insert(obj->properties, prop->name, prop);
return prop;
@@ -1317,9 +1331,9 @@ object_class_property_add(ObjectClass *klass,
prop->set = set;
prop->release = release;
prop->opaque = opaque;
+ object_property_flags_init(prop);
g_hash_table_insert(klass->properties, prop->name, prop);
-
return prop;
}
--
2.34.1