On 06/25/2013 06:45 AM, Daniel P. Berrange wrote:
On Mon, Jun 24, 2013 at 11:05:35PM -0400, Laine Stump wrote:
> Make a copy of the device and add the copy to the
> list. (virPCIDeviceListAdd() adds the original object to the list
> instead).
> ---
> src/libvirt_private.syms | 1 +
> src/util/virpci.c | 17 +++++++++++++++++
> src/util/virpci.h | 1 +
> 3 files changed, 19 insertions(+)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index e906742..bf9bd12 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1703,6 +1703,7 @@ virPCIDeviceGetUnbindFromStub;
> virPCIDeviceGetUsedBy;
> virPCIDeviceIsAssignable;
> virPCIDeviceListAdd;
> +virPCIDeviceListAddCopy;
> virPCIDeviceListCount;
> virPCIDeviceListDel;
> virPCIDeviceListFind;
> diff --git a/src/util/virpci.c b/src/util/virpci.c
> index cbade1b..378b4f3 100644
> --- a/src/util/virpci.c
> +++ b/src/util/virpci.c
> @@ -1705,6 +1705,23 @@ virPCIDeviceListAdd(virPCIDeviceListPtr list,
> return 0;
> }
>
> +
> +/* virPCIDeviceListAddCopy - add a *copy* of the device to this list */
> +int
> +virPCIDeviceListAddCopy(virPCIDeviceListPtr list, virPCIDevicePtr dev)
> +{
> + virPCIDevicePtr copy = virPCIDeviceCopy(dev);
> +
> + if (!copy)
> + return -1;
> + if (virPCIDeviceListAdd(list, copy) < 0) {
> + virPCIDeviceFree(copy);
> + return -1;
> + }
> + return 0;
> +}
> +
> +
> virPCIDevicePtr
> virPCIDeviceListGet(virPCIDeviceListPtr list,
> int idx)
> diff --git a/src/util/virpci.h b/src/util/virpci.h
> index 972f86b..5f80de3 100644
> --- a/src/util/virpci.h
> +++ b/src/util/virpci.h
> @@ -83,6 +83,7 @@ void virPCIDeviceReattachInit(virPCIDevice *dev);
> virPCIDeviceListPtr virPCIDeviceListNew(void);
> int virPCIDeviceListAdd(virPCIDeviceListPtr list,
> virPCIDevicePtr dev);
> +int virPCIDeviceListAddCopy(virPCIDeviceListPtr list, virPCIDevicePtr dev);
> virPCIDevicePtr virPCIDeviceListGet(virPCIDeviceListPtr list,
> int idx);
> int virPCIDeviceListCount(virPCIDeviceListPtr list);
ACK, though as a followup, it'd be nice to actually eliminate the
virPCIDeviceListAdd variant, since APIs stealing ownership of passed
in parameters have been a good source of bugs historically.
Yes, and a source of confusion (which I guess is a good part of the
cause of the bugs :-)
The *really* ugly part of all the virPCIDeviceList code is all the
places that an object isn't even stolen, but is placed on multiple lists
simultaneously.