Commit 7746abd8 authored by Daniel P. Berrangé's avatar Daniel P. Berrangé Committed by Andreas Färber
Browse files

qom: Change object property iterator API contract



Currently the ObjectProperty iterator API works as follows:

  ObjectPropertyIterator *iter;

  iter = object_property_iter_init(obj);
  while ((prop = object_property_iter_next(iter))) {
     ...
  }
  object_property_iter_free(iter);

This has the benefit that the ObjectPropertyIterator struct
can be opaque, but has the downside that callers need to
explicitly call a free function. It is also not in keeping
with iterator style used elsewhere in QEMU/GLib2.

This patch changes the API to use stack allocation instead:

  ObjectPropertyIterator iter;

  object_property_iter_init(&iter, obj);
  while ((prop = object_property_iter_next(&iter))) {
     ...
  }

Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Signed-off-by: default avatarDaniel P. Berrange <berrange@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
[AF: Fused ObjectPropertyIterator struct with typedef]
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent 16bf7f52
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -684,7 +684,7 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
{
    Object *root_container;
    ObjectProperty *prop;
    ObjectPropertyIterator *iter;
    ObjectPropertyIterator iter;
    uint32_t drc_count = 0;
    GArray *drc_indexes, *drc_power_domains;
    GString *drc_names, *drc_types;
@@ -708,8 +708,8 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
     */
    root_container = container_get(object_get_root(), DRC_CONTAINER_PATH);

    iter = object_property_iter_init(root_container);
    while ((prop = object_property_iter_next(iter))) {
    object_property_iter_init(&iter, root_container);
    while ((prop = object_property_iter_next(&iter))) {
        Object *obj;
        sPAPRDRConnector *drc;
        sPAPRDRConnectorClass *drck;
@@ -750,7 +750,6 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
                                    spapr_drc_get_type_str(drc->type));
        drc_types = g_string_insert_len(drc_types, -1, "\0", 1);
    }
    object_property_iter_free(iter);

    /* now write the drc count into the space we reserved at the
     * beginning of the arrays previously
+14 −16
Original line number Diff line number Diff line
@@ -966,7 +966,10 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
                                           Error **errp);

typedef struct ObjectPropertyIterator ObjectPropertyIterator;
typedef struct ObjectPropertyIterator {
    ObjectClass *nextclass;
    GHashTableIter iter;
} ObjectPropertyIterator;

/**
 * object_property_iter_init:
@@ -984,32 +987,27 @@ typedef struct ObjectPropertyIterator ObjectPropertyIterator;
 *   <title>Using object property iterators</title>
 *   <programlisting>
 *   ObjectProperty *prop;
 *   ObjectPropertyIterator *iter;
 *   ObjectPropertyIterator iter;
 *
 *   iter = object_property_iter_init(obj);
 *   while ((prop = object_property_iter_next(iter))) {
 *   object_property_iter_init(&iter, obj);
 *   while ((prop = object_property_iter_next(&iter))) {
 *     ... do something with prop ...
 *   }
 *   object_property_iter_free(iter);
 *   </programlisting>
 * </example>
 *
 * Returns: the new iterator
 */
ObjectPropertyIterator *object_property_iter_init(Object *obj);

/**
 * object_property_iter_free:
 * @iter: the iterator instance
 *
 * Releases any resources associated with the iterator.
 */
void object_property_iter_free(ObjectPropertyIterator *iter);
void object_property_iter_init(ObjectPropertyIterator *iter,
                               Object *obj);

/**
 * object_property_iter_next:
 * @iter: the iterator instance
 *
 * Return the next available property. If no further properties
 * are available, a %NULL value will be returned and the @iter
 * pointer should not be used again after this point without
 * re-initializing it.
 *
 * Returns: the next property, or %NULL when all properties
 * have been traversed.
 */
+3 −4
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
    Error *local_err = NULL;
    char *str, *info;
    ObjectProperty *prop;
    ObjectPropertyIterator *iter;
    ObjectPropertyIterator iter;
    StringOutputVisitor *ov;

    if (!nf->netdev_id) {
@@ -174,8 +174,8 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
    QTAILQ_INSERT_TAIL(&nf->netdev->filters, nf, next);

    /* generate info str */
    iter = object_property_iter_init(OBJECT(nf));
    while ((prop = object_property_iter_next(iter))) {
    object_property_iter_init(&iter, OBJECT(nf));
    while ((prop = object_property_iter_next(&iter))) {
        if (!strcmp(prop->name, "type")) {
            continue;
        }
@@ -189,7 +189,6 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
        g_free(str);
        g_free(info);
    }
    object_property_iter_free(iter);
}

static void netfilter_finalize(Object *obj)
+6 −8
Original line number Diff line number Diff line
@@ -210,7 +210,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
    bool ambiguous = false;
    ObjectPropertyInfoList *props = NULL;
    ObjectProperty *prop;
    ObjectPropertyIterator *iter;
    ObjectPropertyIterator iter;

    obj = object_resolve_path(path, &ambiguous);
    if (obj == NULL) {
@@ -223,8 +223,8 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
        return NULL;
    }

    iter = object_property_iter_init(obj);
    while ((prop = object_property_iter_next(iter))) {
    object_property_iter_init(&iter, obj);
    while ((prop = object_property_iter_next(&iter))) {
        ObjectPropertyInfoList *entry = g_malloc0(sizeof(*entry));

        entry->value = g_malloc0(sizeof(ObjectPropertyInfo));
@@ -234,7 +234,6 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
        entry->value->name = g_strdup(prop->name);
        entry->value->type = g_strdup(prop->type);
    }
    object_property_iter_free(iter);

    return props;
}
@@ -506,7 +505,7 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
    ObjectClass *klass;
    Object *obj;
    ObjectProperty *prop;
    ObjectPropertyIterator *iter;
    ObjectPropertyIterator iter;
    DevicePropertyInfoList *prop_list = NULL;

    klass = object_class_by_name(typename);
@@ -535,8 +534,8 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,

    obj = object_new(typename);

    iter = object_property_iter_init(obj);
    while ((prop = object_property_iter_next(iter))) {
    object_property_iter_init(&iter, obj);
    while ((prop = object_property_iter_next(&iter))) {
        DevicePropertyInfo *info;
        DevicePropertyInfoList *entry;

@@ -567,7 +566,6 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
        entry->next = prop_list;
        prop_list = entry;
    }
    object_property_iter_free(iter);

    object_unref(obj);

+4 −18
Original line number Diff line number Diff line
@@ -67,11 +67,6 @@ struct TypeImpl
    InterfaceImpl interfaces[MAX_INTERFACES];
};

struct ObjectPropertyIterator {
    ObjectClass *nextclass;
    GHashTableIter iter;
};

static Type type_interface;

static GHashTable *type_table_get(void)
@@ -999,20 +994,11 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
    return NULL;
}

ObjectPropertyIterator *object_property_iter_init(Object *obj)
void object_property_iter_init(ObjectPropertyIterator *iter,
                               Object *obj)
{
    ObjectPropertyIterator *ret = g_new0(ObjectPropertyIterator, 1);
    g_hash_table_iter_init(&ret->iter, obj->properties);
    ret->nextclass = object_get_class(obj);
    return ret;
}

void object_property_iter_free(ObjectPropertyIterator *iter)
{
    if (!iter) {
        return;
    }
    g_free(iter);
    g_hash_table_iter_init(&iter->iter, obj->properties);
    iter->nextclass = object_get_class(obj);
}

ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
Loading