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
13*01ec0f3aSFabiano Rosas #include "qemu/osdep.h"
14*01ec0f3aSFabiano Rosas #include "qemu/queue.h"
15*01ec0f3aSFabiano Rosas #include "qemu/lockable.h"
1667132620SJiang Jiacheng #include "threadinfo.h"
1767132620SJiang Jiacheng
18*01ec0f3aSFabiano Rosas QemuMutex migration_threads_lock;
1967132620SJiang Jiacheng static QLIST_HEAD(, MigrationThread) migration_threads;
2067132620SJiang Jiacheng
migration_threads_init(void)21*01ec0f3aSFabiano Rosas static void __attribute__((constructor)) migration_threads_init(void)
22*01ec0f3aSFabiano Rosas {
23*01ec0f3aSFabiano Rosas qemu_mutex_init(&migration_threads_lock);
24*01ec0f3aSFabiano Rosas }
25*01ec0f3aSFabiano 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
32*01ec0f3aSFabiano Rosas WITH_QEMU_LOCK_GUARD(&migration_threads_lock) {
3367132620SJiang Jiacheng QLIST_INSERT_HEAD(&migration_threads, thread, node);
34*01ec0f3aSFabiano 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 {
41*01ec0f3aSFabiano 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
54*01ec0f3aSFabiano 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