[PyQt] Infinite loop in signal bouding of PyQt when using threads.

Alexis Boutillier alexis.boutillier at arteris.com
Mon May 18 08:42:57 BST 2009


PyQt 4.5 12/04/2009, so I will check again with last version of PyQt and 
ask you again if I still got the problem.

I didn't see the GIL fixes in the log sorry.


Phil Thompson a écrit :
> On Thu, 14 May 2009 14:15:11 +0200, Alexis Boutillier
> <alexis.boutillier at arteris.com> wrote:
>> Hi,
>>
>> We came in an infinite loop problem involving threads and PyQt.
>>
>> Sometimes, our python multi threaded program keep running at 100% of the 
>> CPU without doing anything nor displaying our widgets.
>>
>> After backtracing and searching with gdb, we found that the infinite 
>> loop occurred in the python garbage collector when the second or third 
>> generation add a pointer to the first generation which is at this moment 
>> composed of only one element and so keep looping indefinitely on that 
>> element.
>>
>> This problem arise because someone create object or change ref count of 
>> object without locking threads.
>>
>> After searching the backtrace and PyQt code, we found that the error 
>> arise when connecting signal and slots.
>> Precisely, this code (but it should be the same for other connection 
>> type) is allowed to create object without locking threads.
>>
>> qpy/QtCore/qpycore_pyqtboundsignal.cpp (line 340):
>> ---
>>      Py_BEGIN_ALLOW_THREADS
>>
>>  >>> proxy = new PyQtProxy(bs, slot_obj, &member);
>> ---
>>
>> Could you please look at it to confirm this is an error or not ?
>>
>> Here is the backtrace of the infinite loop attached.
>>
>> #0  PyErr_Occurred () at Python/errors.c:80
>> #1  0xb7eed5c5 in _PyObject_GC_New (tp=0xb29b1d18) at 
>> Modules/gcmodule.c:1370
>> #2  0xb7e8228f in PyWeakref_NewRef (ob=0xb2a8f5ec, callback=0x0) at 
>> Objects/weakrefobject.c:36
>> #3  0xb514c311 in getWeakRef (obj=0xb2a8f5ec) at qtlib.c:639
>> #4  0xb514c16a in sip_api_save_slot (sp=0x876e76c, rxObj=0xb29b1d4c, 
>> slot=0x0) at qtlib.c:540
>> #5  0xb69802fd in PyQtProxy::PyQtProxy () from 
>>
> /home/ftucky/views/Dev2x/sw/base/purchase/kit/lib/python2.6/site-packages/PyQt4/_qt.so
>> #6  0xb697effa in pyqtBoundSignal_connect () from 
>>
> /home/ftucky/views/Dev2x/sw/base/purchase/kit/lib/python2.6/site-packages/PyQt4/_qt.so
>> #7  0xb7e5ac51 in PyCFunction_Call (func=0xb2b083ac, arg=0xb71a832c, 
>> kw=0xb7f58bd0) at Objects/methodobject.c:85
>> #8  0xb7eb87a5 in PyEval_EvalFrameEx (f=0x870b7a4, throwflag=0) at 
>> Python/ceval.c:3682
>> #9  0xb7eb9f3c in PyEval_EvalCodeEx (co=0xb2a998d8, globals=0xb7f58bd0, 
>> locals=0x0, args=0x870b7a4, argcount=3, kws=0x0, kwcount=0, defs=0x0, 
>> defcount=0, closure=0x0)
>>      at Python/ceval.c:2942
>> #10 0xb7e47274 in function_call (func=0xb2a9e8ec, arg=0xb71a7144, 
>> kw=0x0) at Objects/funcobject.c:524
>>
>> Summary:
>> - Bug is linked to the presence of threads.
>> - Bug is linked to the frequency of the Python garbage collector calls. 
>> ( i.e. gc.set_threshold() )
>> - Suspected to induce an infinite loop in the garbage collector.
>> - Can appear with the former signal/slot policy.
> 
> What is the date of the snapshot you are using? I fixed some GIL issues
> with PyQtProxy on April 30th.
> 
> Phil
> 


-- 
Boutillier Alexis
Methodology engineer

Arteris SA
The Network-on-Chip Company TM
www.arteris.net

6 par Ariane Immeuble Mercure
78284 Guyancourt Cedex
France
Office: (+33) 1 61 37 38 71
Fax:    (+33) 1 61 37 38 41
Alexis.Boutillier at arteris.net


More information about the PyQt mailing list