Peter Xu <[email protected]> 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 <[email protected]>
> ---
> 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)