PyQt5: missing GIL release in QDBusConnection::connect

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

PyQt5: missing GIL release in QDBusConnection::connect

Christian Häggström
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@entry=0xa89460 <gil_cond>,
mutex=mutex@entry=0xa89420 <gil_mutex>,
abstime=abstime@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@entry=0x7fc478013010) at
../Python/ceval_gil.h:224
#5  0x000000000054fb39 in PyEval_RestoreThread
(tstate=tstate@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
_______________________________________________
PyQt mailing list    [hidden email]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
Reply | Threaded
Open this post in threaded view
|

Re: PyQt5: missing GIL release in QDBusConnection::connect

Phil Thompson-5


> On 27 Feb 2018, at 8:17 pm, Christian Häggström <[hidden email]> wrote:
>
> 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@entry=0xa89460 <gil_cond>, mutex=mutex@entry=0xa89420 <gil_mutex>, abstime=abstime@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@entry=0x7fc478013010) at ../Python/ceval_gil.h:224
> #5  0x000000000054fb39 in PyEval_RestoreThread (tstate=tstate@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?

Should be fixed in tonight's snapshot.

Thanks,
Phil
_______________________________________________
PyQt mailing list    [hidden email]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
Reply | Threaded
Open this post in threaded view
|

Re: PyQt5: missing GIL release in QDBusConnection::connect

Christian Häggström
Den 2018-02-27 kl. 23:14, skrev Phil Thompson:
>
>> On 27 Feb 2018, at 8:17 pm, Christian Häggström <[hidden email]> wrote:
>>
>> Hi PyQt mailing list,
>>
>> I have encountered a hang when I try to connect to dbus via PyQt5.
>
> Should be fixed in tonight's snapshot.

Perfect. I applied your patch on the debian source package and rebuilt
it, and my small reproducer works now! Thanks for a super quick response
and fix.

/ Christian
_______________________________________________
PyQt mailing list    [hidden email]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt