From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:59759) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJT2u-0002kv-Px for qemu-devel@nongnu.org; Wed, 03 Oct 2012 13:47:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TJT2s-0006TO-Um for qemu-devel@nongnu.org; Wed, 03 Oct 2012 13:47:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53078) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJT2s-0006Sq-J0 for qemu-devel@nongnu.org; Wed, 03 Oct 2012 13:47:42 -0400 From: Eduardo Habkost Date: Wed, 3 Oct 2012 14:48:38 -0300 Message-Id: <1349286518-28123-7-git-send-email-ehabkost@redhat.com> In-Reply-To: <1349286518-28123-1-git-send-email-ehabkost@redhat.com> References: <1349286518-28123-1-git-send-email-ehabkost@redhat.com> Subject: [Qemu-devel] [PATCH 6/6] qdev: set globals on post_init() function List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Anthony Liguori , Igor Mammedov This way, properties registerd in the instance_init() function of children classes will be handled properly by qdev_prop_set_globals(), too. Includes a new unit test for the new functionality. Signed-off-by: Eduardo Habkost --- hw/qdev.c | 9 ++- tests/Makefile | 4 +- tests/test-qdev-global-prop.c | 109 ------------------------- tests/test-qdev-global-props.c | 178 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+), 113 deletions(-) delete mode 100644 tests/test-qdev-global-prop.c create mode 100644 tests/test-qdev-global-props.c diff --git a/hw/qdev.c b/hw/qdev.c index 9e73655..68c5ccb 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -591,12 +591,16 @@ static void device_initfn(Object *obj) } class = object_class_get_parent(class); } while (class != object_class_by_name(TYPE_DEVICE)); - qdev_prop_set_globals(dev); - object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, (Object **)&dev->parent_bus, NULL); } +static void device_post_init(Object *obj) +{ + DeviceState *dev = DEVICE(obj); + qdev_prop_set_globals(dev); +} + /* Unlink device from bus and free the structure. */ static void device_finalize(Object *obj) { @@ -659,6 +663,7 @@ static TypeInfo device_type_info = { .parent = TYPE_OBJECT, .instance_size = sizeof(DeviceState), .instance_init = device_initfn, + .instance_post_init = device_post_init, .instance_finalize = device_finalize, .class_base_init = device_class_base_init, .abstract = true, diff --git a/tests/Makefile b/tests/Makefile index 2433be7..9f86162 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,7 +15,7 @@ check-unit-y += tests/test-string-output-visitor$(EXESUF) check-unit-y += tests/test-coroutine$(EXESUF) check-unit-y += tests/test-visitor-serialization$(EXESUF) check-unit-y += tests/test-iov$(EXESUF) -check-unit-y += tests/test-qdev-global-prop$(EXESUF) +check-unit-y += tests/test-qdev-global-props$(EXESUF) check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh @@ -51,7 +51,7 @@ tests/check-qfloat$(EXESUF): tests/check-qfloat.o qfloat.o $(tools-obj-y) tests/check-qjson$(EXESUF): tests/check-qjson.o $(qobject-obj-y) $(tools-obj-y) tests/test-coroutine$(EXESUF): tests/test-coroutine.o $(coroutine-obj-y) $(tools-obj-y) tests/test-iov$(EXESUF): tests/test-iov.o iov.o -tests/test-qdev-global-prop$(EXESUF): tests/test-qdev-global-prop.o \ +tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \ hw/qdev.o hw/qdev-properties.o \ $(test-qapi-obj-y) $(qom-obj-y) \ qemu-option.o \ diff --git a/tests/test-qdev-global-prop.c b/tests/test-qdev-global-prop.c deleted file mode 100644 index 4c50156..0000000 --- a/tests/test-qdev-global-prop.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Test code for qdev global-properties handling - * - * Copyright (c) 2012 Red Hat Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include - -#include "hw/qdev.h" - - -#define TYPE_STATIC_PROPS "static_prop_type" -#define STATIC_TYPE(obj) \ - OBJECT_CHECK(MyType, (obj), TYPE_STATIC_PROPS) - -#define PROP_DEFAULT 100 - -typedef struct MyType { - DeviceState parent_obj; - - uint32_t prop1, prop2, prop3; -} MyType; - -static Property static_props[] = { - DEFINE_PROP_UINT32("prop1", MyType, prop1, PROP_DEFAULT), - DEFINE_PROP_UINT32("prop2", MyType, prop2, PROP_DEFAULT), - DEFINE_PROP_END_OF_LIST(), -}; - -static int mytype_init(DeviceState *dev) -{ - return 0; -} - -static void static_prop_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - dc->props = static_props; - dc->init = mytype_init; -} - -static TypeInfo static_prop_type = { - .name = TYPE_STATIC_PROPS, - .parent = TYPE_DEVICE, - .instance_size = sizeof(MyType), - .class_init = static_prop_class_init, -}; - -/* Test simple static property setting to default value */ -static void test_static_prop(void) -{ - MyType *mt; - - mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS)); - qdev_init_nofail(DEVICE(mt)); - - g_assert_cmpuint(mt->prop1, ==, PROP_DEFAULT); -} - -/* Test setting of static property using global properties */ -static void test_static_globalprop(void) -{ - MyType *mt; - GlobalProperty props[] = { - {TYPE_STATIC_PROPS, "prop1", "200"}, - {} - }; - qdev_prop_register_global_list(props); - - mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS)); - qdev_init_nofail(DEVICE(mt)); - - g_assert_cmpuint(mt->prop1, ==, 200); - g_assert_cmpuint(mt->prop2, ==, PROP_DEFAULT); -} - -int main(int argc, char **argv) -{ - module_call_init(MODULE_INIT_QOM); - type_register_static(&static_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_run(); - - return 0; -} diff --git a/tests/test-qdev-global-props.c b/tests/test-qdev-global-props.c new file mode 100644 index 0000000..29f602c --- /dev/null +++ b/tests/test-qdev-global-props.c @@ -0,0 +1,178 @@ +/* + * Test code for qdev global-properties handling + * + * Copyright (c) 2012 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +#include "hw/qdev.h" +#include "qemu/object.h" +#include "qapi/qapi-visit-core.h" + + +#define TYPE_STATIC_PROPS "static_prop_type" +#define STATIC_TYPE(obj) \ + OBJECT_CHECK(MyType, (obj), TYPE_STATIC_PROPS) + +#define PROP_DEFAULT 100 + +typedef struct MyType { + DeviceState parent_obj; + + uint32_t prop1, prop2, prop3; +} MyType; + +static Property static_props[] = { + DEFINE_PROP_UINT32("prop1", MyType, prop1, PROP_DEFAULT), + DEFINE_PROP_UINT32("prop2", MyType, prop2, PROP_DEFAULT), + DEFINE_PROP_END_OF_LIST(), +}; + +static int mytype_init(DeviceState *dev) +{ + return 0; +} + +static void static_prop_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + dc->props = static_props; + dc->init = mytype_init; +} + +static TypeInfo static_prop_type = { + .name = TYPE_STATIC_PROPS, + .parent = TYPE_DEVICE, + .instance_size = sizeof(MyType), + .class_init = static_prop_class_init, +}; + +/* Test simple static property setting to default value */ +static void test_static_prop(void) +{ + MyType *mt; + + mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS)); + qdev_init_nofail(DEVICE(mt)); + + g_assert_cmpuint(mt->prop1, ==, PROP_DEFAULT); +} + +/* Test setting of static property using global properties */ +static void test_static_globalprop(void) +{ + MyType *mt; + static GlobalProperty props[] = { + {TYPE_STATIC_PROPS, "prop1", "200"}, + {} + }; + qdev_prop_register_global_list(props); + + mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS)); + qdev_init_nofail(DEVICE(mt)); + + g_assert_cmpuint(mt->prop1, ==, 200); + 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"}, + {} + }; + 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(); + + return 0; +} -- 1.7.11.4