[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] Free object after *Destroy in python bindings



Daniel P. Berrange wrote:
> On Mon, May 19, 2008 at 05:17:07PM -0400, Cole Robinson wrote:
>> Daniel P. Berrange wrote:
>>> On Mon, May 19, 2008 at 04:21:55PM -0400, Cole Robinson wrote:
>>>> Cole Robinson wrote:
>>>>> The patch below fixes an issue in the python bindings with the
>>>>> vir*Destroy methods. After the object is successfully destroyed,
>>>>> the payload is cleared, using 'self._o = None'. This unfortunately
>>>>> screws up virt object reference counts, as the payload should be 
>>>>> free'd using the appropriate vir*Free function.
>>>>>
>>>> Hmm, I might be wrong about this. Reading the virDomainDestroy
>>>> description in libvirt.c, destroy is supposed to free the
>>>> domain object if the operation is successful. The qemu driver
>>>> currently does not do this. In fact, from what I gather, none
>>>> of the drivers do this.
>>> The docs are wrong. Destory merely hard-kills the object being managed.
>>> It does not free memory associated with the object.
>>>
>>>> If the virDomainDestroy comment is correct, then the original
>>>> python statement is sufficient, but the drivers need to have
>>>> a few virDomainFree's added.
>>> I believe your patch is correct - python should not be dropping its 
>>> reference to the underlying C object, afte invoking the destroy method.
>>> It should be only be dropped after free is called
>> I guess it should also be asked if the python bindings should be doing
>> anything to the domain/network/... object after a destroy _at_all_.
> 
> I think destroy should work in same way as any other operation. The 
> only method call which is special is the virDomainFree().
> 
>> Shutdown and reboot don't alter the object, even undefine doesn't. The
>> original statement just seems to be compensating for the original idea
>> that Destroy was freeing the underlying object.
>>
>> Taking the statement out entirely would be a change in existing behavior,
>> but wouldn't break any existing use of the bindings and would most likely
>> prevent more memory leaks, since the automatic garbage collection would
>> now actually be able to free the object appropriately.
> 
> It would actually resolve bugs if we fixed the python objects behaviour
> here. As you say the garbage collector will then 'do the right thing'
> so it should not have any negative impact on apps to fix this issue.
> 
> Dan

Here is the correct patch then: remove any special case cleanup for the
destroy functions.

Thanks,
Cole
diff --git a/python/generator.py b/python/generator.py
index cb57bff..68a7203 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -628,12 +628,7 @@ function_classes = {}
 
 function_classes["None"] = []
 
-function_post = {
-    'virDomainDestroy': "self._o = None",
-    'virNetworkDestroy': "self._o = None",
-    'virStoragePoolDestroy': "self._o = None",
-    'virStorageVolDestroy': "self._o = None",
-}
+function_post = {}
 
 # Functions returning an integral type which need special rules to
 # check for errors and raise exceptions.

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]