mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
qemu-ga: Add interface to traverse the qmp command list by QmpCommand
In the original code, qmp_get_command_list is used to construct a list of all commands' name. To get the information of all qga commands, it traverses the name list and search the command info with its name. So it can cause O(n^2) in the number of commands. This patch adds an interface to traverse the qmp command list by QmpCommand to replace qmp_get_command_list. It can decrease the complexity from O(n^2) to O(n). Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com> Reviewed-by: Eric Blake <eblake@redhat.com> *fix up commit subject Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
e5d9adbdab
commit
8dc4d915dd
4 changed files with 61 additions and 96 deletions
|
@ -45,35 +45,27 @@ void qmp_guest_ping(Error **err)
|
|||
slog("guest-ping called");
|
||||
}
|
||||
|
||||
static void qmp_command_info(QmpCommand *cmd, void *opaque)
|
||||
{
|
||||
GuestAgentInfo *info = opaque;
|
||||
GuestAgentCommandInfo *cmd_info;
|
||||
GuestAgentCommandInfoList *cmd_info_list;
|
||||
|
||||
cmd_info = g_malloc0(sizeof(GuestAgentCommandInfo));
|
||||
cmd_info->name = g_strdup(qmp_command_name(cmd));
|
||||
cmd_info->enabled = qmp_command_is_enabled(cmd);
|
||||
|
||||
cmd_info_list = g_malloc0(sizeof(GuestAgentCommandInfoList));
|
||||
cmd_info_list->value = cmd_info;
|
||||
cmd_info_list->next = info->supported_commands;
|
||||
info->supported_commands = cmd_info_list;
|
||||
}
|
||||
|
||||
struct GuestAgentInfo *qmp_guest_info(Error **err)
|
||||
{
|
||||
GuestAgentInfo *info = g_malloc0(sizeof(GuestAgentInfo));
|
||||
GuestAgentCommandInfo *cmd_info;
|
||||
GuestAgentCommandInfoList *cmd_info_list;
|
||||
char **cmd_list_head, **cmd_list;
|
||||
|
||||
info->version = g_strdup(QEMU_VERSION);
|
||||
|
||||
cmd_list_head = cmd_list = qmp_get_command_list();
|
||||
if (*cmd_list_head == NULL) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (*cmd_list) {
|
||||
cmd_info = g_malloc0(sizeof(GuestAgentCommandInfo));
|
||||
cmd_info->name = g_strdup(*cmd_list);
|
||||
cmd_info->enabled = qmp_command_is_enabled(cmd_info->name);
|
||||
|
||||
cmd_info_list = g_malloc0(sizeof(GuestAgentCommandInfoList));
|
||||
cmd_info_list->value = cmd_info;
|
||||
cmd_info_list->next = info->supported_commands;
|
||||
info->supported_commands = cmd_info_list;
|
||||
|
||||
g_free(*cmd_list);
|
||||
cmd_list++;
|
||||
}
|
||||
|
||||
out:
|
||||
g_free(cmd_list_head);
|
||||
qmp_for_each_command(qmp_command_info, info);
|
||||
return info;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue