Hi, Another issue popped up when porting our code to new style signal slots.
it appears the deadlock occurs when one thread is emitting using a pyqtSignal object, while another thread is connecting the same pyqtSignal object to a slot, this is the pseudocode for the connection : class(...): def __init__(...): self.rsh.entity_update_signal.connect( self.handle_entity_update ) @QtCore.pyqtSlot( object, object ) def handle_entity_update( self, sender, entity ): ... Are these operations supposed to be thread safe or am I missing something ? Thanks a lot, Erik PS 1 : using pyqt 4.7.2 on Ubuntu PS 2 : stack traces A debugging session in GDB shows both threads waiting : The thread that is making the connection : #0 0x0012d422 in __kernel_vsyscall () #1 0x00138015 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/tls/i686/cmov/libpthread.so.0 #2 0x006a48c2 in QMutexPrivate::wait (this=0x8b652b0, timeout=-1) at thread/qmutex_unix.cpp:84 #3 0x006a0072 in QMutex::lock (this=0x8b63768) at thread/qmutex.cpp:205 #4 0x007b9dec in QOrderedMutexLocker::relock (sender=0x8362030, signal_index=2, receiver=0xb36795f0, method_index=27, type=0, types=0x0) at ../../include/QtCore/private/../../../src/corelib/thread/qorderedmutexlocker_p.h:82 #5 QOrderedMutexLocker (sender=0x8362030, signal_index=2, receiver=0xb36795f0, method_index=27, type=0, types=0x0) at ../../include/QtCore/private/../../../src/corelib/thread/qorderedmutexlocker_p.h:72 #6 QMetaObjectPrivate::connect (sender=0x8362030, signal_index=2, receiver=0xb36795f0, method_index=27, type=0, types=0x0) at kernel/qobject.cpp:2908 #7 0x007ba3b2 in QObject::connect (sender=0x8362030, signal=0x886dff0 "2entity_update_signal(PyQt_PyObject,PyQt_PyObject)", receiver=0xb36795f0, method=0xb388b018 "1handle_entity_update(PyQt_PyObject,PyQt_PyObject)", type=Qt::AutoConnection) at kernel/qobject.cpp:2607 #8 0x005a2f46 in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #9 0x005a39e6 in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #10 0x080e0a21 in call_function (f=warning: can't find linker symbol for virtual table for `(null)' value warning: can't find linker symbol for virtual table for `(null)' value Frame 0xb4cb6474, for file camelot/view/proxy/collection_proxy.py, line 228, in __init__ The thread that is emitting the signal : #1 0x0013a245 in sem_wait@@GLIBC_2.1 () from /lib/tls/i686/cmov/libpthread.so.0 #2 0x0810abe8 in PyThread_acquire_lock (lock=0x8322d18, waitflag=1) at ../Python/thread_pthread.h:349 #3 0x080dbe9c in PyEval_RestoreThread (tstate=0x8878c98) at ../Python/ceval.c:353 #4 0x080fdc78 in PyGILState_Ensure () at ../Python/pystate.c:592 #5 0x005a6a06 in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #6 0x005a295b in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #7 0x007b23d8 in QMetaType::construct (type=256, copy=0xb6abdbc0) at kernel/qmetatype.cpp:1116 #8 0x007b91cc in queued_activate (sender=<value optimized out>, signal=<value optimized out>, c=0xba47c38, argv=0xb515ef98, semaphore=0x0) at kernel/qobject.cpp:3166 #9 0x007bb2b1 in QMetaObject::activate (sender=0x8362030, m=0x8890de8, local_signal_index=0, argv=0xb515ef98) at kernel/qobject.cpp:3266 #10 0x007bb9ea in QMetaObject::activate (sender=0x8362030, signal_index=4, argv=0xb515ef98) at kernel/qobject.cpp:3346 #11 0x007bba2b in QMetaObject::activate (sender=0x8362030, from_signal_index=4, to_signal_index=4, argv=0xb515ef98) at kernel/qobject.cpp:3204 #12 0x005a9da4 in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #13 0x005a2aec in ?? () from /usr/lib/pymodules/python2.6/PyQt4/QtCore.so #14 0x080e0a21 in call_function (f=warning: can't find linker symbol for virtual table for `(null)' value _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt