From patchwork Wed Jul 25 20:50:23 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 173280 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 20D532C0086 for ; Thu, 26 Jul 2012 07:22:44 +1000 (EST) Received: from localhost ([::1]:47658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su8Xu-0003ue-Jc for incoming@patchwork.ozlabs.org; Wed, 25 Jul 2012 16:51:02 -0400 Received: from eggs.gnu.org ([208.118.235.92]:50379) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su8XE-0001yk-91 for qemu-devel@nongnu.org; Wed, 25 Jul 2012 16:50:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Su8XC-0004N5-Rt for qemu-devel@nongnu.org; Wed, 25 Jul 2012 16:50:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62072) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su8XC-0004Mx-Jz for qemu-devel@nongnu.org; Wed, 25 Jul 2012 16:50:18 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q6PKoHiO013080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 25 Jul 2012 16:50:17 -0400 Received: from localhost (ovpn-113-89.phx2.redhat.com [10.3.113.89]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q6PKoGHC006515; Wed, 25 Jul 2012 16:50:16 -0400 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Wed, 25 Jul 2012 17:50:23 -0300 Message-Id: <1343249431-9245-7-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1343249431-9245-1-git-send-email-lcapitulino@redhat.com> References: <1343249431-9245-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: pbonzini@redhat.com, aliguori@us.ibm.com, armbru@redhat.com, afaerber@suse.de, peter.maydell@linaro.org Subject: [Qemu-devel] [PATCH 06/14] qerror: don't delay error message construction X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Today, the error message is only constructed when it's used. This commit changes that to construct the error message when the error object is built (ie. when the error is reported). This eliminates the need of storing a pointer to qerror_table[], which will be dropped soon, and also simplifies the code. Signed-off-by: Luiz Capitulino --- qerror.c | 34 +++++++--------------------------- qerror.h | 2 +- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/qerror.c b/qerror.c index 7db28fc..89def8d 100644 --- a/qerror.c +++ b/qerror.c @@ -81,22 +81,6 @@ out_free: return NULL; } -static const QErrorStringTable *error_get_desc(const char *fmt) -{ - int i; - - // FIXME: inefficient loop - - for (i = 0; qerror_table[i].error_fmt; i++) { - if (strcmp(qerror_table[i].error_fmt, fmt) == 0) { - return &qerror_table[i]; - } - } - - fprintf(stderr, "error format '%s' not found\n", fmt); - return NULL; -} - static QDict *build_error_no_arg(const char *fmt) { return qobject_to_qdict(qobject_from_jsonv(fmt, NULL)); @@ -119,8 +103,8 @@ static QError *qerror_from_info(const char *fmt, va_list *va) goto bad_err; } - qerr->entry = error_get_desc(fmt); - if (!qerr->entry) { + qerr->err_msg = qerror_format(fmt, qerr->error); + if (!qerr->err_msg) { QDECREF(qerr->error); goto bad_err; } @@ -129,7 +113,7 @@ static QError *qerror_from_info(const char *fmt, va_list *va) bad_err: qerr->error = build_error_no_arg(QERR_UNDEFINED_ERROR); - qerr->entry = error_get_desc(QERR_UNDEFINED_ERROR); + qerr->err_msg = qerror_format(QERR_UNDEFINED_ERROR, qerr->error); return qerr; } @@ -233,7 +217,7 @@ char *qerror_format(const char *fmt, QDict *error) */ QString *qerror_human(const QError *qerror) { - return qerror_format_desc(qerror->error, qerror->entry); + return qstring_from_str(qerror->err_msg); } /** @@ -280,19 +264,14 @@ struct Error void qerror_report_err(Error *err) { QError *qerr; - int i; qerr = qerror_new(); loc_save(&qerr->loc); QINCREF(err->obj); qerr->error = err->obj; - for (i = 0; qerror_table[i].error_fmt; i++) { - if (strcmp(qerror_table[i].error_fmt, err->fmt) == 0) { - qerr->entry = &qerror_table[i]; - break; - } - } + qerr->err_msg = qerror_format(err->fmt, qerr->error); + /* FIXME: should report UndefinedError on error */ if (monitor_cur_is_qmp()) { monitor_set_error(cur_mon, qerr); @@ -333,5 +312,6 @@ static void qerror_destroy_obj(QObject *obj) qerr = qobject_to_qerror(obj); QDECREF(qerr->error); + g_free(qerr->err_msg); g_free(qerr); } diff --git a/qerror.h b/qerror.h index 6bf941b..16401ff 100644 --- a/qerror.h +++ b/qerror.h @@ -28,7 +28,7 @@ typedef struct QError { QObject_HEAD; QDict *error; Location loc; - const QErrorStringTable *entry; + char *err_msg; } QError; QString *qerror_human(const QError *qerror);