[PyQt] Infinite loop in signal bouding of PyQt when using threads.
Phil Thompson
phil at riverbankcomputing.com
Sun May 17 17:56:08 BST 2009
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
More information about the PyQt
mailing list