Important: Please read the Qt Code of Conduct -

[SOLVED] QQmlComponent constructor hangs on pthread_cond_wait

  • Can someone else build qtdeclarative/examples/qml/referenceexamples/attached in qt5 git master and see if you can run it?

    It hangs for me, maybe a race condition? Here's a stack trace:

    @#0 0x000000356320b3dc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/
    #1 0x00007ffff6970c6f in QWaitConditionPrivate::wait (this=0x624db0, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:86
    #2 0x00007ffff69709f1 in QWaitCondition::wait (this=0x623c68, mutex=0x623c60, time=18446744073709551615) at thread/qwaitcondition_unix.cpp:158
    #3 0x00007ffff7c7576a in QQmlThreadPrivate::wait (this=0x623bf0) at qml/ftw/qqmlthread.cpp:64
    #4 0x00007ffff7c753f5 in QQmlThread::internalCallMethodInThread (this=0x623bc0, message=0x66f960) at qml/ftw/qqmlthread.cpp:311
    #5 0x00007ffff7beba30 in QQmlThread::callMethodInThread<QQmlDataBlob*, QQmlDataBlob*, QQmlDataLoaderThread> (this=0x623bc0, Member=
    (void (QQmlDataLoaderThread::*)(QQmlDataLoaderThread *, QQmlDataBlob *)) 0x7ffff7be2280 QQmlDataLoaderThread::loadThread(QQmlDataBlob*), arg=@0x7fffffffa430)
    at qtdeclarative/src/qml/qml/ftw/qqmlthread_p.h:163
    #6 0x00007ffff7be1feb in QQmlDataLoaderThread::load (this=0x623bc0, b=0x66fbd0) at qml/qqmltypeloader.cpp:731
    #7 0x00007ffff7be2684 in QQmlDataLoader::load (this=0x624a48, blob=0x66fbd0, mode=QQmlDataLoader::PreferSynchronous) at qml/qqmltypeloader.cpp:899
    #8 0x00007ffff7be51e9 in QQmlTypeLoader::getType (this=0x624a48, url=..., mode=QQmlDataLoader::PreferSynchronous) at qml/qqmltypeloader.cpp:1474
    #9 0x00007ffff7b92794 in QQmlComponentPrivate::loadUrl (this=0x66f630, newUrl=..., mode=QQmlComponent::PreferSynchronous) at qml/qqmlcomponent.cpp:681
    #10 0x00007ffff7b91f6b in QQmlComponent::QQmlComponent (this=0x7fffffffa650, engine=0x7fffffffa660, url=..., parent=0x0) at qml/qqmlcomponent.cpp:521
    #11 0x0000000000404d95 in main (argc=1, argv=0x7fffffffa968) at main.cpp:59@

    What's weird is that tests run fine (using QUICK_TEST_MAIN).

    This happens with the latest qt5 in git, built with qt5_tool -u -c -b. (edit: CentOS 6.2)



    Ok, I tried using Asynchronous compilation mode. The result is the same, but now the constructor completes, isLoading() is true, but the statusChanged signal is never emitted.

    -It appears that QQmlDataLoader::m_thread (instance of QQmlDataLoaderThread) is not running -- at least QQmlDataLoaderThread::loadThread is not called, as far as I can tell. Weird. Still investigating.-

    The thread is running, an event is posted via QQmlDataLoaderThread::callMethodInThread, but QQmlThreadPrivate::event doesn't get called. I'm going to rebuild with -no-glib to rule out some kind of compatibility problem (had to build my own at-spi2 and glib, CentOS 6.2's are too old).


    Looks like it was a glib problem after all; rebuilding Qt with -no-glib seems to have solved it. In case anyone else hits this problem, it seems that glib-2.34.0 was causing the problem.

Log in to reply