ID 375564 - Crash or deadlock due to PySide/PyQt bugs related to threading

Follow

Problem summary:

Two recently discovered high-priority PySide/PyQt bugs mean that Python threads cannot be used inside any Qt applications at all as they cause all host applications to crash (or deadlock):

  1. PYSIDE-810 - Memory corruption & crashes when the garbage collector invoked from a thread cleans up widgets
  2. PYSIDE-813 - Hard crash when emitting signal with argument into QThread

Steps to reproduce:

  1. Execute the following Python script in a Python tab with a running Katana UI session:
    • 
      import gcimport sysimport threadingimport timetry:    from PySide2 import QtWidgets    from PySide2 import QtCoreexcept:    try:        from PyQt5 import QtWidgets        from PyQt5 import QtCore    except:        try:            from PySide import QtGui            from PySide import QtCore        except:            try:                from PyQt4 import QtGui                from PyQt4 import QtCore            except:                raise ImportError('Could not import PySide or PyQt')        QtWidgets = QtGuidef gcloop():    time.sleep(1.0) # YMMV    while 1:        gc.collect()        time.sleep(0.1)def circular():    label = QtWidgets.QWidget()    o1 = [label]    o2 = [o1]    o1.append(o2)    label.show()label = QtWidgets.QWidget()label.show()tm = QtCore.QTimer()tm.timeout.connect(circular)tm.start(100)sys.modules['killer'] = threading.Thread(target=gcloop)sys.modules['killer'].start()

Expected behaviour:

New labels are created, shown, closed, and destroyed indefinitely, until Katana is quit.

Actual behaviour:

New labels are created, shown, closed, and destroyed until Katana crashes, with a stack trace similar to the following one:


#0  0x00007fda276f253d in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtCore.so.4#1  0x00007fda26a90974 in QApplication::setActiveWindow(QWidget*) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtGui.so.4#2  0x00007fda26b022d0 in QApplication::x11ProcessEvent(_XEvent*) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtGui.so.4#3  0x00007fda26b27662 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtGui.so.4#4  0x00000030db440552 in g_main_dispatch (context=0x2bc6500) at gmain.c:2449#5  g_main_context_dispatch (context=0x2bc6500) at gmain.c:3022#6  0x00000030db444d08 in g_main_context_iterate (context=0x2bc6500, block=1, dispatch=1, self=<value optimized out>) at gmain.c:3100#7  0x00000030db444ec2 in g_main_context_iteration (context=0x2bc6500, may_block=1) at gmain.c:3163#8  0x00007fda2771f015 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtCore.so.4#9  0x00007fda26b276f6 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtGui.so.4#10 0x00007fda276f11af in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtCore.so.4#11 0x00007fda276f14a5 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtCore.so.4#12 0x00007fda276f65a9 in QCoreApplication::exec() () from /workspace/opt/Foundry/Katana3.0v1/bin/libQtCore.so.4#13 0x00007fd9e56b1d50 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python/PyQt4/QtGui.so#14 0x00007fda27afaf74 in PyCFunction_Call () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#15 0x00007fda27b7f0f6 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#16 0x00007fda27b7b5da in PyEval_EvalFrameEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#17 0x00007fda27b7f40d in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#18 0x00007fda27b7f219 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#19 0x00007fda27b7b5da in PyEval_EvalFrameEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#20 0x00007fda27b7f40d in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#21 0x00007fda27b7f219 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#22 0x00007fda27b7b5da in PyEval_EvalFrameEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#23 0x00007fda27b7f40d in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#24 0x00007fda27b7f219 in ?? () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#25 0x00007fda27b7b5da in PyEval_EvalFrameEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#26 0x00007fda27b7d482 in PyEval_EvalCodeEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#27 0x00007fda27b73496 in PyEval_EvalCode () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#28 0x00007fda27b97045 in PyImport_ExecCodeModuleEx () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#29 0x00007fda27b96f0b in PyImport_ExecCodeModule () from /workspace/opt/Foundry/Katana3.0v1/bin/python2.7/lib/libpython2.7.so.1.0#30 0x0000000000417fb9 in ?? ()#31 0x000000346e41ecdd in __libc_start_main (main=0x416570, argc=1, ubp_av=0x7fff35cb2da8, init=<value optimized out>, fini=<value optimized out>, rtld_fini=<value optimized out>, stack_end=0x7fff35cb2d98) at libc-start.c:226#32 0x000000000041a1ed in ?? ()#33 0x00007fff35cb2d98 in ?? ()#34 0x000000000000001c in ?? ()#35 0x0000000000000001 in ?? ()#36 0x000000000188a970 in ?? ()#37 0x0000000000000000 in ?? ()

Workaround:

No known workaround.

Tested versions/platforms:

  • 1.0v1/CentOS 6 - Affected
  • 2.0v1/CentOS 6 - Affected
  • 3.0v1/CentOS 6 - Affected
  • 3.0v1/Ubuntu 16.04.5 - Affected
  • 3.1v1/CentOS 6 - Unaffected

Customer version/platform:

Not supplied

    We're sorry to hear that

    Please tell us why