The MigrationThread struct is mostly the same as MigrationThreadInfoList,
except that it's a double-linked list so removal doesn't need to remember
prev pointer.
That might not be necessary, especially considering that the defintion of
that struct is the only thing in threadinfo.h now.
Reuse MigrationThreadInfoList, then let's drop the header. Need to manage
a single list entry removal, but after I saw the diff, it's not so bad.
With that, query-migrationthreads is much easier, as we can simply do
QAPI_CLONE() now.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/threadinfo.h | 22 -------------------
migration/migration.c | 1 -
migration/multifd.c | 1 -
migration/threadinfo.c | 50 +++++++++++++++++++++---------------------
4 files changed, 25 insertions(+), 49 deletions(-)
delete mode 100644 migration/threadinfo.h
diff --git a/migration/threadinfo.h b/migration/threadinfo.h
deleted file mode 100644
index 59f334af21..0000000000
--- a/migration/threadinfo.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Migration Threads info
- *
- * Copyright (c) 2022 HUAWEI TECHNOLOGIES CO., LTD.
- *
- * Authors:
- * Jiang Jiacheng <jiangjiacheng@huawei.com>
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- */
-
-#include "qapi/error.h"
-#include "qapi/qapi-commands-migration.h"
-
-typedef struct MigrationThread MigrationThread;
-
-struct MigrationThread {
- const char *name; /* the name of migration thread */
- int thread_id; /* ID of the underlying host thread */
- QLIST_ENTRY(MigrationThread) node;
-};
diff --git a/migration/migration.c b/migration/migration.c
index 04c4272e46..1034668a90 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -57,7 +57,6 @@
#include "net/announce.h"
#include "qemu/queue.h"
#include "multifd.h"
-#include "threadinfo.h"
#include "qemu/yank.h"
#include "sysemu/cpus.h"
#include "yank_functions.h"
diff --git a/migration/multifd.c b/migration/multifd.c
index b96aaffebb..0baa760ccf 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -26,7 +26,6 @@
#include "qemu-file.h"
#include "trace.h"
#include "multifd.h"
-#include "threadinfo.h"
#include "options.h"
#include "qemu/yank.h"
#include "io/channel-file.h"
diff --git a/migration/threadinfo.c b/migration/threadinfo.c
index 73db26dc82..6c1278b4ea 100644
--- a/migration/threadinfo.c
+++ b/migration/threadinfo.c
@@ -13,11 +13,13 @@
#include "qemu/osdep.h"
#include "qemu/queue.h"
#include "qemu/lockable.h"
-#include "threadinfo.h"
#include "migration.h"
+#include "qapi/qapi-commands-migration.h"
+#include "qapi/qapi-visit-migration.h"
+#include "qapi/clone-visitor.h"
QemuMutex migration_threads_lock;
-static QLIST_HEAD(, MigrationThread) migration_threads;
+static MigrationThreadInfoList *migration_threads;
static void __attribute__((constructor)) migration_threads_init(void)
{
@@ -26,31 +28,40 @@ static void __attribute__((constructor)) migration_threads_init(void)
void migration_threads_add(const char *name)
{
- MigrationThread *thread = g_new0(MigrationThread, 1);
+ MigrationThreadInfo *thread = g_new0(MigrationThreadInfo, 1);
- thread->name = name;
+ thread->name = g_strdup(name);
thread->thread_id = qemu_get_thread_id();
WITH_QEMU_LOCK_GUARD(&migration_threads_lock) {
- QLIST_INSERT_HEAD(&migration_threads, thread, node);
+ QAPI_LIST_PREPEND(migration_threads, thread);
}
}
void migration_threads_remove(void)
{
int tid = qemu_get_thread_id();
- MigrationThread *thread;
+ MigrationThreadInfoList *thread, *prev;
QEMU_LOCK_GUARD(&migration_threads_lock);
- QLIST_FOREACH(thread, &migration_threads, node) {
- if (tid != thread->thread_id) {
- continue;
- }
+ prev = NULL;
+ thread = migration_threads;
- QLIST_REMOVE(thread, node);
- g_free(thread);
- return;
+ while (thread) {
+ if (tid == thread->value->thread_id) {
+ if (!prev) {
+ migration_threads = thread->next;
+ } else {
+ prev->next = thread->next;
+ }
+ /* Terminate this single object to not free the rest */
+ thread->next = NULL;
+ qapi_free_MigrationThreadInfoList(thread);
+ return;
+ }
+ prev = thread;
+ thread = thread->next;
}
g_assert_not_reached();
@@ -58,18 +69,7 @@ void migration_threads_remove(void)
MigrationThreadInfoList *qmp_query_migrationthreads(Error **errp)
{
- MigrationThreadInfoList *head = NULL;
- MigrationThreadInfoList **tail = &head;
- MigrationThread *thread = NULL;
-
QEMU_LOCK_GUARD(&migration_threads_lock);
- QLIST_FOREACH(thread, &migration_threads, node) {
- MigrationThreadInfo *info = g_new0(MigrationThreadInfo, 1);
- info->name = g_strdup(thread->name);
- info->thread_id = thread->thread_id;
-
- QAPI_LIST_APPEND(tail, info);
- }
- return head;
+ return QAPI_CLONE(MigrationThreadInfoList, migration_threads);
}
--
2.45.0