[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 3/3 v2] qdev: set globals on post_init() function
From: |
Eduardo Habkost |
Subject: |
Re: [Qemu-devel] [RFC 3/3 v2] qdev: set globals on post_init() function |
Date: |
Fri, 12 Jul 2013 11:57:32 -0300 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Thu, Jul 11, 2013 at 08:48:44AM +0200, Igor Mammedov wrote:
[...]
> > #define TYPE_STATIC_PROPS "static_prop_type"
> > @@ -80,7 +82,7 @@ static void test_static_prop(void)
> > static void test_static_globalprop(void)
> > {
> > MyType *mt;
> > - GlobalProperty props[] = {
> > + static GlobalProperty props[] = {
> > {TYPE_STATIC_PROPS, "prop1", "200"},
> > {}
> > };
> hunk belongs to the 1st patch?
Yes, thanks for noticing.
>
> > @@ -93,15 +95,82 @@ static void test_static_globalprop(void)
> > g_assert_cmpuint(mt->prop2, ==, PROP_DEFAULT);
> > }
> >
> > +#define TYPE_DYNAMIC_PROPS "dynamic_prop_type"
> > +#define DYNAMIC_TYPE(obj) \
> > + OBJECT_CHECK(MyType, (obj), TYPE_DYNAMIC_PROPS)
> > +
> > +static void prop1_acessor(Object *obj,
> > + struct Visitor *v,
> > + void *opaque,
> > + const char *name,
> > + struct Error **errp)
> > +{
> > + MyType *mt = DYNAMIC_TYPE(obj);
> > + visit_type_uint32(v, &mt->prop1, name, errp);
> > +}
> > +
> > +static void prop2_acessor(Object *obj,
> > + struct Visitor *v,
> > + void *opaque,
> > + const char *name,
> > + struct Error **errp)
> > +{
> > + MyType *mt = DYNAMIC_TYPE(obj);
> > + visit_type_uint32(v, &mt->prop2, name, errp);
> > +}
> > +
> > +static void dynamic_instance_init(Object *obj)
> > +{
> > + object_property_add(obj, "prop1", "uint32", prop1_acessor,
> > prop1_acessor,
> > + NULL, NULL, NULL);
> > + object_property_add(obj, "prop2", "uint32", prop2_acessor,
> > prop2_acessor,
> > + NULL, NULL, NULL);
> > +}
> > +
> > +static void dynamic_class_init(ObjectClass *klass, void *data)
> > +{
> > + DeviceClass *dc = DEVICE_CLASS(klass);
> > + dc->init = mytype_init;
> > +}
> > +
> > +
> > +static TypeInfo dynamic_prop_type = {
> > + .name = TYPE_DYNAMIC_PROPS,
> > + .parent = TYPE_DEVICE,
> > + .instance_size = sizeof(MyType),
> > + .instance_init = dynamic_instance_init,
> > + .class_init = dynamic_class_init,
> > +};
> > +
> > +/* Test setting of static property using global properties */
> > +static void test_dynamic_globalprop(void)
> > +{
> > + MyType *mt;
> > + static GlobalProperty props[] = {
> > + {TYPE_DYNAMIC_PROPS, "prop1", "101"},
> > + {TYPE_DYNAMIC_PROPS, "prop2", "102"},
> > + {}
> > + };
> this list cloud be the same for static and dynamic tests, no need to duplicate
>
> and perhaps one property is enough, like it's done for static one?
I don't know. I like the fact that both test cases are exercising the
property-setting API in different ways and are likely to catch different
types of bugs.
>
>
> > + qdev_prop_register_global_list(props);
> > +
> > + mt = DYNAMIC_TYPE(object_new(TYPE_DYNAMIC_PROPS));
> > + qdev_init_nofail(DEVICE(mt));
> > +
> > + g_assert_cmpuint(mt->prop1, ==, 101);
> > + g_assert_cmpuint(mt->prop2, ==, 102);
> > +}
> > +
> > int main(int argc, char **argv)
> > {
> > module_call_init(MODULE_INIT_QOM);
> > type_register_static(&static_prop_type);
> > + type_register_static(&dynamic_prop_type);
> >
> > g_test_init(&argc, &argv, NULL);
> >
> > g_test_add_func("/qdev/properties/static/default", test_static_prop);
> > g_test_add_func("/qdev/properties/static/global",
> > test_static_globalprop);
> > + g_test_add_func("/qdev/properties/dynamic/global",
> > test_dynamic_globalprop);
> >
> > g_test_run();
> >
>
--
Eduardo