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. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list