While executing the testcase from https://www.klayout.de/forum/discussion/2052/qabstracttablemodel-does-not-draw-checkbox-for-checkable-items#latest multiple times, the application crashes.
The reason is: when the window is re-created, Python will destroy the existing one. This happens in Py_Dealloc. However, the destruction will trigger a disconnectNotify while in Py_Dealloc and this tries to create a Python object. Apparently, Python cannot handle Py_Alloc calls during Py_Dealloc properly and the application will crash after a few rounds.
Here is the stack trace:
1 __GI_raise raise.c 50 0x7fffe5cde18b
2 __GI_abort abort.c 79 0x7fffe5cbd859
3 fatal_error pylifecycle.c 2183 0x7ffff7ba6e94
4 Py_FatalError pylifecycle.c 2193 0x7ffff7ba9c09
5 _PyObject_AssertFailed object.c 2200 0x7ffff7ab242e
6 update_refs gcmodule.c 350 0x7ffff7bd07a9
7 collect gcmodule.c 1053 0x7ffff7bd14ef
8 collect_with_callback gcmodule.c 1240 0x7ffff7bd1cf5
9 collect_generations gcmodule.c 1262 0x7ffff7bd1f79
10 _PyObject_GC_Alloc gcmodule.c 1988 0x7ffff7bd2075
11 _PyObject_GC_Malloc gcmodule.c 1998 0x7ffff7bd2c6d
12 PyType_GenericAlloc typeobject.c 1015 0x7ffff7ad055a
13 pya::object_to_python pyaConvert.cc 483 0x7fffef16510d
14 pya::object_to_python pyaConvert.cc 389 0x7fffef164db7
15 pya::reader<gsi::ObjectType>::operator() pyaMarshal.cc 784 0x7fffef18ee5b
16 gsi::call_variadic_function<pya::reader<gsi::ObjectType>, gsi::SerialArgs *, pya::PythonRef *, pya::PYAObjectBase *, gsi::ArgType, tl::Heap *>::operator() gsiTypes.h 2020 0x7fffef186fd9
17 gsi::do_on_type_impl<pya::reader, gsi::SerialArgs *, pya::PythonRef *, pya::PYAObjectBase *, gsi::ArgType, tl::Heap *> gsiTypes.h 2168 0x7fffef18696e
18 gsi::do_on_type<pya::reader>::operator()<gsi::SerialArgs *, pya::PythonRef *, pya::PYAObjectBase *, gsi::ArgType, tl::Heap *> gsiTypes.h 2381 0x7fffef170403
19 pya::pop_arg pyaMarshal.cc 805 0x7fffef16f1f2
20 pya::Callee::call pyaObject.cc 148 0x7fffef192aa2
21 gsi::Callback::call_int gsiCallback.h 70 0x7fffefa16a6c
22 gsi::Callback::issue<QAbstractTableModel_Adaptor, QMetaMethod const&> gsiCallbackVar.h 38 0x7fffefb3f717
23 QAbstractTableModel_Adaptor::disconnectNotify gsiDeclQAbstractTableModel.cc 1140 0x7fffefb38018
24 QObject::~QObject qobject.cpp 1022 0x7fffe653d58b
25 QItemSelectionModel::~QItemSelectionModel qitemselectionmodel.cpp 1175 0x7fffe64c4e0d
26 QObjectPrivate::deleteChildren qobject.cpp 2017 0x7fffe6532eee
27 QWidget::~QWidget qwidget.cpp 1696 0x7fffe76b8c29
28 QTableView_Adaptor::~QTableView_Adaptor gsiDeclQTableView.cc 2861 0x7fffeb21dd6b
29 QTableView_Adaptor::~QTableView_Adaptor gsiDeclQTableView.cc 2861 0x7fffeb21dddc
30 QObjectPrivate::deleteChildren qobject.cpp 2017 0x7fffe6532eee
31 QWidget::~QWidget qwidget.cpp 1696 0x7fffe76b8c29
32 QMainWindow_Adaptor::~QMainWindow_Adaptor gsiDeclQMainWindow.cc 2066 0x7fffeabde609
33 QMainWindow_Adaptor::~QMainWindow_Adaptor gsiDeclQMainWindow.cc 2066 0x7fffeabde66c
34 gsi::_destroy<QMainWindow_Adaptor, true>::call gsiClass.h 292 0x7fffeabfde9b
35 gsi::Class<QMainWindow_Adaptor, gsi::NoAdaptorTag>::destroy gsiClass.h 588 0x7fffeabfd2f1
36 pya::PYAObjectBase::~PYAObjectBase pyaObject.cc 209 0x7fffef193591
37 pya::pya_object_deallocate pyaModule.cc 636 0x7fffef1a50e2
38 subtype_dealloc typeobject.c 1292 0x7ffff7accd43
39 _Py_Dealloc object.c 2215 0x7ffff7ab1c96
40 _Py_DECREF object.h 478 0x7ffff7a9d795
41 _Py_XDECREF object.h 541 0x7ffff7a9d795
42 insertdict dictobject.c 1102 0x7ffff7a9d795
43 PyDict_SetItem dictobject.c 1545 0x7ffff7a9e75a
44 _PyEval_EvalFrameDefault ceval.c 2292 0x7ffff7b6367c
45 PyEval_EvalFrameEx ceval.c 741 0x7ffff7b5bd1d
46 _PyEval_EvalCodeWithName ceval.c 4298 0x7ffff7b5c931
47 PyEval_EvalCodeEx ceval.c 4327 0x7ffff7b5cabb
48 PyEval_EvalCode ceval.c 718 0x7ffff7b5caed
49 pya::PythonInterpreter::eval_string pya.cc 499 0x7fffef15912d
50 lym::Macro::run lymMacro.cc 1066 0x7ffff40f90a1
51 lay::MacroEditorDialog::run layMacroEditorDialog.cc 3606 0x7ffff22b985a
52 lay::MacroEditorDialog::run_this_button_clicked layMacroEditorDialog.cc 3529 0x7ffff22b9d8e
53 lay::MacroEditorDialog::qt_static_metacall moc_layMacroEditorDialog.cpp 316 0x7ffff24af9a3
54 QMetaObject::activate qobject.cpp 3804 0x7fffe65351d0
55 QAbstractButton::clicked moc_qabstractbutton.cpp 312 0x7fffe776f806
56 QAbstractButtonPrivate::emitClicked qabstractbutton.cpp 414 0x7fffe776fa2e
57 QAbstractButtonPrivate::click qabstractbutton.cpp 407 0x7fffe7770e73
58 QAbstractButton::mouseReleaseEvent qabstractbutton.cpp 1011 0x7fffe7771035
59 QToolButton::mouseReleaseEvent qtoolbutton.cpp 622 0x7fffe78645fe
60 QWidget::event qwidget.cpp 8981 0x7fffe76bd2b6
61 QAbstractButton::event qabstractbutton.cpp 968 0x7fffe7772273
62 QToolButton::event qtoolbutton.cpp 1001 0x7fffe78646a8
63 QApplicationPrivate::notify_helper qapplication.cpp 3700 0x7fffe767aa66
64 QApplication::notify qapplication.cpp 3160 0x7fffe7684343
65 lay::GuiApplication::notify layApplication.cc 1356 0x7ffff22271f9
66 QCoreApplication::notifyInternal2 qobject.h 142 0x7fffe650980a
67 QApplicationPrivate::sendMouseEvent qapplication.cpp 2646 0x7fffe7683457
68 QWidgetWindow::handleMouseEvent atomic_base.h 413 0x7fffe76d935d
69 QWidgetWindow::event qwidgetwindow.cpp 289 0x7fffe76dc1ec
70 QWidgetWindow::event qwidgetwindow.cpp 232 0x7fffe76dc1ec
71 QApplicationPrivate::notify_helper qapplication.cpp 3700 0x7fffe767aa66
72 QApplication::notify qapplication.cpp 3446 0x7fffe76840f0
73 lay::GuiApplication::notify layApplication.cc 1356 0x7ffff22271f9
74 QCoreApplication::notifyInternal2 qobject.h 142 0x7fffe650980a
75 QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent *) 0x7fffe6f327d3
76 QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent *) 0x7fffe6f3410b
77 QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) 0x7fffe6f0e35b
78 ?? 0x7fffdf10c32e
79 g_main_context_dispatch 0x7fffe534817d
80 ?? 0x7fffe5348400
81 g_main_context_iteration 0x7fffe53484a3
82 QEventDispatcherGlib::processEvents qeventdispatcher_glib.cpp 422 0x7fffe6561435
83 QEventLoop::exec qflags.h 140 0x7fffe65083ab
84 QCoreApplication::exec qflags.h 120 0x7fffe6510116
85 lay::GuiApplication::exec layApplication.cc 1449 0x7ffff2227c08
86 lay::ApplicationBase::run layApplication.cc 1194 0x7ffff2226829
87 klayout_main_cont klayout.cc 314 0x404726
88 rba::run_app_func rba.cc 1907 0x7fffef2e1724
89 ?? 0x7ffff787d026
90 ?? 0x7ffff7889dab
91 ?? 0x7ffff7870406
92 ?? 0x7ffff78810ba
93 rb_vm_exec 0x7ffff7887870
94 ?? 0x7ffff7718491
95 ruby_run_node 0x7ffff771d2ee
96 rba::RubyInterpreter::initialize rba.cc 2033 0x7fffef2e16a3
97 klayout_main klayout.cc 244 0x403f77
98 main klayout.cc 144 0x403a07
A solution might be to postpone the destruction using "deleteLater" rather than immediate delete.
A workaround is to explicitly delete the "wnd" window with "wnd._destroy()". This will execute the destructor code outside "Py_Dealloc".
While executing the testcase from https://www.klayout.de/forum/discussion/2052/qabstracttablemodel-does-not-draw-checkbox-for-checkable-items#latest multiple times, the application crashes.
The reason is: when the window is re-created, Python will destroy the existing one. This happens in Py_Dealloc. However, the destruction will trigger a disconnectNotify while in Py_Dealloc and this tries to create a Python object. Apparently, Python cannot handle Py_Alloc calls during Py_Dealloc properly and the application will crash after a few rounds.
Here is the stack trace:
A solution might be to postpone the destruction using "deleteLater" rather than immediate delete.
A workaround is to explicitly delete the "wnd" window with "wnd._destroy()". This will execute the destructor code outside "Py_Dealloc".