diff mbox series

[3/4] migration: Make migration object a singleton object

Message ID 20241024165627.1372621-4-peterx@redhat.com (mailing list archive)
State New
Headers show
Series QOM: Singleton interface | expand

Commit Message

Peter Xu Oct. 24, 2024, 4:56 p.m. UTC
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(+)

Comments

Fabiano Rosas Oct. 24, 2024, 7:20 p.m. UTC | #1
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 mbox series

Patch

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)