From patchwork Fri Oct 19 17:19:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 12381 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 788EA241A4 for ; Fri, 19 Oct 2012 17:19:15 +0000 (UTC) Received: from mail-ia0-f180.google.com (mail-ia0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 2C1A0A18AF7 for ; Fri, 19 Oct 2012 17:19:15 +0000 (UTC) Received: by mail-ia0-f180.google.com with SMTP id f6so446809iag.11 for ; Fri, 19 Oct 2012 10:19:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=FyOfm4Rmq3B1pdPN1vvh+zcOCBPkjym3s7CmnZZJ2nQ=; b=e3ef7Q9GwvL0pQaiq2pOxZEwzRqd0FlR5MdRS4k+AQ0Dh52Bqwrx2lL9jEQrtfFtuh u6bAWrSdsIDajBPkEnP+2EJEerTHQYhYHVag3+Pdj/JnT1tQEem76kwxhmXK39bbio9c hrzYnXsbWxAmrOibLBkhFsCpM2meu2kX/0Z8yTLudZ5NCp4uk+BnJZBbY3KoaqkxhFb9 mvxUoZGETWuI+1b07ywZMwbwDJjo1rcr7KWa+hElVpil6Ll8xoP9oL7I3dg6pUMwi+HW 8FnpVr3UNPALdNqeWu3nFHa/2jvMCQJk7JFZrKyHZSnkIZ49SSRHd2z80TGqZ8blyvIX trWw== Received: by 10.50.161.169 with SMTP id xt9mr9110068igb.62.1350667154930; Fri, 19 Oct 2012 10:19:14 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.67.148 with SMTP id n20csp124731igt; Fri, 19 Oct 2012 10:19:13 -0700 (PDT) Received: by 10.216.139.36 with SMTP id b36mr1108771wej.160.1350667151739; Fri, 19 Oct 2012 10:19:11 -0700 (PDT) Received: from mnementh.archaic.org.uk (1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.1.0.0.b.8.0.1.0.0.2.ip6.arpa. [2001:8b0:1d0::1]) by mx.google.com with ESMTPS id cr1si4706067wib.19.2012.10.19.10.19.11 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 19 Oct 2012 10:19:11 -0700 (PDT) Received-SPF: neutral (google.com: 2001:8b0:1d0::1 is neither permitted nor denied by best guess record for domain of pm215@archaic.org.uk) client-ip=2001:8b0:1d0::1; Authentication-Results: mx.google.com; spf=neutral (google.com: 2001:8b0:1d0::1 is neither permitted nor denied by best guess record for domain of pm215@archaic.org.uk) smtp.mail=pm215@archaic.org.uk Received: from pm215 by mnementh.archaic.org.uk with local (Exim 4.72) (envelope-from ) id 1TPGDy-0006qE-Vz; Fri, 19 Oct 2012 18:19:06 +0100 From: Peter Maydell To: qemu-devel@nongnu.org Cc: patches@linaro.org, Anthony Liguori , Paolo Bonzini Subject: [PATCH 1/2] error: Distinguish critical and non-critical errors Date: Fri, 19 Oct 2012 18:19:05 +0100 Message-Id: <1350667146-26273-2-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1350667146-26273-1-git-send-email-peter.maydell@linaro.org> References: <1350667146-26273-1-git-send-email-peter.maydell@linaro.org> X-Gm-Message-State: ALoCoQkG7/+qbNVFPiDFwdKNtzc36PZqqAd6lYZDjssrQujvXhJ+kE6AzNJJusnkFv+s/YYo6fiE Add the concept of a 'critical' error, which is one that must not be ignored. If, at the point when the error is raised or at any subsequent point while propagating it, we find that we would be throwing away the error because of a NULL Error**, we print the error message to stderr and abort(). Signed-off-by: Peter Maydell --- error.c | 38 ++++++++++++++++++++++++++++++++++---- error.h | 12 ++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/error.c b/error.c index 1f05fc4..3f76fd5 100644 --- a/error.c +++ b/error.c @@ -21,12 +21,13 @@ struct Error { char *msg; ErrorClass err_class; + bool is_critical; }; -void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) +static void do_error_set(Error **errp, ErrorClass err_class, + const char *fmt, va_list ap) { Error *err; - va_list ap; if (errp == NULL) { return; @@ -35,14 +36,38 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) err = g_malloc0(sizeof(*err)); - va_start(ap, fmt); err->msg = g_strdup_vprintf(fmt, ap); - va_end(ap); err->err_class = err_class; *errp = err; } +void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + do_error_set(errp, err_class, fmt, ap); + va_end(ap); +} + +void error_set_critical(Error **errp, ErrorClass err_class, + const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (!errp) { + /* Critical error which would be ignored: print and abort now */ + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); + abort(); + } + + do_error_set(errp, err_class, fmt, ap); + (*errp)->is_critical = true; + + va_end(ap); +} + Error *error_copy(const Error *err) { Error *err_new; @@ -50,6 +75,7 @@ Error *error_copy(const Error *err) err_new = g_malloc0(sizeof(*err)); err_new->msg = g_strdup(err->msg); err_new->err_class = err->err_class; + err_new->is_critical = err->is_critical; return err_new; } @@ -82,6 +108,10 @@ void error_propagate(Error **dst_err, Error *local_err) if (dst_err && !*dst_err) { *dst_err = local_err; } else if (local_err) { + if (local_err->is_critical) { + fprintf(stderr, "%s\n", error_get_pretty(local_err)); + abort(); + } error_free(local_err); } } diff --git a/error.h b/error.h index da7fed3..4be0893 100644 --- a/error.h +++ b/error.h @@ -36,6 +36,18 @@ void error_set(Error **err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) /** + * Same as error_set(), but mark the error as critical + */ +void error_set_critical(Error **err, ErrorClass err_class, + const char *fmt, ...) GCC_FMT_ATTR(3, 4); + +/** + * Same as error_setg(), but mark the error as critical + */ +#define error_setg_critical(err, fmt, ...) \ + error_set_critical(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) + +/** * Returns true if an indirect pointer to an error is pointing to a valid * error object. */