From patchwork Fri May 10 12:16:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 242973 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 C71832C00A5 for ; Fri, 10 May 2013 22:20:26 +1000 (EST) Received: from localhost ([::1]:34010 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UamJE-0000bA-Sc for incoming@patchwork.ozlabs.org; Fri, 10 May 2013 08:20:24 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39994) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UamG0-00043l-Ut for qemu-devel@nongnu.org; Fri, 10 May 2013 08:17:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UamFz-0007l3-Fn for qemu-devel@nongnu.org; Fri, 10 May 2013 08:17:04 -0400 Received: from mail-we0-x22f.google.com ([2a00:1450:400c:c03::22f]:60880) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UamFz-0007kn-7B for qemu-devel@nongnu.org; Fri, 10 May 2013 08:17:03 -0400 Received: by mail-we0-f175.google.com with SMTP id p57so3885839wes.6 for ; Fri, 10 May 2013 05:17:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=hcEtg0R2N/7Gz6AY9xunUtdY3IXgjM86B2z0JI+hO44=; b=YPhB8vmPJhHVKtBY5ECgZiJLzMhifC074OP/ooHchtkcFwyI6aqfCWw5SQgt/Rw1sO uWbPBAzOiWXTAJBxh+mgiklj6z/yTfLMlcqvc3gpfegUJQ1ekAvfhim2rEOVd81wY458 NRlACzc4MAxlobjJ5kyASG6cr9JFxX4pnuY7towomiIuDh/UIra9jRQ8WO09H1ELM0yP dcpr3k7fy0kiqcg97W4Ry+NF9ilVEhR3y1wXw+vOCG5qD6x78t0xXXir4K5dCTmI4pvL LigdMXCrHmIJcjp9/9X6a+5H6pOModWe6OC61wdIuVcyOsGDkj2mIPiwr7VxFdHqUUs/ Ipnw== X-Received: by 10.180.184.11 with SMTP id eq11mr3494623wic.30.1368188219956; Fri, 10 May 2013 05:16:59 -0700 (PDT) Received: from playground.lan (93-34-176-20.ip50.fastwebnet.it. [93.34.176.20]) by mx.google.com with ESMTPSA id er17sm3529771wic.0.2013.05.10.05.16.58 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 10 May 2013 05:16:59 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 10 May 2013 14:16:40 +0200 Message-Id: <1368188203-3407-7-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1368188203-3407-1-git-send-email-pbonzini@redhat.com> References: <1368188203-3407-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c03::22f Cc: Anthony Liguori , Andreas Faerber , Aurelien Jarno , mst@redhat.com Subject: [Qemu-devel] [PATCH for-1.5 6/9] qom: allow turning cast debugging off 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 Cast debugging can have a substantial cost (20% or more). Instead of adding special-cased "fast casts" in the hot paths, we can just disable it in releases. The tracing facilities we just added make it easier to analyze those problems that cast debugging would reveal. Signed-off-by: Paolo Bonzini --- configure | 8 ++++++++ include/qom/object.h | 11 ++++++----- qom/object.c | 15 +++++++++++---- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/configure b/configure index 9439f1c..dd44562 100755 --- a/configure +++ b/configure @@ -220,6 +220,7 @@ blobs="yes" pkgversion="" pie="" zero_malloc="" +qom_cast_debug="yes" trace_backend="nop" trace_file="trace" spice="" @@ -688,6 +689,10 @@ for opt do ;; --enable-sdl) sdl="yes" ;; + --disable-qom-cast-debug) qom_cast_debug="no" + ;; + --enable-qom-cast-debug) qom_cast_debug="yes" + ;; --disable-virtfs) virtfs="no" ;; --enable-virtfs) virtfs="yes" @@ -3579,6 +3579,7 @@ echo "gcov enabled $gcov" echo "TPM support $tpm" echo "libssh2 support $libssh2" echo "TPM passthrough $tpm_passthrough" +echo "QOM debugging $qom_cast_debug" if test "$sdl_too_old" = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -3909,6 +3915,9 @@ echo "CONFIG_UNAME_RELEASE=\"$uname_release\"" >> $config_host_mak if test "$zero_malloc" = "yes" ; then echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak fi +if test "$qom_cast_debug" = "yes" ; then + echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak +fi if test "$rbd" = "yes" ; then echo "CONFIG_RBD=y" >> $config_host_mak fi diff --git a/include/qom/object.h b/include/qom/object.h index 38f674f..63e2a40 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -615,8 +615,9 @@ Object *object_dynamic_cast(Object *obj, const char *typename); * * See object_dynamic_cast() for a description of the parameters of this * function. The only difference in behavior is that this function asserts - * instead of returning #NULL on failure. This function is not meant to be - * called directly, but only through the wrapper macro OBJECT_CHECK. + * instead of returning #NULL on failure if QOM cast debugging is enabled. + * This function is not meant to be called directly, but only through + * the wrapper macro OBJECT_CHECK. */ Object *object_dynamic_cast_assert(Object *obj, const char *typename, const char *file, int line, const char *func); @@ -666,9 +667,9 @@ Type type_register(const TypeInfo *info); * * See object_class_dynamic_cast() for a description of the parameters * of this function. The only difference in behavior is that this function - * asserts instead of returning #NULL on failure. This function is not - * meant to be called directly, but only through the wrapper macros - * OBJECT_CLASS_CHECK and INTERFACE_CHECK. + * asserts instead of returning #NULL on failure if QOM cast debugging is + * enabled. This function is not meant to be called directly, but only through + * the wrapper macros OBJECT_CLASS_CHECK and INTERFACE_CHECK. */ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *klass, const char *typename, diff --git a/qom/object.c b/qom/object.c index 1b9c5ce..f5f416b 100644 --- a/qom/object.c +++ b/qom/object.c @@ -435,12 +435,11 @@ Object *object_dynamic_cast(Object *obj, const char *typename) Object *object_dynamic_cast_assert(Object *obj, const char *typename, const char *file, int line, const char *func) { - Object *inst; - trace_object_dynamic_cast_assert(obj ? obj->class->type->name : "(null)", typename, file, line, func); - inst = object_dynamic_cast(obj, typename); +#ifdef CONFIG_QOM_CAST_DEBUG + Object *inst = object_dynamic_cast(obj, typename); if (!inst && obj) { fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n", @@ -448,7 +447,9 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename, abort(); } - return inst; + assert(obj == inst); +#endif + return obj; } ObjectClass *object_class_dynamic_cast(ObjectClass *class, @@ -509,6 +510,12 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class, trace_object_class_dynamic_cast_assert(class ? class->type->name : "(null)", typename, file, line, func); +#ifndef CONFIG_QOM_CAST_DEBUG + if (!class->interfaces) { + return class; + } +#endif + ret = object_class_dynamic_cast(class, typename); if (!ret && class) { fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n",