xref: /qemu/migration/threadinfo.c (revision 01ec0f3a)
167132620SJiang Jiacheng /*
267132620SJiang Jiacheng  *  Migration Threads info
367132620SJiang Jiacheng  *
467132620SJiang Jiacheng  *  Copyright (c) 2022 HUAWEI TECHNOLOGIES CO., LTD.
567132620SJiang Jiacheng  *
667132620SJiang Jiacheng  *  Authors:
767132620SJiang Jiacheng  *  Jiang Jiacheng <jiangjiacheng@huawei.com>
867132620SJiang Jiacheng  *
967132620SJiang Jiacheng  *  This work is licensed under the terms of the GNU GPL, version 2 or later.
1067132620SJiang Jiacheng  *  See the COPYING file in the top-level directory.
1167132620SJiang Jiacheng  */
1267132620SJiang Jiacheng 
1301ec0f3aSFabiano Rosas #include "qemu/osdep.h"
1401ec0f3aSFabiano Rosas #include "qemu/queue.h"
1501ec0f3aSFabiano Rosas #include "qemu/lockable.h"
1667132620SJiang Jiacheng #include "threadinfo.h"
1767132620SJiang Jiacheng 
1801ec0f3aSFabiano Rosas QemuMutex migration_threads_lock;
1967132620SJiang Jiacheng static QLIST_HEAD(, MigrationThread) migration_threads;
2067132620SJiang Jiacheng 
migration_threads_init(void)2101ec0f3aSFabiano Rosas static void __attribute__((constructor)) migration_threads_init(void)
2201ec0f3aSFabiano Rosas {
2301ec0f3aSFabiano Rosas     qemu_mutex_init(&migration_threads_lock);
2401ec0f3aSFabiano Rosas }
2501ec0f3aSFabiano Rosas 
migration_threads_add(const char * name,int thread_id)26788fa680SFabiano Rosas MigrationThread *migration_threads_add(const char *name, int thread_id)
2767132620SJiang Jiacheng {
2867132620SJiang Jiacheng     MigrationThread *thread =  g_new0(MigrationThread, 1);
2967132620SJiang Jiacheng     thread->name = name;
3067132620SJiang Jiacheng     thread->thread_id = thread_id;
3167132620SJiang Jiacheng 
3201ec0f3aSFabiano Rosas     WITH_QEMU_LOCK_GUARD(&migration_threads_lock) {
3367132620SJiang Jiacheng         QLIST_INSERT_HEAD(&migration_threads, thread, node);
3401ec0f3aSFabiano Rosas     }
3567132620SJiang Jiacheng 
3667132620SJiang Jiacheng     return thread;
3767132620SJiang Jiacheng }
3867132620SJiang Jiacheng 
migration_threads_remove(MigrationThread * thread)39788fa680SFabiano Rosas void migration_threads_remove(MigrationThread *thread)
4067132620SJiang Jiacheng {
4101ec0f3aSFabiano Rosas     QEMU_LOCK_GUARD(&migration_threads_lock);
4267132620SJiang Jiacheng     if (thread) {
4367132620SJiang Jiacheng         QLIST_REMOVE(thread, node);
4467132620SJiang Jiacheng         g_free(thread);
4567132620SJiang Jiacheng     }
4667132620SJiang Jiacheng }
4767132620SJiang Jiacheng 
qmp_query_migrationthreads(Error ** errp)4867132620SJiang Jiacheng MigrationThreadInfoList *qmp_query_migrationthreads(Error **errp)
4967132620SJiang Jiacheng {
5067132620SJiang Jiacheng     MigrationThreadInfoList *head = NULL;
5167132620SJiang Jiacheng     MigrationThreadInfoList **tail = &head;
5267132620SJiang Jiacheng     MigrationThread *thread = NULL;
5367132620SJiang Jiacheng 
5401ec0f3aSFabiano Rosas     QEMU_LOCK_GUARD(&migration_threads_lock);
5567132620SJiang Jiacheng     QLIST_FOREACH(thread, &migration_threads, node) {
5667132620SJiang Jiacheng         MigrationThreadInfo *info = g_new0(MigrationThreadInfo, 1);
5767132620SJiang Jiacheng         info->name = g_strdup(thread->name);
5867132620SJiang Jiacheng         info->thread_id = thread->thread_id;
5967132620SJiang Jiacheng 
6067132620SJiang Jiacheng         QAPI_LIST_APPEND(tail, info);
6167132620SJiang Jiacheng     }
6267132620SJiang Jiacheng 
6367132620SJiang Jiacheng     return head;
6467132620SJiang Jiacheng }
65