mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
monitor: QError support
This commit adds QError support in the Monitor. A QError member is added to the Monitor struct. This new member stores error information and is also used to check if an error has occurred when the called handler returns. Additionally, a new macro called qemu_error_new() is introduced. It builds on top of the QemuErrorSink API and should be used in place of qemu_error(). When all conversion to qemu_error_new() is done, qemu_error() can be turned private. Basically, Monitor's error flow is something like this: 1. An error occurs in the handler, it calls qemu_error_new() 2. qemu_error_new() builds a new QError object and stores it in the Monitor struct 3. The handler returns 4. Top level Monitor code checks the Monitor struct and calls qerror_print() to print the error Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
9f9daf9a63
commit
8204a9180c
2 changed files with 49 additions and 1 deletions
43
monitor.c
43
monitor.c
|
@ -49,6 +49,7 @@
|
|||
#include "qlist.h"
|
||||
#include "qdict.h"
|
||||
#include "qstring.h"
|
||||
#include "qerror.h"
|
||||
|
||||
//#define DEBUG
|
||||
//#define DEBUG_COMPLETION
|
||||
|
@ -103,6 +104,7 @@ struct Monitor {
|
|||
CPUState *mon_cpu;
|
||||
BlockDriverCompletionFunc *password_completion_cb;
|
||||
void *password_opaque;
|
||||
QError *error;
|
||||
QLIST_HEAD(,mon_fd_t) fds;
|
||||
QLIST_ENTRY(Monitor) entry;
|
||||
};
|
||||
|
@ -224,6 +226,11 @@ static inline int monitor_handler_ported(const mon_cmd_t *cmd)
|
|||
return cmd->user_print != NULL;
|
||||
}
|
||||
|
||||
static inline int monitor_has_error(const Monitor *mon)
|
||||
{
|
||||
return mon->error != NULL;
|
||||
}
|
||||
|
||||
static void monitor_print_qobject(Monitor *mon, const QObject *data)
|
||||
{
|
||||
switch (qobject_type(data)) {
|
||||
|
@ -3168,6 +3175,13 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void monitor_print_error(Monitor *mon)
|
||||
{
|
||||
qerror_print(mon->error);
|
||||
QDECREF(mon->error);
|
||||
mon->error = NULL;
|
||||
}
|
||||
|
||||
static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
||||
{
|
||||
QDict *qdict;
|
||||
|
@ -3193,7 +3207,10 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
|
|||
cmd->mhandler.cmd(mon, qdict);
|
||||
}
|
||||
|
||||
qemu_errors_to_previous();
|
||||
if (monitor_has_error(mon))
|
||||
monitor_print_error(mon);
|
||||
|
||||
qemu_errors_to_previous();
|
||||
|
||||
out:
|
||||
QDECREF(qdict);
|
||||
|
@ -3644,3 +3661,27 @@ void qemu_error(const char *fmt, ...)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_error_internal(const char *file, int linenr, const char *func,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
QError *qerror;
|
||||
|
||||
assert(qemu_error_sink != NULL);
|
||||
|
||||
va_start(va, fmt);
|
||||
qerror = qerror_from_info(file, linenr, func, fmt, &va);
|
||||
va_end(va);
|
||||
|
||||
switch (qemu_error_sink->dest) {
|
||||
case ERR_SINK_FILE:
|
||||
qerror_print(qerror);
|
||||
QDECREF(qerror);
|
||||
break;
|
||||
case ERR_SINK_MONITOR:
|
||||
assert(qemu_error_sink->mon->error == NULL);
|
||||
qemu_error_sink->mon->error = qerror;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue