From patchwork Wed May 23 15:44:35 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 160955 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 133DDB6FA8 for ; Thu, 24 May 2012 01:53:42 +1000 (EST) Received: from localhost ([::1]:59708 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXDsa-00016N-0P for incoming@patchwork.ozlabs.org; Wed, 23 May 2012 11:53:40 -0400 Received: from eggs.gnu.org ([208.118.235.92]:47975) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXDsF-0000XZ-DB for qemu-devel@nongnu.org; Wed, 23 May 2012 11:53:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SXDs9-0002qM-QC for qemu-devel@nongnu.org; Wed, 23 May 2012 11:53:18 -0400 Received: from mail-pz0-f45.google.com ([209.85.210.45]:38487) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SXDs9-0002pm-E6 for qemu-devel@nongnu.org; Wed, 23 May 2012 11:53:13 -0400 Received: by dadv2 with SMTP id v2so11882906dad.4 for ; Wed, 23 May 2012 08:53:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=m3heJDJ7sqJKalg3qZaWUuFY+r7MPyZgbsxhy+fKJcI=; b=w+z/TOEOrZs3L+FW1oBtH/Rs7cX7SEO3OqhltUmxx+TKBlgUMWLm0woirlUiaqtcte KadCKCQYsGPrklsqtMUGNP/2eyJ4L4FStCVPKoVj/odEANV08gC9kT1D53udWM7+oZ2r rLajeVPBW+IAAivY/7dkdfzJg8aADedMGm0STNJ9OAd/nRzOjxq6agxYRApBmJoqRSGF R7cy6a+Kzae/tgOgQX4+9wbKOe5ziF8k9iSB6jTgnjApbxhQSIl9zYvPczBqp0nKlalF i8OtvqS+7Mx6L/g7BLEqhxWkA6MjpRoWbsNQAxI4drvym+ktAdcjgUoqP0XmH+MVfpxQ MKYQ== Received: by 10.68.219.100 with SMTP id pn4mr11378098pbc.102.1337787907340; Wed, 23 May 2012 08:45:07 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id ru4sm2193475pbc.66.2012.05.23.08.45.04 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 23 May 2012 08:45:06 -0700 (PDT) From: Paolo Bonzini To: afaerber@suse.de, qemu-devel@nongnu.org Date: Wed, 23 May 2012 17:44:35 +0200 Message-Id: <1337787881-3579-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.10.1 In-Reply-To: <1337787881-3579-1-git-send-email-pbonzini@redhat.com> References: <1337787881-3579-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.210.45 Cc: imammedo@redhat.com, peter.maydell@linaro.org Subject: [Qemu-devel] [PATCH 04/10] qom: add get_id 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 Some classes may present objects differently in errors, for example if they are not part of the composition tree or if they are not assigned an id by the user. Let them do this with a get_id method on Object, and use the method consistently where a %(device) appears in the error. Signed-off-by: Paolo Bonzini --- hw/qdev-properties.c | 6 +++--- hw/qdev.c | 15 ++++++++++++++- include/qemu/object.h | 11 +++++++++++ qom/object.c | 26 +++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index eeb950d..9a6c04a 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -931,16 +931,16 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, switch (ret) { case -EEXIST: error_set(errp, QERR_PROPERTY_VALUE_IN_USE, - object_get_typename(OBJECT(dev)), prop->name, value); + object_get_id(OBJECT(dev)), prop->name, value); break; default: case -EINVAL: error_set(errp, QERR_PROPERTY_VALUE_BAD, - object_get_typename(OBJECT(dev)), prop->name, value); + object_get_id(OBJECT(dev)), prop->name, value); break; case -ENOENT: error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND, - object_get_typename(OBJECT(dev)), prop->name, value); + object_get_id(OBJECT(dev)), prop->name, value); break; case 0: break; diff --git a/hw/qdev.c b/hw/qdev.c index e909f3b..5d6dc1f 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -259,7 +259,7 @@ void qdev_init_nofail(DeviceState *dev) { if (qdev_init(dev) < 0) { error_report("Initialization of device %s failed", - object_get_typename(OBJECT(dev))); + object_get_id(OBJECT(dev))); exit(1); } } @@ -714,6 +714,13 @@ static void device_finalize(Object *obj) } } +static const char *qdev_get_id(Object *obj) +{ + DeviceState *dev = DEVICE(obj); + + return dev->id?:object_get_typename(obj); +} + static void device_class_base_init(ObjectClass *class, void *data) { DeviceClass *klass = DEVICE_CLASS(class); @@ -744,6 +751,11 @@ Object *qdev_get_machine(void) return dev; } +static void device_class_init(ObjectClass *class, void *data) +{ + class->get_id = qdev_get_id; +} + static TypeInfo device_type_info = { .name = TYPE_DEVICE, .parent = TYPE_OBJECT, @@ -751,6 +763,7 @@ static TypeInfo device_type_info = { .instance_init = device_initfn, .instance_finalize = device_finalize, .class_base_init = device_class_base_init, + .class_init = device_class_init, .abstract = true, .class_size = sizeof(DeviceClass), }; diff --git a/include/qemu/object.h b/include/qemu/object.h index e714c2c..cb08cfa 100644 --- a/include/qemu/object.h +++ b/include/qemu/object.h @@ -239,6 +239,9 @@ struct ObjectClass { /*< private >*/ Type type; + + /*< public >*/ + const char *(*get_id)(Object *); }; /** @@ -501,6 +504,14 @@ Object *object_dynamic_cast(Object *obj, const char *typename); Object *object_dynamic_cast_assert(Object *obj, const char *typename); /** + * object_get_id: + * @obj: A derivative of #Object + * + * Returns: A string that can be used to refer to @obj. + */ +const char *object_get_id(Object *obj); + +/** * object_get_class: * @obj: A derivative of #Object * diff --git a/qom/object.c b/qom/object.c index 68a4c57..b19ef94 100644 --- a/qom/object.c +++ b/qom/object.c @@ -334,6 +334,24 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp) } } +static const char *_object_get_id(Object *obj) +{ + ObjectProperty *prop; + + QTAILQ_FOREACH(prop, &obj->properties, node) { + if (strstart(prop->type, "child<", NULL) && prop->opaque == obj) { + return prop->name; + } + } + + return ""; +} + +const char *object_get_id(Object *obj) +{ + return obj->class->get_id(obj); +} + void object_unparent(Object *obj) { if (obj->parent) { @@ -672,7 +690,7 @@ ObjectProperty *object_property_find(Object *obj, const char *name, Error **errp } } - error_set(errp, QERR_PROPERTY_NOT_FOUND, "", name); + error_set(errp, QERR_PROPERTY_NOT_FOUND, object_get_id(obj), name); return NULL; } @@ -1236,6 +1254,11 @@ static void object_instance_init(Object *obj) object_property_add_str(obj, "type", qdev_get_type, NULL, NULL); } +static void object_class_init(ObjectClass *klass, void *class_data) +{ + klass->get_id = _object_get_id; +} + static void register_types(void) { static TypeInfo interface_info = { @@ -1248,6 +1271,7 @@ static void register_types(void) .name = TYPE_OBJECT, .instance_size = sizeof(Object), .instance_init = object_instance_init, + .class_init = object_class_init, .abstract = true, };