Message ID | 1373486922-24209-3-git-send-email-ehabkost@redhat.com |
---|---|
State | New |
Headers | show |
On Wed, 10 Jul 2013 17:08:41 -0300 Eduardo Habkost <ehabkost@redhat.com> wrote: > This will allow classes to specify a function to be called after all > instance_init() functions were called. > > This will be used by DeviceState to call qdev_prop_set_globals() at the > right moment. > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > --- > include/qom/object.h | 3 +++ > qom/object.c | 14 ++++++++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/include/qom/object.h b/include/qom/object.h > index 23fc048..1a54f64 100644 > --- a/include/qom/object.h > +++ b/include/qom/object.h > @@ -398,6 +398,8 @@ struct Object > * @instance_init: This function is called to initialize an object. The parent > * class will have already been initialized so the type is only responsible > * for initializing its own members. > + * @instance_post_init: This function is called to finish initialization of > + * an object, after all instance_init functions were called. > * @instance_finalize: This function is called during object destruction. This > * is called before the parent @instance_finalize function has been called. > * An object should only free the members that are unique to its type in this > @@ -433,6 +435,7 @@ struct TypeInfo [...] > > +static void object_post_init_with_type(Object *obj, TypeImpl *ti) > +{ > + if (ti->instance_post_init) { > + ti->instance_post_init(obj); > + } > + > + if (type_has_parent(ti)) { > + object_post_init_with_type(obj, type_get_parent(ti)); > + } Is there a reason why post init called in opposite order than instance_init() ? > +} > + > void object_initialize_with_type(void *data, TypeImpl *type) > { > Object *obj = data; > @@ -313,6 +326,7 @@ void object_initialize_with_type(void *data, TypeImpl *type) > object_ref(obj); > QTAILQ_INIT(&obj->properties); > object_init_with_type(obj, type); > + object_post_init_with_type(obj, type); > } > > void object_initialize(void *data, const char *typename)
On Thu, Jul 11, 2013 at 08:29:15AM +0200, Igor Mammedov wrote: > On Wed, 10 Jul 2013 17:08:41 -0300 > Eduardo Habkost <ehabkost@redhat.com> wrote: > > > This will allow classes to specify a function to be called after all > > instance_init() functions were called. > > > > This will be used by DeviceState to call qdev_prop_set_globals() at the > > right moment. > > > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > > --- > > include/qom/object.h | 3 +++ > > qom/object.c | 14 ++++++++++++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/include/qom/object.h b/include/qom/object.h > > index 23fc048..1a54f64 100644 > > --- a/include/qom/object.h > > +++ b/include/qom/object.h > > @@ -398,6 +398,8 @@ struct Object > > * @instance_init: This function is called to initialize an object. The parent > > * class will have already been initialized so the type is only responsible > > * for initializing its own members. > > + * @instance_post_init: This function is called to finish initialization of > > + * an object, after all instance_init functions were called. > > * @instance_finalize: This function is called during object destruction. This > > * is called before the parent @instance_finalize function has been called. > > * An object should only free the members that are unique to its type in this > > @@ -433,6 +435,7 @@ struct TypeInfo > [...] > > > > +static void object_post_init_with_type(Object *obj, TypeImpl *ti) > > +{ > > + if (ti->instance_post_init) { > > + ti->instance_post_init(obj); > > + } > > + > > + if (type_has_parent(ti)) { > > + object_post_init_with_type(obj, type_get_parent(ti)); > > + } > Is there a reason why post init called in opposite order than > instance_init() ? Because it seems more useful: if parent types want to initialize something before subclasses, they can use instance_init(). If they want to initialize something _after_ subclasses, then they can use instance_post_init(). > > > +} > > + > > void object_initialize_with_type(void *data, TypeImpl *type) > > { > > Object *obj = data; > > @@ -313,6 +326,7 @@ void object_initialize_with_type(void *data, TypeImpl *type) > > object_ref(obj); > > QTAILQ_INIT(&obj->properties); > > object_init_with_type(obj, type); > > + object_post_init_with_type(obj, type); > > } > > > > void object_initialize(void *data, const char *typename) >
diff --git a/include/qom/object.h b/include/qom/object.h index 23fc048..1a54f64 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -398,6 +398,8 @@ struct Object * @instance_init: This function is called to initialize an object. The parent * class will have already been initialized so the type is only responsible * for initializing its own members. + * @instance_post_init: This function is called to finish initialization of + * an object, after all instance_init functions were called. * @instance_finalize: This function is called during object destruction. This * is called before the parent @instance_finalize function has been called. * An object should only free the members that are unique to its type in this @@ -433,6 +435,7 @@ struct TypeInfo size_t instance_size; void (*instance_init)(Object *obj); + void (*instance_post_init)(Object *obj); void (*instance_finalize)(Object *obj); bool abstract; diff --git a/qom/object.c b/qom/object.c index b2479d1..74fd241 100644 --- a/qom/object.c +++ b/qom/object.c @@ -51,6 +51,7 @@ struct TypeImpl void *class_data; void (*instance_init)(Object *obj); + void (*instance_post_init)(Object *obj); void (*instance_finalize)(Object *obj); bool abstract; @@ -111,6 +112,7 @@ static TypeImpl *type_register_internal(const TypeInfo *info) ti->class_data = info->class_data; ti->instance_init = info->instance_init; + ti->instance_post_init = info->instance_post_init; ti->instance_finalize = info->instance_finalize; ti->abstract = info->abstract; @@ -298,6 +300,17 @@ static void object_init_with_type(Object *obj, TypeImpl *ti) } } +static void object_post_init_with_type(Object *obj, TypeImpl *ti) +{ + if (ti->instance_post_init) { + ti->instance_post_init(obj); + } + + if (type_has_parent(ti)) { + object_post_init_with_type(obj, type_get_parent(ti)); + } +} + void object_initialize_with_type(void *data, TypeImpl *type) { Object *obj = data; @@ -313,6 +326,7 @@ void object_initialize_with_type(void *data, TypeImpl *type) object_ref(obj); QTAILQ_INIT(&obj->properties); object_init_with_type(obj, type); + object_post_init_with_type(obj, type); } void object_initialize(void *data, const char *typename)
This will allow classes to specify a function to be called after all instance_init() functions were called. This will be used by DeviceState to call qdev_prop_set_globals() at the right moment. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- include/qom/object.h | 3 +++ qom/object.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+)