From: Luiz Capitulino <lcapitulino@redhat.com>
To: Anthony Liguori <aliguori@us.ibm.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Michael@gnu.org, qemu-devel@nongnu.org, Roth <mdroth@us.ibm.com>,
Markus Armbruster <armbru@redhat.com>
Subject: [Qemu-devel] Re: [PATCH 04/11] qerror: split out the reporting bits of QError
Date: Mon, 14 Mar 2011 16:18:53 -0300 [thread overview]
Message-ID: <20110314161853.0b9f5921@doriath> (raw)
In-Reply-To: <1299877249-13433-5-git-send-email-aliguori@us.ibm.com>
On Fri, 11 Mar 2011 15:00:42 -0600
Anthony Liguori <aliguori@us.ibm.com> wrote:
> These make it very hard to compile QError outside of QEMU.
Why would someone do this?
>
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
>
> diff --git a/Makefile.objs b/Makefile.objs
> index da31530..69f0383 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -2,7 +2,7 @@
> # QObject
> qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
> qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
> -qobject-obj-y += qerror.o
> +qobject-obj-y += qerror.o qerror-report.o
>
> #######################################################################
> # oslib-obj-y is code depending on the OS (win32 vs posix)
> diff --git a/qerror-report.c b/qerror-report.c
> new file mode 100644
> index 0000000..1ebb111
> --- /dev/null
> +++ b/qerror-report.c
> @@ -0,0 +1,131 @@
> +/*
> + * QError Module
> + *
> + * Copyright (C) 2009 Red Hat Inc.
> + *
> + * Authors:
> + * Luiz Capitulino <lcapitulino@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + */
> +
> +#include "qemu-common.h"
> +#include "qerror.h"
> +#include "monitor.h"
> +#include "qjson.h"
> +
> +static void GCC_FMT_ATTR(2, 3) qerror_abort(const QError *qerr,
> + const char *fmt, ...)
> +{
> + va_list ap;
> +
> + fprintf(stderr, "qerror: bad call in function '%s':\n", qerr->func);
> + fprintf(stderr, "qerror: -> ");
> +
> + va_start(ap, fmt);
> + vfprintf(stderr, fmt, ap);
> + va_end(ap);
> +
> + fprintf(stderr, "\nqerror: call at %s:%d\n", qerr->file, qerr->linenr);
> + abort();
> +}
> +
> +static void GCC_FMT_ATTR(2, 0) qerror_set_data(QError *qerr,
> + const char *fmt, va_list *va)
> +{
> + QObject *obj;
> +
> + obj = qobject_from_jsonv(fmt, va);
> + if (!obj) {
> + qerror_abort(qerr, "invalid format '%s'", fmt);
> + }
> + if (qobject_type(obj) != QTYPE_QDICT) {
> + qerror_abort(qerr, "error format is not a QDict '%s'", fmt);
> + }
> +
> + qerr->error = qobject_to_qdict(obj);
> +
> + obj = qdict_get(qerr->error, "class");
> + if (!obj) {
> + qerror_abort(qerr, "missing 'class' key in '%s'", fmt);
> + }
> + if (qobject_type(obj) != QTYPE_QSTRING) {
> + qerror_abort(qerr, "'class' key value should be a QString");
> + }
> +
> + obj = qdict_get(qerr->error, "data");
> + if (!obj) {
> + qerror_abort(qerr, "missing 'data' key in '%s'", fmt);
> + }
> + if (qobject_type(obj) != QTYPE_QDICT) {
> + qerror_abort(qerr, "'data' key value should be a QDICT");
> + }
> +}
> +
> +/**
> + * qerror_from_info(): Create a new QError from error information
> + *
> + * The information consists of:
> + *
> + * - file the file name of where the error occurred
> + * - linenr the line number of where the error occurred
> + * - func the function name of where the error occurred
> + * - fmt JSON printf-like dictionary, there must exist keys 'class' and
> + * 'data'
> + * - va va_list of all arguments specified by fmt
> + *
> + * Return strong reference.
> + */
> +QError *qerror_from_info(const char *file, int linenr, const char *func,
> + const char *fmt, va_list *va)
> +{
> + QError *qerr;
> +
> + qerr = qerror_new();
> + loc_save(&qerr->loc);
> + qerr->linenr = linenr;
> + qerr->file = file;
> + qerr->func = func;
> +
> + if (!fmt) {
> + qerror_abort(qerr, "QDict not specified");
> + }
> +
> + qerror_set_data(qerr, fmt, va);
> + qerror_set_desc(qerr, fmt);
> +
> + return qerr;
> +}
> +
> +/**
> + * qerror_print(): Print QError data
> + *
> + * This function will print the member 'desc' of the specified QError object,
> + * it uses error_report() for this, so that the output is routed to the right
> + * place (ie. stderr or Monitor's device).
> + */
> +void qerror_print(QError *qerror)
> +{
> + QString *qstring = qerror_human(qerror);
> + loc_push_restore(&qerror->loc);
> + error_report("%s", qstring_get_str(qstring));
> + loc_pop(&qerror->loc);
> + QDECREF(qstring);
> +}
> +
> +void qerror_report_internal(const char *file, int linenr, const char *func,
> + const char *fmt, ...)
> +{
> + va_list va;
> + QError *qerror;
> +
> + va_start(va, fmt);
> + qerror = qerror_from_info(file, linenr, func, fmt, &va);
> + va_end(va);
> +
> + qerror_print(qerror);
> + QDECREF(qerror);
> +}
> +
> +
> diff --git a/qerror.c b/qerror.c
> index 13d53c9..78d3884 100644
> --- a/qerror.c
> +++ b/qerror.c
> @@ -243,39 +243,7 @@ static void GCC_FMT_ATTR(2, 3) qerror_abort(const QError *qerr,
> abort();
> }
>
> -static void GCC_FMT_ATTR(2, 0) qerror_set_data(QError *qerr,
> - const char *fmt, va_list *va)
> -{
> - QObject *obj;
> -
> - obj = qobject_from_jsonv(fmt, va);
> - if (!obj) {
> - qerror_abort(qerr, "invalid format '%s'", fmt);
> - }
> - if (qobject_type(obj) != QTYPE_QDICT) {
> - qerror_abort(qerr, "error format is not a QDict '%s'", fmt);
> - }
> -
> - qerr->error = qobject_to_qdict(obj);
> -
> - obj = qdict_get(qerr->error, "class");
> - if (!obj) {
> - qerror_abort(qerr, "missing 'class' key in '%s'", fmt);
> - }
> - if (qobject_type(obj) != QTYPE_QSTRING) {
> - qerror_abort(qerr, "'class' key value should be a QString");
> - }
> -
> - obj = qdict_get(qerr->error, "data");
> - if (!obj) {
> - qerror_abort(qerr, "missing 'data' key in '%s'", fmt);
> - }
> - if (qobject_type(obj) != QTYPE_QDICT) {
> - qerror_abort(qerr, "'data' key value should be a QDICT");
> - }
> -}
> -
> -static void qerror_set_desc(QError *qerr, const char *fmt)
> +void qerror_set_desc(QError *qerr, const char *fmt)
> {
> int i;
>
> @@ -291,41 +259,6 @@ static void qerror_set_desc(QError *qerr, const char *fmt)
> qerror_abort(qerr, "error format '%s' not found", fmt);
> }
>
> -/**
> - * qerror_from_info(): Create a new QError from error information
> - *
> - * The information consists of:
> - *
> - * - file the file name of where the error occurred
> - * - linenr the line number of where the error occurred
> - * - func the function name of where the error occurred
> - * - fmt JSON printf-like dictionary, there must exist keys 'class' and
> - * 'data'
> - * - va va_list of all arguments specified by fmt
> - *
> - * Return strong reference.
> - */
> -QError *qerror_from_info(const char *file, int linenr, const char *func,
> - const char *fmt, va_list *va)
> -{
> - QError *qerr;
> -
> - qerr = qerror_new();
> - loc_save(&qerr->loc);
> - qerr->linenr = linenr;
> - qerr->file = file;
> - qerr->func = func;
> -
> - if (!fmt) {
> - qerror_abort(qerr, "QDict not specified");
> - }
> -
> - qerror_set_data(qerr, fmt, va);
> - qerror_set_desc(qerr, fmt);
> -
> - return qerr;
> -}
> -
> static void parse_error(const QErrorStringTable *entry, int c)
> {
> #if 0
> @@ -441,40 +374,6 @@ QString *qerror_human(const QError *qerror)
> }
>
> /**
> - * qerror_print(): Print QError data
> - *
> - * This function will print the member 'desc' of the specified QError object,
> - * it uses error_report() for this, so that the output is routed to the right
> - * place (ie. stderr or Monitor's device).
> - */
> -void qerror_print(QError *qerror)
> -{
> - QString *qstring = qerror_human(qerror);
> - loc_push_restore(&qerror->loc);
> - error_report("%s", qstring_get_str(qstring));
> - loc_pop(&qerror->loc);
> - QDECREF(qstring);
> -}
> -
> -void qerror_report_internal(const char *file, int linenr, const char *func,
> - const char *fmt, ...)
> -{
> - va_list va;
> - QError *qerror;
> -
> - va_start(va, fmt);
> - qerror = qerror_from_info(file, linenr, func, fmt, &va);
> - va_end(va);
> -
> - if (monitor_cur_is_qmp()) {
> - monitor_set_error(cur_mon, qerror);
> - } else {
> - qerror_print(qerror);
> - QDECREF(qerror);
> - }
> -}
> -
> -/**
> * qobject_to_qerror(): Convert a QObject into a QError
> */
> QError *qobject_to_qerror(const QObject *obj)
> diff --git a/qerror.h b/qerror.h
> index fd63ee9..495d0a4 100644
> --- a/qerror.h
> +++ b/qerror.h
> @@ -43,6 +43,7 @@ void qerror_report_internal(const char *file, int linenr, const char *func,
> qerror_report_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__)
> QError *qobject_to_qerror(const QObject *obj);
> QString *qerror_format(const char *fmt, QDict *error);
> +void qerror_set_desc(QError *qerr, const char *fmt);
>
> /*
> * QError class list
next prev parent reply other threads:[~2011-03-14 19:21 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-11 21:00 [Qemu-devel] [00/11] QAPI Round 0 (JSON improvements) Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 01/11] Add hard build dependency on glib Anthony Liguori
2011-03-12 8:09 ` [Qemu-devel] " Paolo Bonzini
2011-03-12 14:52 ` Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 02/11] qerror: expose a function to format an error Anthony Liguori
2011-03-11 21:08 ` [Qemu-devel] " Anthony Liguori
2011-03-14 19:17 ` Luiz Capitulino
2011-03-14 19:27 ` Anthony Liguori
2011-03-14 19:37 ` Luiz Capitulino
2011-03-14 19:45 ` Anthony Liguori
2011-03-14 20:22 ` Luiz Capitulino
2011-03-14 20:41 ` Anthony Liguori
2011-03-14 20:48 ` Luiz Capitulino
2011-03-14 21:03 ` Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 03/11] add a generic Error object Anthony Liguori
2011-03-12 11:05 ` Blue Swirl
2011-03-12 14:51 ` Anthony Liguori
2011-03-14 19:18 ` [Qemu-devel] " Luiz Capitulino
2011-03-14 19:34 ` Anthony Liguori
2011-03-14 19:57 ` Luiz Capitulino
2011-03-11 21:00 ` [Qemu-devel] [PATCH 04/11] qerror: split out the reporting bits of QError Anthony Liguori
2011-03-14 19:18 ` Luiz Capitulino [this message]
2011-03-14 19:24 ` [Qemu-devel] " Anthony Liguori
2011-03-14 19:30 ` Luiz Capitulino
2011-03-14 20:30 ` Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 05/11] qerror: add new error message for invalid enum values Anthony Liguori
2011-03-14 19:19 ` [Qemu-devel] " Luiz Capitulino
2011-03-11 21:00 ` [Qemu-devel] [PATCH 06/11] qerror: add JSON parsing error message Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 07/11] json: propagate error from parser Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 08/11] json-lexer: reset the lexer state on an invalid token Anthony Liguori
2011-03-14 19:22 ` [Qemu-devel] " Luiz Capitulino
2011-03-14 19:43 ` Anthony Liguori
2011-03-14 20:12 ` Luiz Capitulino
2011-03-14 20:30 ` Anthony Liguori
2011-03-14 20:43 ` Luiz Capitulino
2011-03-11 21:00 ` [Qemu-devel] [PATCH 09/11] json-lexer: limit the maximum size of a given token Anthony Liguori
2011-03-14 19:25 ` [Qemu-devel] " Luiz Capitulino
2011-03-14 20:18 ` Anthony Liguori
2011-03-14 20:33 ` Luiz Capitulino
2011-03-11 21:00 ` [Qemu-devel] [PATCH 10/11] json-streamer: limit the maximum recursion depth and maximum token count Anthony Liguori
2011-03-11 23:16 ` Michael Roth
2011-03-12 15:03 ` Anthony Liguori
2011-03-11 21:00 ` [Qemu-devel] [PATCH 11/11] json-parser: detect premature EOI Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110314161853.0b9f5921@doriath \
--to=lcapitulino@redhat.com \
--cc=Michael@gnu.org \
--cc=aliguori@us.ibm.com \
--cc=armbru@redhat.com \
--cc=mdroth@us.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).