From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45384) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RaCW8-00085B-Oy for qemu-devel@nongnu.org; Mon, 12 Dec 2011 15:30:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RaCW1-0002Kl-1E for qemu-devel@nongnu.org; Mon, 12 Dec 2011 15:30:27 -0500 Received: from cpe-70-123-132-139.austin.res.rr.com ([70.123.132.139]:49797 helo=localhost6.localdomain6) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RaCW0-0002KV-Nr for qemu-devel@nongnu.org; Mon, 12 Dec 2011 15:30:24 -0500 From: Anthony Liguori Date: Mon, 12 Dec 2011 14:29:32 -0600 Message-Id: <1323721784-704-9-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1323721784-704-1-git-send-email-aliguori@us.ibm.com> References: <1323721784-704-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH v3 08/20] qom: add link properties (v2) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Peter Maydell , Anthony Liguori , Stefan Hajnoczi , Jan Kiszka , Markus Armbruster , Luiz Capitulino Links represent an ephemeral relationship between devices. They are meant to replace the qdev concept of busses by allowing more informal relationships between devices. Links are fairly limited in their usefulness without implementing QOM-style subclassing and interfaces. Signed-off-by: Anthony Liguori --- v1 -> v2 - comments (Stefan) - maintain a reference when adding/removing a link property (Kevin) --- hw/qdev.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/qdev.h | 23 +++++++++++++++++++ 2 files changed, 97 insertions(+), 0 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 167f459..d448275 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -1200,6 +1200,80 @@ void qdev_property_add_child(DeviceState *dev, const char *name, g_free(type); } +static void qdev_get_link_property(DeviceState *dev, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + DeviceState **child = opaque; + gchar *path; + + if (*child) { + path = qdev_get_canonical_path(*child); + visit_type_str(v, &path, name, errp); + g_free(path); + } else { + path = (gchar *)""; + visit_type_str(v, &path, name, errp); + } +} + +static void qdev_set_link_property(DeviceState *dev, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + DeviceState **child = opaque; + bool ambiguous = false; + const char *type; + char *path; + + type = qdev_property_get_type(dev, name, NULL); + + visit_type_str(v, &path, name, errp); + + if (*child) { + qdev_unref(*child); + } + + if (strcmp(path, "") != 0) { + DeviceState *target; + + target = qdev_resolve_path(path, &ambiguous); + if (target) { + gchar *target_type; + + target_type = g_strdup_printf("link<%s>", target->info->name); + if (strcmp(target_type, type) == 0) { + *child = target; + qdev_ref(target); + } else { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, type); + } + + g_free(target_type); + } else { + error_set(errp, QERR_DEVICE_NOT_FOUND, path); + } + } else { + *child = NULL; + } + + g_free(path); +} + +void qdev_property_add_link(DeviceState *dev, const char *name, + const char *type, DeviceState **child, + Error **errp) +{ + gchar *full_type; + + full_type = g_strdup_printf("link<%s>", type); + + qdev_property_add(dev, name, full_type, + qdev_get_link_property, + qdev_set_link_property, + NULL, child, errp); + + g_free(full_type); +} + static gchar *qdev_get_path_in(DeviceState *parent, DeviceState *dev) { DeviceProperty *prop; diff --git a/hw/qdev.h b/hw/qdev.h index 38b36e8..4351e2e 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -547,4 +547,27 @@ DeviceState *qdev_resolve_path(const char *path, bool *ambiguous); void qdev_property_add_child(DeviceState *dev, const char *name, DeviceState *child, Error **errp); +/** + * @qdev_property_add_link - Add a link property to a device + * + * Links establish relationships between devices. Links are unidirectional + * although two links can be combined to form a bidirectional relationship + * between devices. + * + * Links form the graph in the device model. + * + * @dev - the device to add a property to + * + * @name - the name of the property + * + * @type - the qdev type of the link + * + * @child - a pointer to where the link device reference is stored + * + * @errp - if an error occurs, a pointer to an area to store the area + */ +void qdev_property_add_link(DeviceState *dev, const char *name, + const char *type, DeviceState **child, + Error **errp); + #endif -- 1.7.4.1