From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:37735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwJsw-00056r-1v for qemu-devel@nongnu.org; Wed, 24 Aug 2011 16:17:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QwJsT-00032S-NA for qemu-devel@nongnu.org; Wed, 24 Aug 2011 16:17:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60114) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QwJsT-0002xY-Fl for qemu-devel@nongnu.org; Wed, 24 Aug 2011 16:16:45 -0400 Date: Wed, 24 Aug 2011 17:15:53 -0300 From: Luiz Capitulino Message-ID: <20110824171553.3edc819b@doriath> In-Reply-To: <1314211389-28915-2-git-send-email-aliguori@us.ibm.com> References: <1314211389-28915-1-git-send-email-aliguori@us.ibm.com> <1314211389-28915-2-git-send-email-aliguori@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 01/14] qerror: add qerror_report_err() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth On Wed, 24 Aug 2011 13:42:56 -0500 Anthony Liguori wrote: > This provides a bridge between Error (new error mechanism) and QError (old error > mechanism). Errors can be propagated whereas QError cannot. > > The minor evilness avoids layering violations. Since QError should go away RSN, > it seems like a reasonable hack. > > Signed-off-by: Anthony Liguori > --- > qerror.c | 33 +++++++++++++++++++++++++++++++++ > qerror.h | 2 ++ > 2 files changed, 35 insertions(+), 0 deletions(-) > > diff --git a/qerror.c b/qerror.c > index 3d64b80..fa647a6 100644 > --- a/qerror.c > +++ b/qerror.c > @@ -478,6 +478,39 @@ void qerror_report_internal(const char *file, int linenr, const char *func, > } > } > > +/* Evil... */ > +struct Error > +{ > + QDict *obj; > + const char *fmt; > + char *msg; > +}; Given that we're in hack mode, I think I'd prefer to have struct Error in error.h and then include it here. > + > +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]; > + return; You have to drop this return, else the if clause below won't be executed. Or you could just use qerror_set_desc(). > + } > + } > + > + if (monitor_cur_is_qmp()) { > + monitor_set_error(cur_mon, qerr); > + } else { > + qerror_print(qerr); > + QDECREF(qerr); > + } > +} > + > /** > * qobject_to_qerror(): Convert a QObject into a QError > */ > diff --git a/qerror.h b/qerror.h > index 8058456..4fe24aa 100644 > --- a/qerror.h > +++ b/qerror.h > @@ -15,6 +15,7 @@ > #include "qdict.h" > #include "qstring.h" > #include "qemu-error.h" > +#include "error.h" > #include > > typedef struct QErrorStringTable { > @@ -39,6 +40,7 @@ QString *qerror_human(const QError *qerror); > void qerror_print(QError *qerror); > void qerror_report_internal(const char *file, int linenr, const char *func, > const char *fmt, ...) GCC_FMT_ATTR(4, 5); > +void qerror_report_err(Error *err); > QString *qerror_format(const char *fmt, QDict *error); > #define qerror_report(fmt, ...) \ > qerror_report_internal(__FILE__, __LINE__, __func__, fmt, ## __VA_ARGS__)