[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 1/3] qdev: Create qdev_get_device_class() function
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PULL 1/3] qdev: Create qdev_get_device_class() function |
Date: |
Tue, 4 Nov 2014 18:30:07 +0100 |
From: Eduardo Habkost <address@hidden>
Extract the DeviceClass lookup from qdev_device_add() to a separate
function.
Signed-off-by: Eduardo Habkost <address@hidden>
Signed-off-by: Andreas Färber <address@hidden>
---
qdev-monitor.c | 70 +++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 42 insertions(+), 28 deletions(-)
diff --git a/qdev-monitor.c b/qdev-monitor.c
index fac7d17..982f3f4 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -180,6 +180,44 @@ static const char *find_typename_by_alias(const char
*alias)
return NULL;
}
+static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
+{
+ ObjectClass *oc;
+ DeviceClass *dc;
+
+ oc = object_class_by_name(*driver);
+ if (!oc) {
+ const char *typename = find_typename_by_alias(*driver);
+
+ if (typename) {
+ *driver = typename;
+ oc = object_class_by_name(*driver);
+ }
+ }
+
+ if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
+ error_setg(errp, "'%s' is not a valid device model name", *driver);
+ return NULL;
+ }
+
+ if (object_class_is_abstract(oc)) {
+ error_set(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
+ "non-abstract device type");
+ return NULL;
+ }
+
+ dc = DEVICE_CLASS(oc);
+ if (dc->cannot_instantiate_with_device_add_yet ||
+ (qdev_hotplug && !dc->hotpluggable)) {
+ error_set(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
+ "pluggable device type");
+ return NULL;
+ }
+
+ return dc;
+}
+
+
int qdev_device_help(QemuOpts *opts)
{
Error *local_err = NULL;
@@ -455,7 +493,6 @@ static BusState *qbus_find(const char *path)
DeviceState *qdev_device_add(QemuOpts *opts)
{
- ObjectClass *oc;
DeviceClass *dc;
const char *driver, *path, *id;
DeviceState *dev;
@@ -469,33 +506,10 @@ DeviceState *qdev_device_add(QemuOpts *opts)
}
/* find driver */
- oc = object_class_by_name(driver);
- if (!oc) {
- const char *typename = find_typename_by_alias(driver);
-
- if (typename) {
- driver = typename;
- oc = object_class_by_name(driver);
- }
- }
-
- if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
- qerror_report(ERROR_CLASS_GENERIC_ERROR,
- "'%s' is not a valid device model name", driver);
- return NULL;
- }
-
- if (object_class_is_abstract(oc)) {
- qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver",
- "non-abstract device type");
- return NULL;
- }
-
- dc = DEVICE_CLASS(oc);
- if (dc->cannot_instantiate_with_device_add_yet ||
- (qdev_hotplug && !dc->hotpluggable)) {
- qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver",
- "pluggable device type");
+ dc = qdev_get_device_class(&driver, &err);
+ if (err) {
+ qerror_report_err(err);
+ error_free(err);
return NULL;
}
--
1.8.4.5