[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] [BUG] Return value of overriden QSGMaterial::createShader() impropely destroyed before us
From:       Phil Thompson <phil () riverbankcomputing ! com>
Date:       2015-06-18 21:39:42
Message-ID: f7a040ee40f91cca6e9af045e4269dfe () riverbankcomputing ! com
[Download RAW message or body]

On 18/06/2015 7:18 pm, Vladimir Rutsky wrote:
> On Thu, Jun 18, 2015 at 8:27 PM, Phil Thompson
> <phil@riverbankcomputing.com> wrote:
>> On 16/06/2015 3:30 pm, Vladimir Rutsky wrote:
>>> 
>>> On Mon, Jun 15, 2015 at 6:33 PM, Vladimir Rutsky
>>> <rutsky.vladimir@gmail.com> wrote:
>>>> 
>>>> Hello, Phil,
>>>> 
>>>> I made an example that reproduces this bug:
>>>> https://gist.github.com/rutsky/d6332e3354972997e938
>>>> 
>>>> Plus it shows another bug: application hangs on exit on GNU/Linux.
>>>> 
>>>> If I attach to it with GDB I can see, that application is waiting 
>>>> for
>>>> some condition variable in QSGRenderLoop::cleanup().
>>>> 
>>>>     0  pthread_cond_wait@@GLIBC_2.3.2 () at
>>>> ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185
>>>>     1  0x00007f719d0f9cc3 in QWaitCondition::wait(QMutex*, unsigned
>>>> long) () from /home/bob/Qt/5.4/gcc_64/lib/libQt5Core.so.5
>>>>     2  0x00007f719e6f0acb in ?? () from
>>>> /home/bob/Qt/5.4/gcc_64/lib/libQt5Quick.so.5
>>>>     3  0x00007f719e6f12a0 in ?? () from
>>>> /home/bob/Qt/5.4/gcc_64/lib/libQt5Quick.so.5
>>>>     4  0x00007f719e6e7268 in QSGRenderLoop::cleanup() () from
>>>> /home/bob/Qt/5.4/gcc_64/lib/libQt5Quick.so.5
>>>>     5  0x00007f719d32e049 in qt_call_post_routines() () from
>>>> /home/bob/Qt/5.4/gcc_64/lib/libQt5Core.so.5
>>>>     6  0x00007f7197dc6a66 in QApplication::~QApplication() () from
>>>> /home/bob/Qt/5.4/gcc_64/lib/libQt5Widgets.so.5
>>>>     7  0x00007f7198892768 in sipQApplication::~sipQApplication
>>>> (this=0x259ba90, __in_chrg=<optimized out>) at
>>>> sipQtWidgetspart0.cpp:301912
>>>>     8  0x00007f7198892798 in sipQApplication::~sipQApplication
>>>> (this=0x259ba90, __in_chrg=<optimized out>) at
>>>> sipQtWidgetspart0.cpp:301915
>>>>     9  0x00007f7198895f31 in release_QApplication 
>>>> (sipCppV=0x259ba90)
>>>> at sipQtWidgetspart0.cpp:303524
>>>>     10 0x00007f7198895fca in dealloc_QApplication
>>>> (sipSelf=0x7f7197809168) at sipQtWidgetspart0.cpp:303538
>>>>     11 0x00007f7199d5b346 in ?? () from
>>>> /home/bob/work/proplan/env/lib/python3.4/site-packages/sip.so
>>>>     12 0x00007f7199d5c5e9 in ?? () from
>>>> /home/bob/work/proplan/env/lib/python3.4/site-packages/sip.so
>>>>     13 0x0000000000515c82 in ?? ()
>>>>     14 0x00000000004fb938 in ?? ()
>>>>     15 0x0000000000511820 in ?? ()
>>>>     16 0x00000000005117fe in ?? ()
>>>>     17 0x00000000005ae979 in ?? ()
>>>>     18 0x00000000005972bd in PyErr_PrintEx ()
>>>>     19 0x0000000000596331 in PyRun_SimpleFileExFlags ()
>>>>     20 0x00000000004cb93a in Py_Main ()
>>>>     21 0x00000000004cad1f in main ()
>>>> 
>>>> (This issue is not reproduces in Windows, since Qt 5.4 still uses 
>>>> single
>>>> threaded rendering there.)
>>>> 
>>>> 
>>>> Regards,
>>>> 
>>>> Vladimir Rutsky
>>> 
>>> 
>>> I have updated the example:
>>> https://gist.github.com/rutsky/d6332e3354972997e938
>>> 
>>> As I see, when QQuickView is being destroyed it waits until render 
>>> thread
>>> clean ups all resources, which causes custom created QSGGeometryNode
>>> to be destroyed,
>>> which asks to lock GIL, which is still locked by main thread, so it's
>>> deadlock.
>> 
>> 
>> Both problems should be fixed in tonight's snapshot.
>> 
>> I'd be interested to know how you think the ownership of the QSGNode
>> returned from updatePaintNode() should be handled. Where in the docs 
>> does it
>> say that Qt handles the lifetime of the node?
>> 
>> Thanks,
>> Phil
>> 
> 
> I made conclusion about ownership of QSGNode from example in
> QQuickItem::updatePaintNode documentation:
> http://doc.qt.io/qt-5/qquickitem.html#updatePaintNode
> 
> QSGNode *MyItem::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
> {
>     QSGSimpleRectNode *n = static_cast<QSGSimpleRectNode *>(node);
>     if (!n) {
>         n = new QSGSimpleRectNode();
>         n->setColor(Qt::red);
>     }
>     n->setRect(boundingRect());
>     return n;
> }
> 
> QSGSimpleRectNode is created on heap and wasn't stored anywere, just
> returned as QSGNode * pointer.
> 
> Now I see, that documentation has following information about QSGNode
> ownership: 
> http://doc.qt.io/qt-5/qquickitem.html#graphics-resource-handling
> 
>> A QSGNode returned from QQuickItem::updatePaintNode() is automatically 
>> deleted on the right thread at the right time.
>> Trees of QSGNode instances are managed through the use of 
>> QSGNode::OwnedByParent, which is set by default.
>> So, for the majority of custom scene graph items, no extra work will 
>> be required.
> 
> 
> So I was not completely really correct about ownership of QSGNode:
> it's defined by QSGNode::OwnedByParent flag which is set by default.

The ownership of the returned QSGNode should now be automatically 
handled correctly in tonight's snapshot.

Thanks,
Phil
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic