diff mbox

[v3,001/197] qom: add a reference count to qdev objects

Message ID 1323721273-32404-2-git-send-email-aliguori@us.ibm.com
State New
Headers show

Commit Message

Anthony Liguori Dec. 12, 2011, 8:17 p.m. UTC
To ensure that a device isn't removed from the graph until all of its links are
broken.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 hw/qdev.c |   16 ++++++++++++++++
 hw/qdev.h |   26 ++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)

Comments

Anthony Liguori Dec. 12, 2011, 8:28 p.m. UTC | #1
On 12/12/2011 02:17 PM, Anthony Liguori wrote:
> To ensure that a device isn't removed from the graph until all of its links are
> broken.
>
> Signed-off-by: Anthony Liguori<aliguori@us.ibm.com>

Sorry, my mail script went awry :-(

Ignore this series.

Regards,

Anthony Liguori

> ---
>   hw/qdev.c |   16 ++++++++++++++++
>   hw/qdev.h |   26 ++++++++++++++++++++++++++
>   2 files changed, 42 insertions(+), 0 deletions(-)
>
> diff --git a/hw/qdev.c b/hw/qdev.c
> index 106407f..fdc9843 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -323,6 +323,11 @@ int qdev_unplug(DeviceState *dev)
>       }
>       assert(dev->info->unplug != NULL);
>
> +    if (dev->ref != 0) {
> +        qerror_report(QERR_DEVICE_IN_USE, dev->id?:"");
> +        return -1;
> +    }
> +
>       qdev_hot_removed = true;
>
>       return dev->info->unplug(dev);
> @@ -962,3 +967,14 @@ char* qdev_get_fw_dev_path(DeviceState *dev)
>
>       return strdup(path);
>   }
> +
> +void qdev_ref(DeviceState *dev)
> +{
> +    dev->ref++;
> +}
> +
> +void qdev_unref(DeviceState *dev)
> +{
> +    g_assert(dev->ref>  0);
> +    dev->ref--;
> +}
> diff --git a/hw/qdev.h b/hw/qdev.h
> index 36a4198..2397b4e 100644
> --- a/hw/qdev.h
> +++ b/hw/qdev.h
> @@ -45,6 +45,12 @@ struct DeviceState {
>       QTAILQ_ENTRY(DeviceState) sibling;
>       int instance_id_alias;
>       int alias_required_for_version;
> +
> +    /**
> +     * This tracks the number of references between devices.  See @qdev_ref for
> +     * more information.
> +     */
> +    uint32_t ref;
>   };
>
>   typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent);
> @@ -329,4 +335,24 @@ char *qdev_get_fw_dev_path(DeviceState *dev);
>   /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
>   extern struct BusInfo system_bus_info;
>
> +/**
> + * @qdev_ref
> + *
> + * Increase the reference count of a device.  A device cannot be freed as long
> + * as its reference count is greater than zero.
> + *
> + * @dev - the device
> + */
> +void qdev_ref(DeviceState *dev);
> +
> +/**
> + * @qdef_unref
> + *
> + * Decrease the reference count of a device.  A device cannot be freed as long
> + * as its reference count is greater than zero.
> + *
> + * @dev - the device
> + */
> +void qdev_unref(DeviceState *dev);
> +
>   #endif
diff mbox

Patch

diff --git a/hw/qdev.c b/hw/qdev.c
index 106407f..fdc9843 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -323,6 +323,11 @@  int qdev_unplug(DeviceState *dev)
     }
     assert(dev->info->unplug != NULL);
 
+    if (dev->ref != 0) {
+        qerror_report(QERR_DEVICE_IN_USE, dev->id?:"");
+        return -1;
+    }
+
     qdev_hot_removed = true;
 
     return dev->info->unplug(dev);
@@ -962,3 +967,14 @@  char* qdev_get_fw_dev_path(DeviceState *dev)
 
     return strdup(path);
 }
+
+void qdev_ref(DeviceState *dev)
+{
+    dev->ref++;
+}
+
+void qdev_unref(DeviceState *dev)
+{
+    g_assert(dev->ref > 0);
+    dev->ref--;
+}
diff --git a/hw/qdev.h b/hw/qdev.h
index 36a4198..2397b4e 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -45,6 +45,12 @@  struct DeviceState {
     QTAILQ_ENTRY(DeviceState) sibling;
     int instance_id_alias;
     int alias_required_for_version;
+
+    /**
+     * This tracks the number of references between devices.  See @qdev_ref for
+     * more information.
+     */
+    uint32_t ref;
 };
 
 typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent);
@@ -329,4 +335,24 @@  char *qdev_get_fw_dev_path(DeviceState *dev);
 /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
 extern struct BusInfo system_bus_info;
 
+/**
+ * @qdev_ref
+ *
+ * Increase the reference count of a device.  A device cannot be freed as long
+ * as its reference count is greater than zero.
+ *
+ * @dev - the device
+ */
+void qdev_ref(DeviceState *dev);
+
+/**
+ * @qdef_unref
+ *
+ * Decrease the reference count of a device.  A device cannot be freed as long
+ * as its reference count is greater than zero.
+ *
+ * @dev - the device
+ */
+void qdev_unref(DeviceState *dev);
+
 #endif