From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N3bOL-0000Gy-CG for qemu-devel@nongnu.org; Thu, 29 Oct 2009 16:14:41 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N3bOG-0000Dn-Jt for qemu-devel@nongnu.org; Thu, 29 Oct 2009 16:14:40 -0400 Received: from [199.232.76.173] (port=35827 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N3bOG-0000De-F9 for qemu-devel@nongnu.org; Thu, 29 Oct 2009 16:14:36 -0400 Received: from e38.co.us.ibm.com ([32.97.110.159]:48014) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1N3bOF-0004yD-W4 for qemu-devel@nongnu.org; Thu, 29 Oct 2009 16:14:36 -0400 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by e38.co.us.ibm.com (8.14.3/8.13.1) with ESMTP id n9TKA5Wk020267 for ; Thu, 29 Oct 2009 14:10:05 -0600 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id n9TKEHBM056870 for ; Thu, 29 Oct 2009 14:14:20 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id n9TKEEBo023918 for ; Thu, 29 Oct 2009 14:14:14 -0600 Message-ID: <4AE9F794.4030204@us.ibm.com> Date: Thu, 29 Oct 2009 15:14:12 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1256841750-15228-1-git-send-email-lcapitulino@redhat.com> <1256841750-15228-3-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1256841750-15228-3-git-send-email-lcapitulino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 2/7] Introduce QError List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: pbonzini@redhat.com, hollisb@linux.vnet.ibm.com, qemu-devel@nongnu.org, kraxel@redhat.com > Signed-off-by: Luiz Capitulino > --- > Makefile | 2 +- > qerror.c | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > qerror.h | 48 ++++++++++++ > qobject.h | 1 + > 4 files changed, 290 insertions(+), 1 deletions(-) > create mode 100644 qerror.c > create mode 100644 qerror.h > > diff --git a/Makefile b/Makefile > index 813bd0a..325e583 100644 > --- a/Makefile > +++ b/Makefile > @@ -125,7 +125,7 @@ obj-y += net.o net-queue.o > obj-y += qemu-char.o aio.o net-checksum.o savevm.o > obj-y += msmouse.o ps2.o > obj-y += qdev.o qdev-properties.o > -obj-y += qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o qjson.o > +obj-y += qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o qjson.o qerror.o > obj-y += qemu-config.o > > obj-$(CONFIG_BRLAPI) += baum.o > diff --git a/qerror.c b/qerror.c > new file mode 100644 > index 0000000..0359d65 > --- /dev/null > +++ b/qerror.c > @@ -0,0 +1,240 @@ > +/* > + * QError: QEMU Error data-type. > + * > + * Copyright (C) 2009 Red Hat Inc. > + * > + * Authors: > + * Luiz Capitulino > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + */ > +#include "qint.h" > +#include "qjson.h" > +#include "qerror.h" > +#include "qstring.h" > +#include "sysemu.h" > +#include "qemu-common.h" > + > +static void qerror_destroy_obj(QObject *obj); > + > +static const QType qerror_type = { > + .code = QTYPE_QERROR, > + .destroy = qerror_destroy_obj, > +}; > + > +/** > + * The 'desc' member is a printf-like string, the format of the format > + * string is: > + * > + * %(KEY)TYPE > + * > + * Where KEY is a QDict key and TYPE is the type of its value, KEY and > + * its value must be passed to qerror_from_info(). > + * > + * Example: > + * > + * "foo error on device: %(device)s slot: %(slot_nr)s" > + * > + * A single percent sign can be printed if followed by a second one, > + * for example: > + * > + * "running out of foo: %(foo)d%%" > + * > + * Valid types are: > + * > + * s (string) > + * d (integer) > + */ > +static QErrorTable qerror_table[] = { > + { > + .code = QERR_UNKNOWN, > + .desc = "unknown error", > + }, > +}; > + > +/** > + * qerror_new(): Create a new QError > + * > + * Return strong reference. > + */ > +QError *qerror_new(void) > +{ > + QError *qerr; > + > + qerr = qemu_mallocz(sizeof(*qerr)); > + QOBJECT_INIT(qerr, &qerror_type); > + > + return qerr; > +} > + > +/** > + * qerror_from_info(): Create a new QError from error information > + * > + * The information consists of: > + * > + * - code: error code > + * - file: the file of where the error happend > + * - linenr: the line number of where the error happend > + * - fmt: JSON printf-like format > + * - va: va_list of all arguments > + * > + * Return strong reference. > + */ > +QError *qerror_from_info(QErrorCode code, const char *file, int linenr, > + const char *fmt, va_list *va) > +{ > va_list doesn't need to be a pointer. Shouldn't this take a ... too? > diff --git a/qerror.h b/qerror.h > new file mode 100644 > index 0000000..2fd0d58 > --- /dev/null > +++ b/qerror.h > @@ -0,0 +1,48 @@ > +/* > + * QError header file. > + * > + * Copyright (C) 2009 Red Hat Inc. > + * > + * Authors: > + * Luiz Capitulino > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + */ > +#ifndef QERROR_H > +#define QERROR_H > + > +#include > +#include "qobject.h" > + > +/* > + * IMPORTANT: errors numbers must not change after they have been > + * added here. > + */ > +typedef enum QErrorCode { > + QERR_UNKNOWN, > + QERR_MAX, > +} QErrorCode; > + > +struct QError; > + > +typedef struct QErrorTable { > + QErrorCode code; > + const char *desc; > +} QErrorTable; > + > +typedef struct QError { > + QObject_HEAD; > + int linenr; /* error line number */ > + const char *file; /* error file */ > + QObject *data; /* error specific data */ > + const QErrorTable *entry; > +} QError; > + > +QError *qerror_new(void); > +QError *qerror_from_info(QErrorCode code, const char *file, int linenr, > + const char *fmt, va_list *va); > I don't know how I feel about the linenr/file bit. It seems prone to misused when used in a public interface (vs. automatically via a macro). -- Regards, Anthony Liguori