Patchwork [v2,00/27] next steps for qdev & QOM

login
register
mail settings
Submitter Paolo Bonzini
Date Feb. 7, 2012, 1:20 p.m.
Message ID <1328620852-17883-1-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/139920/
State New
Headers show

Pull-request

git://github.com/bonzini/qemu.git qdev-props-for-anthony

Comments

Paolo Bonzini - Feb. 7, 2012, 1:20 p.m.
Hi Anthony,

I fixed the two nits you found (static in the middle of the file,
and *strchr) and dropped the OMAP patches for now to give more time
to Peter and Andrzej.  I also fixed object_dynamic_cast with TYPE_OBJECT
as the target.  With this fix, you can actually browse the OMAP clocks
with qom-list.  The fix requires no changes in the OMAP patches.

The following changes since commit c9344f2220ec9878493af5a39b7f0f337e58123a:

  Fix build breakage from last commit. (2012-02-03 11:22:35 -0600)

are available in the git repository at:
  git://github.com/bonzini/qemu.git qdev-props-for-anthony

I'm attaching the interdiff between v2 and v3.  Thanks for the quick
review!

Paolo

Paolo Bonzini (25):
      qom: clean up cast macros
      qom: more documentation on subclassing
      qom: clean up/optimize object_dynamic_cast
      qom: avoid useless conversions from string to type
      qom: do not include qdev header file
      qom: add QObject-based property get/set wrappers
      qom: add property get/set wrappers for C types
      qom: fix off-by-one
      qom: add object_resolve_path_type
      qom: use object_resolve_path_type for links
      qom: fix canonical paths vs. interfaces
      qom: add property get/set wrappers for links
      qdev: remove direct calls to print/parse
      qdev: allow reusing get/set for legacy property
      qdev: remove parse method for string properties
      qdev: remove print/parse methods from LostTickPolicy properties
      qdev: remove parse/print methods for mac properties
      qdev: make the non-legacy pci address property accept an integer
      qdev: remove parse/print methods for pointer properties
      qdev: let QOM free properties
      qdev: fix off-by-one
      qdev: access properties via QOM
      qdev: inline qdev_prop_set into qdev_prop_set_ptr
      qdev: initialize properties via QOM
      qdev: remove unused fields from PropertyInfo

 hw/qdev-addr.c             |    7 +-
 hw/qdev-monitor.c          |   30 ++--
 hw/qdev-properties.c       |  510 ++++++++++++++++++++++----------------------
 hw/qdev.c                  |   32 ++--
 hw/qdev.h                  |   39 +---
 include/qemu/object.h      |  217 ++++++++++++++++++-
 include/qemu/qom-qobject.h |   42 ++++
 qemu-common.h              |    1 +
 qerror.c                   |    4 +
 qerror.h                   |    3 +
 qmp.c                      |   18 +--
 qom/Makefile               |    2 +-
 qom/object.c               |  263 ++++++++++++++++++-----
 qom/qom-qobject.c          |   44 ++++
 14 files changed, 810 insertions(+), 402 deletions(-)
 create mode 100644 include/qemu/qom-qobject.h
 create mode 100644 qom/qom-qobject.c

Patch

diff --git a/qom/object.c b/qom/object.c
index e92d4a6..aa7e038 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -69,6 +69,8 @@  typedef struct Interface
 
 #define INTERFACE(obj) OBJECT_CHECK(Interface, obj, TYPE_INTERFACE)
 
+static Type type_interface;
+
 static GHashTable *type_table_get(void)
 {
     static GHashTable *type_table;
@@ -374,11 +376,9 @@  void object_delete(Object *obj)
     g_free(obj);
 }
 
-static Type type_interface;
-
-static bool object_is_type(Object *obj, TypeImpl *target_type)
+static bool type_is_ancestor(TypeImpl *type, TypeImpl *target_type)
 {
-    TypeImpl *type = obj->class->type;
+    assert(target_type);
 
     /* Check if typename is a direct ancestor of type */
     while (type) {
@@ -392,21 +392,28 @@  static bool object_is_type(Object *obj, TypeImpl *target_type)
     return false;
 }
 
+static bool object_is_type(Object *obj, TypeImpl *target_type)
+{
+    return !target_type || type_is_ancestor(obj->class->type, target_type);
+}
+
 Object *object_dynamic_cast(Object *obj, const char *typename)
 {
     TypeImpl *target_type = type_get_by_name(typename);
     GSList *i;
 
-    /* Check if typename is a direct ancestor */
-    if (object_is_type(obj, target_type)) {
+    /* Check if typename is a direct ancestor.  Special-case TYPE_OBJECT,
+     * we want to go back from interfaces to the parent.
+     */
+    if (target_type && object_is_type(obj, target_type)) {
         return obj;
     }
 
     /* Check if obj is an interface and its containing object is a direct
      * ancestor of typename.  In principle we could do this test at the very
      * beginning of object_dynamic_cast, avoiding a second call to
      * object_is_type.  However, casting between interfaces is relatively
-     * rare, and object_is_type(obj, TYPE_INTERFACE) would fail almost always.
+     * rare, and object_is_type(obj, type_interface) would fail almost always.
      *
      * Perhaps we could add a magic value to the object header for increased
      * (run-time) type safety and to speed up tests like this one.  If we ever
@@ -420,6 +427,10 @@  Object *object_dynamic_cast(Object *obj, const char *typename)
         }
     }
 
+    if (!target_type) {
+        return obj;
+    }
+
     /* Check if obj has an interface of typename */
     for (i = obj->interfaces; i; i = i->next) {
         Interface *iface = i->data;
@@ -873,8 +884,8 @@  static void object_set_link_property(Object *obj, Visitor *v, void *opaque,
     if (strcmp(path, "") != 0) {
         Object *target;
 
-        target_type = g_strdup(&type[5]);
-        *strchr(target_type, '>') = 0;
+        /* Go from link<FOO> to FOO.  */
+        target_type = g_strndup(&type[5], strlen(type) - 6);
         target = object_resolve_path_type(path, target_type, &ambiguous);
 
         if (ambiguous) {