[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 28/50] error: Let converted handlers print in human
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH 28/50] error: Let converted handlers print in human monitor |
Date: |
Thu, 4 Mar 2010 16:56:49 +0100 |
While fully converted handlers are not supposed to print anything when
running in a QMP monitor, they are free to print in a human monitor.
For instance, device_add (not yet converted) prints help, and will
continue to do so after conversion.
Moreover, utility functions converted to QError should remain usable
from unconverted handlers.
Two problems:
* handler_audit() complains when a converted handler prints. Limit
that to QMP monitors.
* With QMP, handlers need to pass the error object by way of
monitor_set_error(). However, we do that both for QMP and for the
human monitor. The human monitor prints the error object after the
handler returns. If the handler prints anything else, that output
"overtakes" the error message.
Limit use of monitor_set_error() to QMP monitors. Update
handler_audit() accordingly.
Signed-off-by: Markus Armbruster <address@hidden>
---
monitor.c | 80 ++++++++++++++++++++++++++-------------------------------
qemu-error.c | 2 +-
2 files changed, 38 insertions(+), 44 deletions(-)
diff --git a/monitor.c b/monitor.c
index 3580d37..dfeb9db 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3873,13 +3873,6 @@ void monitor_set_error(Monitor *mon, QError *qerror)
}
}
-static void monitor_print_error(Monitor *mon)
-{
- qerror_print(mon->error);
- QDECREF(mon->error);
- mon->error = NULL;
-}
-
static int is_async_return(const QObject *data)
{
if (data && qobject_type(data) == QTYPE_QDICT) {
@@ -3891,45 +3884,49 @@ static int is_async_return(const QObject *data)
static void handler_audit(Monitor *mon, const mon_cmd_t *cmd, int ret)
{
- if (ret && !monitor_has_error(mon)) {
- /*
- * If it returns failure, it must have passed on error.
- *
- * Action: Report an internal error to the client if in QMP.
- */
- if (monitor_ctrl_mode(mon)) {
+ if (monitor_ctrl_mode(mon)) {
+ if (ret && !monitor_has_error(mon)) {
+ /*
+ * If it returns failure, it must have passed on error.
+ *
+ * Action: Report an internal error to the client if in QMP.
+ */
qerror_report(QERR_UNDEFINED_ERROR);
+ MON_DEBUG("command '%s' returned failure but did not pass an
error\n",
+ cmd->name);
}
- MON_DEBUG("command '%s' returned failure but did not pass an error\n",
- cmd->name);
- }
#ifdef CONFIG_DEBUG_MONITOR
- if (!ret && monitor_has_error(mon)) {
- /*
- * If it returns success, it must not have passed an error.
- *
- * Action: Report the passed error to the client.
- */
- MON_DEBUG("command '%s' returned success but passed an error\n",
- cmd->name);
- }
+ if (!ret && monitor_has_error(mon)) {
+ /*
+ * If it returns success, it must not have passed an error.
+ *
+ * Action: Report the passed error to the client.
+ */
+ MON_DEBUG("command '%s' returned success but passed an error\n",
+ cmd->name);
+ }
- if (mon_print_count_get(mon) > 0 && strcmp(cmd->name, "info") != 0) {
- /*
- * Handlers should not call Monitor print functions.
- *
- * Action: Ignore them in QMP.
- *
- * (XXX: we don't check any 'info' or 'query' command here
- * because the user print function _is_ called by do_info(), hence
- * we will trigger this check. This problem will go away when we
- * make 'query' commands real and kill do_info())
- */
- MON_DEBUG("command '%s' called print functions %d time(s)\n",
- cmd->name, mon_print_count_get(mon));
- }
+ if (mon_print_count_get(mon) > 0 && strcmp(cmd->name, "info") != 0) {
+ /*
+ * Handlers should not call Monitor print functions.
+ *
+ * Action: Ignore them in QMP.
+ *
+ * (XXX: we don't check any 'info' or 'query' command here
+ * because the user print function _is_ called by do_info(), hence
+ * we will trigger this check. This problem will go away when we
+ * make 'query' commands real and kill do_info())
+ */
+ MON_DEBUG("command '%s' called print functions %d time(s)\n",
+ cmd->name, mon_print_count_get(mon));
+ }
#endif
+ } else {
+ assert(!monitor_has_error(mon));
+ QDECREF(mon->error);
+ mon->error = NULL;
+ }
}
static void monitor_call_handler(Monitor *mon, const mon_cmd_t *cmd,
@@ -3982,9 +3979,6 @@ static void handle_user_command(Monitor *mon, const char
*cmdline)
cmd->mhandler.cmd(mon, qdict);
}
- if (monitor_has_error(mon))
- monitor_print_error(mon);
-
out:
QDECREF(qdict);
}
diff --git a/qemu-error.c b/qemu-error.c
index 5be6bea..a8c178b 100644
--- a/qemu-error.c
+++ b/qemu-error.c
@@ -207,7 +207,7 @@ void qerror_report_internal(const char *file, int linenr,
const char *func,
qerror = qerror_from_info(file, linenr, func, fmt, &va);
va_end(va);
- if (cur_mon) {
+ if (monitor_cur_is_qmp()) {
monitor_set_error(cur_mon, qerror);
} else {
qerror_print(qerror);
--
1.6.6.1
- [Qemu-devel] [PATCH 24/50] qdev: Factor qdev_create_from_info() out of qdev_create(), (continued)
- [Qemu-devel] [PATCH 24/50] qdev: Factor qdev_create_from_info() out of qdev_create(), Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 19/50] error: Include the program name in error messages to stderr, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 38/50] error: New error_printf_unless_qmp(), Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 20/50] error: Track locations in configuration files, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 46/50] qemu-option: Move the implied first name into QemuOptsList, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 22/50] error: Track locations on command line, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 48/50] monitor: New argument type 'O', Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 29/50] error: Polish human-readable error descriptions, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 21/50] QemuOpts: Fix qemu_config_parse() to catch file read errors, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 32/50] qdev: convert setting device properties to QError, Markus Armbruster, 2010/03/04
- [Qemu-devel] [PATCH 28/50] error: Let converted handlers print in human monitor,
Markus Armbruster <=
[Qemu-devel] [PATCH 44/50] error: Convert do_device_add() to QError, Markus Armbruster, 2010/03/04
[Qemu-devel] [PATCH 37/50] qdev: Convert qbus_find() to QError, Markus Armbruster, 2010/03/04
[Qemu-devel] [PATCH 43/50] Revert "qdev: Use QError for 'device not found' error", Markus Armbruster, 2010/03/04
[Qemu-devel] [PATCH 33/50] qdev: Relax parsing of bus option, Markus Armbruster, 2010/03/04