[PyQt] Deadlock in QPyQmlObjectProxy::disconnectNotify

Phil Thompson phil at riverbankcomputing.com
Sat Mar 12 23:01:04 GMT 2016


On 12 Mar 2016, at 8:15 pm, Arjen Hiemstra <a.hiemstra at ultimaker.com> wrote:
> 
> On 11 March 2016 at 13:56, Phil Thompson <phil at riverbankcomputing.com> wrote:
>> On 10 Mar 2016, at 7:18 pm, Arjen Hiemstra <a.hiemstra at ultimaker.com> wrote:
>>> 
>>> Hi,
>>> 
>>> For some time now, we have run into a rather nasty deadlock when certain QML
>>> UI items are destroyed. It took me a while to find a minimal example where it
>>> happens but attached is some Python code that will deadlock on my machine
>>> within a few seconds after starting it. The equivalent C++ code (also
>>> attached) does not deadlock.
>>> 
>>> This happens on several machines, one of them running Arch using Qt 5.5.1,
>>> PyQt 5.5.1 and Python 3.5.1. It also happens on Mac OSX using Python 3.4, PyQt
>>> 5.4 and Qt 5.5.1 and Windows using the packages provided on the PyQt site.
>>> 
>>> The deadlock happens in the destructor of QPyQmlObjectProxy, which tries to
>>> disconnect from a signal of an object that is being destroyed. The backtrace
>>> is as follows:
>> 
>> ...you mean in the destroyNotify() of QPyQmlObjectProxy.
> 
> Yes indeed, sorry about that.
> 
>> 
>> This seems to be a timing issue rather than a logic issue. What I will probably do is just to remove the disconnectNotify() implementation on the assumption that, if the signal has been disconnected, then it's never going to be emitted. In any event I think the only time the signal will be disconnected is when the internal Qml sender is being destroyed.
> 
> Is this something I could patch locally to help test it? Just remove
> the implementation of disconnectNotify in qpyqmlobject.cpp ?

Yes - and from the .h file.

Or use the snapshot.

Phil


More information about the PyQt mailing list