[PyQt] PyQt5: missing GIL release in QDBusConnection::connect

Christian Häggström kalvdans at gmail.com
Tue Feb 27 20:17:21 GMT 2018


Hi PyQt mailing list,

I have encountered a hang when I try to connect to dbus via PyQt5. This 
is my code:

import sys
from PyQt5.QtCore import pyqtSlot, QObject
from PyQt5.QtDBus import QDBusConnection, QDBusMessage
from PyQt5.QtWidgets import QApplication

class Foo(QObject):
     @pyqtSlot(QDBusMessage)
     def InterfacesAdded(self, msg):
         pass

app = QApplication(sys.argv)
conn = QDBusConnection.systemBus()
foo = Foo()
conn.connect('org.freedesktop.UDisks2',
              '/org/freedesktop/UDisks2',
              'org.freedesktop.DBus.ObjectManager',
              "InterfacesAdded",
              foo.InterfacesAdded)

GDB shows the QDBusConnection thread hanging while acquiring the GIL:

#0  0x00007fc48b603786 in futex_abstimed_wait_cancelable 
(private=<optimized out>, abstime=0x7fc47fb426f0, expected=0, 
futex_word=0xa89488 <gil_cond+40>)
     at ../sysdeps/unix/sysv/linux/futex-internal.h:205
#1  __pthread_cond_wait_common (abstime=0x7fc47fb426f0, mutex=0xa89420 
<gil_mutex>, cond=0xa89460 <gil_cond>) at pthread_cond_wait.c:539
#2  __pthread_cond_timedwait (cond=cond at entry=0xa89460 <gil_cond>, 
mutex=mutex at entry=0xa89420 <gil_mutex>, 
abstime=abstime at entry=0x7fc47fb426f0) at pthread_cond_wait.c:667
#3  0x000000000054e3ac in PyCOND_TIMEDWAIT (cond=0xa89460 <gil_cond>, 
mut=0xa89420 <gil_mutex>, us=<optimized out>) at ../Python/condvar.h:103
#4  take_gil (tstate=tstate at entry=0x7fc478013010) at 
../Python/ceval_gil.h:224
#5  0x000000000054fb39 in PyEval_RestoreThread 
(tstate=tstate at entry=0x7fc478013010) at ../Python/ceval.c:368
#6  0x00000000004295d2 in PyGILState_Ensure () at ../Python/pystate.c:893
#7  0x00007fc485477b84 in sip_api_is_py_method (gil=0x7fc47fb42804, 
pymc=0x10d0729 "", sipSelf=0x7fc484f2adc8, cname=0x0, 
mname=0x7fc485195e39 <sipStrings_QtCore+23353> "connectNotify")
     at siplib.c:8294
#8  0x00007fc4850b9999 in sipQObject::connectNotify (this=0x10d0710, 
a0=...) at ./build-3.6/QtCore/sipQtCorepart8.cpp:23164
#9  0x00007fc489b6dce2 in QObjectPrivate::connectImpl(QObject const*, 
int, QObject const*, void**, QtPrivate::QSlotObjectBase*, 
Qt::ConnectionType, int const*, QMetaObject const*) ()
    from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#10 0x00007fc489b6deb2 in QObject::connectImpl(QObject const*, void**, 
QObject const*, void**, QtPrivate::QSlotObjectBase*, Qt::ConnectionType, 
int const*, QMetaObject const*) ()
    from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5

These are my installed versions on Ubuntu artful:

python3.6          3.6.3-1ubuntu1
python3-pyqt5      5.7+dfsg-6
libqt5core5a:amd64 5.9.1+dfsg-10ubuntu1
libqt5dbus5:amd64  5.9.1+dfsg-10ubuntu1

I read that only select functions will release the GIL in PyQt5 and 
maybe QDBusConnection::connect isn't one of them?

Best regards / Christian H


More information about the PyQt mailing list