Patchwork [V2,1/2] qom: if @instance_size==0, assign size of object to parent object size

login
register
mail settings
Submitter Mitsyanko Igor
Date Feb. 28, 2012, 11:57 a.m.
Message ID <1330430231-18778-2-git-send-email-i.mitsyanko@samsung.com>
Download mbox | patch
Permalink /patch/143435/
State New
Headers show

Comments

Mitsyanko Igor - Feb. 28, 2012, 11:57 a.m.
QOM documentation states that for objects of type with @instance_size == 0 size
will be assigned to match parent object's size. But currently this feauture is
not implemented and qemu asserts during creation of object with zero instance_size.

Set appropriate value for type instance_size during type_class_init() call.
object_initialize_with_type() must call type_class_init() before asserting
type->instance_size, and object_new_with_type() must call type_class_init() before
object allocation.

Signed-off-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
---
 qom/object.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

Patch

diff --git a/qom/object.c b/qom/object.c
index aa037d2..6d31bc3 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -177,6 +177,19 @@  static size_t type_class_get_size(TypeImpl *ti)
     return sizeof(ObjectClass);
 }
 
+static size_t type_object_get_size(TypeImpl *ti)
+{
+    if (ti->instance_size) {
+        return ti->instance_size;
+    }
+
+    if (type_has_parent(ti)) {
+        return type_object_get_size(type_get_parent(ti));
+    }
+
+    return 0;
+}
+
 static void type_class_interface_init(TypeImpl *ti, InterfaceImpl *iface)
 {
     TypeInfo info = {
@@ -203,6 +216,7 @@  static void type_class_init(TypeImpl *ti)
     }
 
     ti->class_size = type_class_get_size(ti);
+    ti->instance_size = type_object_get_size(ti);
 
     ti->class = g_malloc0(ti->class_size);
     ti->class->type = ti;
@@ -264,9 +278,9 @@  void object_initialize_with_type(void *data, TypeImpl *type)
     Object *obj = data;
 
     g_assert(type != NULL);
-    g_assert(type->instance_size >= sizeof(Object));
-
     type_class_init(type);
+
+    g_assert(type->instance_size >= sizeof(Object));
     g_assert(type->abstract == false);
 
     memset(obj, 0, type->instance_size);
@@ -356,6 +370,7 @@  Object *object_new_with_type(Type type)
     Object *obj;
 
     g_assert(type != NULL);
+    type_class_init(type);
 
     obj = g_malloc(type->instance_size);
     object_initialize_with_type(obj, type);