| /* | |
| * 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 "qemu/osdep.h" | |
| #include "qemu/queue.h" | |
| #include "qemu/lockable.h" | |
| #include "threadinfo.h" | |
| QemuMutex migration_threads_lock; | |
| static QLIST_HEAD(, MigrationThread) migration_threads; | |
| static void __attribute__((constructor)) migration_threads_init(void) | |
| { | |
| qemu_mutex_init(&migration_threads_lock); | |
| } | |
| MigrationThread *migration_threads_add(const char *name, int thread_id) | |
| { | |
| MigrationThread *thread = g_new0(MigrationThread, 1); | |
| thread->name = name; | |
| thread->thread_id = thread_id; | |
| WITH_QEMU_LOCK_GUARD(&migration_threads_lock) { | |
| QLIST_INSERT_HEAD(&migration_threads, thread, node); | |
| } | |
| return thread; | |
| } | |
| void migration_threads_remove(MigrationThread *thread) | |
| { | |
| QEMU_LOCK_GUARD(&migration_threads_lock); | |
| if (thread) { | |
| QLIST_REMOVE(thread, node); | |
| g_free(thread); | |
| } | |
| } | |
| 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; | |
| } |