diff options
author | Mark Wu <wudxw@linux.vnet.ibm.com> | 2013-10-09 11:25:07 +0800 |
---|---|---|
committer | Michael Roth <mdroth@linux.vnet.ibm.com> | 2013-10-10 14:52:37 -0500 |
commit | 8dc4d915dd6ea347a47557f5aa75a648555fe253 (patch) | |
tree | f4c7abf2d2bc74ee4d092aae95f8eb55c1c909ef /qapi | |
parent | e5d9adbdab972a2172815c1174aed3fabcc448f1 (diff) |
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>
Diffstat (limited to 'qapi')
-rw-r--r-- | qapi/qmp-registry.c | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c index 28bbbe849e..5e26710d89 100644 --- a/qapi/qmp-registry.c +++ b/qapi/qmp-registry.c @@ -66,35 +66,21 @@ void qmp_enable_command(const char *name) qmp_toggle_command(name, true); } -bool qmp_command_is_enabled(const char *name) +bool qmp_command_is_enabled(const QmpCommand *cmd) { - QmpCommand *cmd; - - QTAILQ_FOREACH(cmd, &qmp_commands, node) { - if (strcmp(cmd->name, name) == 0) { - return cmd->enabled; - } - } + return cmd->enabled; +} - return false; +const char *qmp_command_name(const QmpCommand *cmd) +{ + return cmd->name; } -char **qmp_get_command_list(void) +void qmp_for_each_command(qmp_cmd_callback_fn fn, void *opaque) { QmpCommand *cmd; - int count = 1; - char **list_head, **list; - - QTAILQ_FOREACH(cmd, &qmp_commands, node) { - count++; - } - - list_head = list = g_malloc0(count * sizeof(char *)); QTAILQ_FOREACH(cmd, &qmp_commands, node) { - *list = g_strdup(cmd->name); - list++; + fn(cmd, opaque); } - - return list_head; } |