[libvirt] libvirt-python bug: custom event loop impl calls ff callback from *Remove(Handle|Timeout)Func
Martin Kletzander
mkletzan at redhat.com
Fri Feb 3 13:04:57 UTC 2017
On Thu, Jan 19, 2017 at 01:18:12PM +0100, Wojtek Porczyk wrote:
>On Thu, Jan 19, 2017 at 11:56:36AM +0000, Daniel P. Berrange wrote:
>> On Thu, Jan 19, 2017 at 12:48:11PM +0100, Wojtek Porczyk wrote:
>> > Hello libvirt-list,
>(snip)
>> > > } else {
>> > > opaque = PyTuple_GetItem(result, 1);
>> > > ff = PyTuple_GetItem(result, 2);
>> > > cff = PyvirFreeCallback_Get(ff);
>> > > if (cff)
>> > > (*cff)(PyvirVoidPtr_Get(opaque));
>> > > retval = 0;
>> > > }
>> >
>> > This is exactly what one shoud not be doing according to documentation [1]:
>> >
>> > > If the opaque user data requires free'ing when the handle is unregistered,
>> > > then a 2nd callback can be supplied for this purpose. This callback needs to
>> > > be invoked from a clean stack. If 'ff' callbacks are invoked directly from the
>> > > virEventRemoveHandleFunc they will likely deadlock in libvirt.
>> >
>> > [1] https://libvirt.org/html/libvirt-libvirt-event.html#virEventAddHandleFunc
>> >
>(snip)
>>
>> Yes, your analysis looks correct to me. I don't think it is easy to fix
>> this in the libvirt-override.c file really, unless we were to spawn a throw
>> away thread to call "ff" in. The better approach would be for the user suppied
>> event loop impl of removeHandle to arrange to call 'ff' themselves at the
>> correct time.
>
>IIUC, this cannot be done without involving user-supplied event loop at all.
>Unless I miss something (I'm not a C programmer really), that's the
>implication of "This callback needs to be invoked from a clean stack", since
>libvirt-override.c has access to "clean stack" only via whatever is
>implemented in python.
>
>That unfortunately means the python API (specifically the expected addHandle
>signature) should be amended to include explicit ff callback to be called
>directly from the loop after removeHandleFunc returns. That's not as bad as
>it sounds, because the argument can be optional in Python, so new Python code
>could be compatible with both old and new libvirt-python, and
>libvirt-override.c could catch TypeError exception to retry the function with
>different signature for existing code. That would still work not worse than
>present, since it will still leak memory. In any case, the ff callback should
>be dropped from libvirt_virEventRemoveHandleFunc(), because again, I suppose
>all currently running implementations leak like a sieve.
>
>I have no idea how to write that in C.
>
Would you mind creating a bug in our bugzilla [1] just so we don't lose
track of this issue? Thank you very much in advance.
Martin
[1] https://bugzilla.redhat.com
>
>--
>pozdrawiam / best regards _.-._
>Wojtek Porczyk .-^' '^-.
>Invisible Things Lab |'-.-^-.-'|
> | | | |
> I do not fear computers, | '-.-' |
> I fear lack of them. '-._ : ,-'
> -- Isaac Asimov `^-^-_>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170203/bbc77423/attachment-0001.sig>
More information about the libvir-list
mailing list