[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 6/8] monitor: QError support
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 6/8] monitor: QError support |
Date: |
Wed, 4 Nov 2009 18:04:05 -0200 |
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 handlers returns.
Additionally, a new macro called qemu_error_new() is introduced.
It should be used in pace of qemu_error() to report errors.
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 <address@hidden>
---
monitor.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
sysemu.h | 7 +++++++
2 files changed, 49 insertions(+), 1 deletions(-)
diff --git a/monitor.c b/monitor.c
index 109ff5c..0e6e21b 100644
--- a/monitor.c
+++ b/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;
};
@@ -3146,6 +3148,18 @@ fail:
return NULL;
}
+static inline int monitor_has_error(const Monitor *mon)
+{
+ return mon->error != 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;
@@ -3171,7 +3185,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);
@@ -3622,3 +3639,27 @@ void qemu_error(const char *fmt, ...)
break;
}
}
+
+void qemu_error_full(const char *name, const char *file, int linenr,
+ const char *desc, const char *fmt, ...)
+{
+ va_list va;
+ QError *qerror;
+
+ assert(qemu_error_sink != NULL);
+
+ va_start(va, fmt);
+ qerror = qerror_from_info(name, file, linenr, desc, 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;
+ }
+}
diff --git a/sysemu.h b/sysemu.h
index 96804b4..20ab709 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -7,6 +7,7 @@
#include "qemu-queue.h"
#include "qemu-timer.h"
#include "qdict.h"
+#include "qerror.h"
#ifdef _WIN32
#include <windows.h>
@@ -71,6 +72,12 @@ void qemu_errors_to_file(FILE *fp);
void qemu_errors_to_mon(Monitor *mon);
void qemu_errors_to_previous(void);
void qemu_error(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
+void qemu_error_full(const char *name, const char *file, int linenr,
+ const char *desc, const char *fmt, ...)
+ __attribute__ ((format(printf, 5, 6)));
+
+#define qemu_error_new(name, desc, fmt, ...) \
+ qemu_error_full(name, __FILE__, __LINE__, desc, fmt, ## __VA_ARGS__)
#ifdef _WIN32
/* Polling handling */
--
1.6.5.2.143.g8cc62
- [Qemu-devel] [RFC 0/8]: QError v2, Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 1/8] QJSon: Introduce qobject_from_json_va(), Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 3/8] Add qstring_append_chr() unit-test, Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 2/8] QString: Introduce qstring_append_chr(), Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 4/8] QString: Introduce qstring_append_int(), Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 5/8] Introduce QError, Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 6/8] monitor: QError support,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 7/8] qdev: Use QError for not found error, Luiz Capitulino, 2009/11/04
- [Qemu-devel] [PATCH 8/8] monitor: do_info_balloon(): use QError, Luiz Capitulino, 2009/11/04
- Re: [Qemu-devel] [RFC 0/8]: QError v2, Anthony Liguori, 2009/11/11