qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, aliguori@us.ibm.com,
	liwp@linux.vnet.ibm.com, afaerber@suse.de
Subject: [Qemu-devel] [PATCH 04/21] qom: make Object a type
Date: Wed,  2 May 2012 13:30:56 +0200	[thread overview]
Message-ID: <1335958273-769-5-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1335958273-769-1-git-send-email-pbonzini@redhat.com>

Right now the base Object class has a special NULL type.  Change this so
that we will be able to add class_init and class_base_init callbacks.
To do this, remove some special casing of ObjectClass that is not really
necessary.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qemu/object.h |    2 +-
 qom/object.c          |   59 +++++++++++++++++++++++++------------------------
 2 files changed, 31 insertions(+), 30 deletions(-)

diff --git a/include/qemu/object.h b/include/qemu/object.h
index 597a2f6..9c49d99 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -33,7 +33,7 @@ typedef struct TypeInfo TypeInfo;
 typedef struct InterfaceClass InterfaceClass;
 typedef struct InterfaceInfo InterfaceInfo;
 
-#define TYPE_OBJECT NULL
+#define TYPE_OBJECT "object"
 
 /**
  * SECTION:object.h
diff --git a/qom/object.c b/qom/object.c
index e66d3ab..88ec417 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -210,7 +210,7 @@ static void type_class_interface_init(TypeImpl *ti, InterfaceImpl *iface)
 
 static void type_initialize(TypeImpl *ti)
 {
-    size_t class_size = sizeof(ObjectClass);
+    TypeImpl *parent;
     int i;
 
     if (ti->class) {
@@ -221,30 +221,24 @@ static void type_initialize(TypeImpl *ti)
     ti->instance_size = type_object_get_size(ti);
 
     ti->class = g_malloc0(ti->class_size);
-    ti->class->type = ti;
-
-    if (type_has_parent(ti)) {
-        TypeImpl *parent = type_get_parent(ti);
 
+    parent = type_get_parent(ti);
+    if (parent) {
         type_initialize(parent);
 
-        class_size = parent->class_size;
         g_assert(parent->class_size <= ti->class_size);
+        memcpy(ti->class, parent->class, parent->class_size);
+    }
 
-        memcpy((void *)ti->class + sizeof(ObjectClass),
-               (void *)parent->class + sizeof(ObjectClass),
-               parent->class_size - sizeof(ObjectClass));
+    ti->class->type = ti;
 
-        while (parent) {
-            if (parent->class_base_init) {
-                parent->class_base_init(ti->class, ti->class_data);
-            }
-            parent = type_get_parent(parent);
+    while (parent) {
+        if (parent->class_base_init) {
+            parent->class_base_init(ti->class, ti->class_data);
         }
+        parent = type_get_parent(parent);
     }
 
-    memset((void *)ti->class + class_size, 0, ti->class_size - class_size);
-
     for (i = 0; i < ti->num_interfaces; i++) {
         type_class_interface_init(ti, &ti->interfaces[i]);
     }
@@ -467,19 +461,6 @@ Object *object_dynamic_cast(Object *obj, const char *typename)
 }
 
 
-static void register_types(void)
-{
-    static TypeInfo interface_info = {
-        .name = TYPE_INTERFACE,
-        .instance_size = sizeof(Interface),
-        .abstract = true,
-    };
-
-    type_interface = type_register_static(&interface_info);
-}
-
-type_init(register_types)
-
 Object *object_dynamic_cast_assert(Object *obj, const char *typename)
 {
     Object *inst;
@@ -1216,3 +1197,23 @@ void object_property_add_str(Object *obj, const char *name,
                         property_release_str,
                         prop, errp);
 }
+
+static void register_types(void)
+{
+    static TypeInfo interface_info = {
+        .name = TYPE_INTERFACE,
+        .instance_size = sizeof(Interface),
+        .abstract = true,
+    };
+
+    static TypeInfo object_info = {
+        .name = TYPE_OBJECT,
+        .instance_size = sizeof(Object),
+        .abstract = true,
+    };
+
+    type_interface = type_register_static(&interface_info);
+    type_register_static(&object_info);
+}
+
+type_init(register_types)
-- 
1.7.9.3

  parent reply	other threads:[~2012-05-02 11:31 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-02 11:30 [Qemu-devel] [PATCH 00/21] qbus QOM conversion, rebased on top of my patches Paolo Bonzini
2012-05-02 11:30 ` [Qemu-devel] [PATCH 01/21] qom: documentation addition Paolo Bonzini
2012-05-02 11:59   ` Andreas Färber
2012-05-11  2:08     ` Andreas Färber
2012-05-02 11:30 ` [Qemu-devel] [PATCH 02/21] qom: add object_class_get_parent Paolo Bonzini
2012-05-02 12:21   ` Andreas Färber
2012-05-11  2:25     ` Andreas Färber
2012-05-02 11:30 ` [Qemu-devel] [PATCH 03/21] qom: add class_base_init Paolo Bonzini
2012-05-14 21:34   ` Andreas Färber
2012-05-02 11:30 ` Paolo Bonzini [this message]
2012-05-16  8:16   ` [Qemu-devel] [PATCH 04/21] qom: make Object a type Andreas Färber
2012-05-23 16:53     ` Andreas Färber
2012-05-02 11:30 ` [Qemu-devel] [PATCH 05/21] qom: assert that public types have a non-NULL parent field Paolo Bonzini
2012-05-02 12:35   ` Andreas Färber
2012-05-23 17:01     ` Andreas Färber
2012-05-02 11:30 ` [Qemu-devel] [PATCH 06/21] qdev: push "type" property up to Object Paolo Bonzini
2012-05-23 17:06   ` Andreas Färber
2012-05-23 17:18     ` Paolo Bonzini
2012-05-23 17:40       ` Andreas Färber
2012-05-23 18:00         ` Paolo Bonzini
2012-05-02 11:30 ` [Qemu-devel] [PATCH 07/21] qdev: fix -device foo,? Paolo Bonzini
2012-05-11 14:03   ` Andreas Färber
2012-05-14 20:11   ` Anthony Liguori
2012-05-02 11:31 ` [Qemu-devel] [PATCH 08/21] qdev: use object_property_print in info qtree Paolo Bonzini
2012-05-11 14:20   ` Andreas Färber
2012-05-11 14:45     ` Paolo Bonzini
2012-05-12  0:23       ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 09/21] qdev: move bus properties to a separate global Paolo Bonzini
2012-05-23 23:39   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 10/21] qdev: do not propagate properties to subclasses Paolo Bonzini
2012-05-23 23:46   ` Andreas Färber
2012-05-24  1:34     ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 11/21] qdev: move bus properties to abstract superclasses Paolo Bonzini
2012-05-02 12:29   ` Anthony Liguori
2012-05-02 13:21     ` Paolo Bonzini
2012-05-02 20:00       ` Anthony Liguori
2012-05-02 21:50         ` Paolo Bonzini
2012-05-03 12:45           ` Anthony Liguori
2012-05-03 12:56             ` Paolo Bonzini
2012-05-02 11:31 ` [Qemu-devel] [PATCH 12/21] pc: add back PCI.rombar compat property Paolo Bonzini
2012-05-02 11:38   ` Michael S. Tsirkin
2012-05-02 11:41     ` Paolo Bonzini
2012-05-02 11:44       ` Michael S. Tsirkin
2012-05-02 11:31 ` [Qemu-devel] [PATCH 13/21] qdev: clean up global properties Paolo Bonzini
2012-05-24 16:27   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 14/21] qdev: remove qdev_prop_set_defaults Paolo Bonzini
2012-05-02 12:30   ` Anthony Liguori
2012-05-24 16:30     ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 15/21] qdev: fix adding of ptr properties Paolo Bonzini
2012-05-12 12:34   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 16/21] qdev: use wrapper for qdev_get_path Paolo Bonzini
2012-05-24 16:31   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 17/21] qdev: move sysbus initialization to sysbus.c Paolo Bonzini
2012-05-24 16:32   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 18/21] qdev: convert busses to QEMU Object Model Paolo Bonzini
2012-05-24 16:48   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 19/21] qdev: connect busses with their parent devices Paolo Bonzini
2012-05-24 16:49   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 20/21] qbus: make child devices links Paolo Bonzini
2012-05-24 16:51   ` Andreas Färber
2012-05-02 11:31 ` [Qemu-devel] [PATCH 21/21] qbus: initialize in standard way Paolo Bonzini
2012-05-24 16:52   ` Andreas Färber
2012-05-04 16:15 ` [Qemu-devel] [PATCH 00/21] qbus QOM conversion, rebased on top of my patches Paolo Bonzini
2012-05-23 15:43 ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1335958273-769-5-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=afaerber@suse.de \
    --cc=aliguori@us.ibm.com \
    --cc=liwp@linux.vnet.ibm.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).