From patchwork Thu Nov 12 20:42:32 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 38284 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1737CB7BAF for ; Fri, 13 Nov 2009 08:05:08 +1100 (EST) Received: from localhost ([127.0.0.1]:58656 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N8gqn-0007AJ-85 for incoming@patchwork.ozlabs.org; Thu, 12 Nov 2009 16:05:05 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N8gVf-0007yF-QA for qemu-devel@nongnu.org; Thu, 12 Nov 2009 15:43:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N8gVa-0007vE-TH for qemu-devel@nongnu.org; Thu, 12 Nov 2009 15:43:15 -0500 Received: from [199.232.76.173] (port=33545 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N8gVa-0007v9-Kv for qemu-devel@nongnu.org; Thu, 12 Nov 2009 15:43:10 -0500 Received: from mx1.redhat.com ([209.132.183.28]:27448) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N8gVa-0006ix-3j for qemu-devel@nongnu.org; Thu, 12 Nov 2009 15:43:10 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nACKh8Ws019095 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 12 Nov 2009 15:43:09 -0500 Received: from localhost (vpn-10-7.rdu.redhat.com [10.11.10.7]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nACKh7cD004217; Thu, 12 Nov 2009 15:43:08 -0500 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Thu, 12 Nov 2009 18:42:32 -0200 Message-Id: <1258058554-22872-8-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1258058554-22872-1-git-send-email-lcapitulino@redhat.com> References: <1258058554-22872-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: aliguori@us.ibm.com, kraxel@redhat.com, armbru@redhat.com Subject: [Qemu-devel] [PATCH 7/9] monitor: QError support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- monitor.c | 42 +++++++++++++++++++++++++++++++++++++++++- sysemu.h | 6 ++++++ 2 files changed, 47 insertions(+), 1 deletions(-) diff --git a/monitor.c b/monitor.c index 132fb6e..a8fd552 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,26 @@ void qemu_error(const char *fmt, ...) break; } } + +void qemu_error_full(const char *file, int linenr, const char *fmt, ...) +{ + va_list va; + QError *qerror; + + assert(qemu_error_sink != NULL); + + va_start(va, fmt); + qerror = qerror_from_info(file, linenr, 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..5891def 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 @@ -71,6 +72,11 @@ 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 *file, int linenr, const char *fmt, ...) + __attribute__ ((format(printf, 3, 4))); + +#define qemu_error_new(fmt, ...) \ + qemu_error_full(__FILE__, __LINE__, fmt, ## __VA_ARGS__) #ifdef _WIN32 /* Polling handling */