From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58975) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X4zzU-0008BI-1T for qemu-devel@nongnu.org; Wed, 09 Jul 2014 18:05:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X4zzN-0000BT-JJ for qemu-devel@nongnu.org; Wed, 09 Jul 2014 18:05:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:23603) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X4zzN-0000BJ-7W for qemu-devel@nongnu.org; Wed, 09 Jul 2014 18:05:21 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s69M5Ksk010312 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 9 Jul 2014 18:05:20 -0400 From: Eduardo Habkost Date: Wed, 9 Jul 2014 19:04:16 -0300 Message-Id: <1404943462-711-20-git-send-email-ehabkost@redhat.com> In-Reply-To: <1404943462-711-1-git-send-email-ehabkost@redhat.com> References: <1404943462-711-1-git-send-email-ehabkost@redhat.com> Subject: [Qemu-devel] [RFC 19/25] accel: Use target-specific accel class if available List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Target-specific accelerator subclasses are optional. If a given accelerator type needs to make it mandatory, the base class can be made abstract. Signed-off-by: Eduardo Habkost --- hw/core/accel.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/hw/core/accel.c b/hw/core/accel.c index 78e7dfc..6efe36c 100644 --- a/hw/core/accel.c +++ b/hw/core/accel.c @@ -51,11 +51,25 @@ static const TypeInfo accel_type = { }; /* Lookup AccelClass from opt_name. Returns NULL if not found */ -static AccelClass *accel_find(const char *opt_name) +static AccelClass *accel_find(const char *opt_name, const char *target_name) { char *class_name = g_strdup_printf("%s-accel", opt_name); - AccelClass *ac = ACCEL_CLASS(object_class_by_name(class_name)); + char *target_class_name = g_strdup_printf("%s-%s-accel", + target_name, opt_name); + ObjectClass *oc; + AccelClass *ac; + oc = object_class_by_name(target_class_name); + if (!oc) { + oc = object_class_by_name(class_name); + } + /* Must be a TYPE_ACCEL subclass, and not abstract */ + oc = object_class_dynamic_cast(oc, TYPE_ACCEL); + if (oc && object_class_is_abstract(oc)) { + oc = NULL; + } + ac = ACCEL_CLASS(oc); g_free(class_name); + g_free(target_class_name); return ac; } @@ -96,7 +110,7 @@ int init_accelerator(MachineState *ms, const char *target_name) p++; } p = get_opt_name(buf, sizeof(buf), p, ':'); - acc = accel_find(buf); + acc = accel_find(buf, target_name); if (!acc) { fprintf(stderr, "\"%s\" accelerator does not exist.\n", buf); continue; -- 1.9.3