mirror of
https://github.com/qemu/qemu.git
synced 2025-07-31 01:18:30 +00:00

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>
87 lines
1.8 KiB
C
87 lines
1.8 KiB
C
/*
|
|
* Core Definitions for QAPI/QMP Dispatch
|
|
*
|
|
* Copyright IBM, Corp. 2011
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
* Michael Roth <mdroth@us.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
* See the COPYING.LIB file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#include <glib.h>
|
|
#include <string.h>
|
|
#include "qapi/qmp/dispatch.h"
|
|
|
|
static QTAILQ_HEAD(QmpCommandList, QmpCommand) qmp_commands =
|
|
QTAILQ_HEAD_INITIALIZER(qmp_commands);
|
|
|
|
void qmp_register_command(const char *name, QmpCommandFunc *fn,
|
|
QmpCommandOptions options)
|
|
{
|
|
QmpCommand *cmd = g_malloc0(sizeof(*cmd));
|
|
|
|
cmd->name = name;
|
|
cmd->type = QCT_NORMAL;
|
|
cmd->fn = fn;
|
|
cmd->enabled = true;
|
|
cmd->options = options;
|
|
QTAILQ_INSERT_TAIL(&qmp_commands, cmd, node);
|
|
}
|
|
|
|
QmpCommand *qmp_find_command(const char *name)
|
|
{
|
|
QmpCommand *cmd;
|
|
|
|
QTAILQ_FOREACH(cmd, &qmp_commands, node) {
|
|
if (strcmp(cmd->name, name) == 0) {
|
|
return cmd;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static void qmp_toggle_command(const char *name, bool enabled)
|
|
{
|
|
QmpCommand *cmd;
|
|
|
|
QTAILQ_FOREACH(cmd, &qmp_commands, node) {
|
|
if (strcmp(cmd->name, name) == 0) {
|
|
cmd->enabled = enabled;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void qmp_disable_command(const char *name)
|
|
{
|
|
qmp_toggle_command(name, false);
|
|
}
|
|
|
|
void qmp_enable_command(const char *name)
|
|
{
|
|
qmp_toggle_command(name, true);
|
|
}
|
|
|
|
bool qmp_command_is_enabled(const QmpCommand *cmd)
|
|
{
|
|
return cmd->enabled;
|
|
}
|
|
|
|
const char *qmp_command_name(const QmpCommand *cmd)
|
|
{
|
|
return cmd->name;
|
|
}
|
|
|
|
void qmp_for_each_command(qmp_cmd_callback_fn fn, void *opaque)
|
|
{
|
|
QmpCommand *cmd;
|
|
|
|
QTAILQ_FOREACH(cmd, &qmp_commands, node) {
|
|
fn(cmd, opaque);
|
|
}
|
|
}
|