summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Capitulino <lcapitulino@redhat.com>2010-02-08 17:01:29 -0200
committerAnthony Liguori <aliguori@us.ibm.com>2010-02-10 13:46:17 -0600
commit27a749fb733dc64b7a215998be7f228a09bb27a7 (patch)
treefc4e56507e348227a6081a86f61a3f012887f8ba
parentba14414174b72fa231997243a9650feaa520d054 (diff)
downloadhqemu-27a749fb733dc64b7a215998be7f228a09bb27a7.zip
hqemu-27a749fb733dc64b7a215998be7f228a09bb27a7.tar.gz
QError: Don't abort on multiple faults
Ideally, Monitor code should report an error only once and return the error information up the call chain. To assure that this happens as expected and that no error is lost, we have an assert() in qemu_error_internal(). However, we still have not fully converted handlers using monitor_printf() to report errors. As there can be multiple monitor_printf() calls on an error, the assertion is easily triggered when debugging is enabled; and we will get a memory leak if it's not. The solution to this problem is to allow multiple faults by only reporting the first one, and to release the additional error objects. A better mechanism to report multiple errors to programmers is underway. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--monitor.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/monitor.c b/monitor.c
index eccb61d..23c0661 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4628,8 +4628,13 @@ void qemu_error_internal(const char *file, int linenr, const char *func,
QDECREF(qerror);
break;
case ERR_SINK_MONITOR:
- assert(qemu_error_sink->mon->error == NULL);
- qemu_error_sink->mon->error = qerror;
+ /* report only the first error */
+ if (!qemu_error_sink->mon->error) {
+ qemu_error_sink->mon->error = qerror;
+ } else {
+ /* XXX: warn the programmer */
+ QDECREF(qerror);
+ }
break;
}
}
OpenPOWER on IntegriCloud