Message ID | 20241024165627.1372621-4-peterx@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | QOM: Singleton interface | expand |
Peter Xu <peterx@redhat.com> writes: > This makes the migration object a singleton unit. After this, we can do > something slightly tricky later on with the guarantee that nobody will be > able to create the object twice. > > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > migration/migration.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/migration/migration.c b/migration/migration.c > index bcb735869b..1b5285af95 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -45,6 +45,7 @@ > #include "qapi/qmp/qerror.h" > #include "qapi/qmp/qnull.h" > #include "qemu/rcu.h" > +#include "qom/object_interfaces.h" > #include "postcopy-ram.h" > #include "qemu/thread.h" > #include "trace.h" > @@ -3855,11 +3856,19 @@ fail: > migrate_fd_cleanup(s); > } > > +static Object* migration_get_instance(Error **errp) static Object *migration_get_instance(Error **errp) ^ > +{ > + return OBJECT(current_migration); > +} > + > static void migration_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > + SingletonClass *singleton = SINGLETON_CLASS(klass); > > dc->user_creatable = false; > + singleton->get_instance = migration_get_instance; > + > device_class_set_props(dc, migration_properties); > } > > @@ -3932,6 +3941,10 @@ static const TypeInfo migration_type = { > .instance_size = sizeof(MigrationState), > .instance_init = migration_instance_init, > .instance_finalize = migration_instance_finalize, > + .interfaces = (InterfaceInfo[]) { > + { TYPE_SINGLETON }, > + { } > + } > }; > > static void register_migration_types(void)
diff --git a/migration/migration.c b/migration/migration.c index bcb735869b..1b5285af95 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -45,6 +45,7 @@ #include "qapi/qmp/qerror.h" #include "qapi/qmp/qnull.h" #include "qemu/rcu.h" +#include "qom/object_interfaces.h" #include "postcopy-ram.h" #include "qemu/thread.h" #include "trace.h" @@ -3855,11 +3856,19 @@ fail: migrate_fd_cleanup(s); } +static Object* migration_get_instance(Error **errp) +{ + return OBJECT(current_migration); +} + static void migration_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); + SingletonClass *singleton = SINGLETON_CLASS(klass); dc->user_creatable = false; + singleton->get_instance = migration_get_instance; + device_class_set_props(dc, migration_properties); } @@ -3932,6 +3941,10 @@ static const TypeInfo migration_type = { .instance_size = sizeof(MigrationState), .instance_init = migration_instance_init, .instance_finalize = migration_instance_finalize, + .interfaces = (InterfaceInfo[]) { + { TYPE_SINGLETON }, + { } + } }; static void register_migration_types(void)
This makes the migration object a singleton unit. After this, we can do something slightly tricky later on with the guarantee that nobody will be able to create the object twice. Signed-off-by: Peter Xu <peterx@redhat.com> --- migration/migration.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)