Killability of ImportProjectJob

Milian Wolff mail at milianw.de
Sat Nov 20 16:50:31 UTC 2010


Hey all,

currently the ImportProjectJob is not really interruptable. It has doKill that 
just waitForFinished which can easily lead to deadlocks nowadays, since we can 
import stuff from the background bug QMetaType::invokeMethod in the 
projectmodel then. E.g.:

Thread 2 (Thread 0x7fdb25e04710 (LWP 4580)):
#0  0x00007fdb44d2f40c in pthread_cond_wait@@GLIBC_2.3.2 () from 
/lib/libpthread.so.0
#1  0x00007fdb44fb3c2b in QWaitCondition::wait(QMutex*, unsigned long) () from 
/usr/lib/libQtCore.so.4
#2  0x00007fdb44fb0665 in QSemaphore::acquire(int) () from 
/usr/lib/libQtCore.so.4
#3  0x00007fdb450a4abc in QMetaMethod::invoke(QObject*, Qt::ConnectionType, 
QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, 
QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, 
QGenericArgument, QGenericArgument, QGenericArgument) const () from 
/usr/lib/libQtCore.so.4
#4  0x00007fdb450a5728 in QMetaObject::invokeMethod(QObject*, char const*, 
Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, 
QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, 
QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, 
QGenericArgument) () from /usr/lib/libQtCore.so.4
#5  0x00007fdb42148226 in QMetaObject::invokeMethod (obj=0x17a9aa0, 
member=0x7fdb4215e472 "rowsAboutToBeInserted", 
type=Qt::BlockingQueuedConnection, val0=..., val1=..., 
    val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., 
val9=...) at /usr/include/QtCore/qobjectdefs.h:408
#6  0x00007fdb42144cb7 in KDevelop::ProjectBaseItem::appendRow 
(this=0x7fdb1016dea0, item=0x7fdb182f9d40) at 
/home/milian/projects/kde4/kdevplatform/project/projectmodel.cpp:342
#7  0x00007fdb4214377f in KDevelop::ProjectBaseItem::ProjectBaseItem 
(this=0x7fdb182f9d40, project=0x39be940, name="importImages.php", 
parent=0x7fdb1016dea0)
    at /home/milian/projects/kde4/kdevplatform/project/projectmodel.cpp:138
#8  0x00007fdb42145cfe in KDevelop::ProjectFileItem::ProjectFileItem 
(this=0x7fdb182f9d40, project=0x39be940, file=..., parent=0x7fdb1016dea0)
    at /home/milian/projects/kde4/kdevplatform/project/projectmodel.cpp:582
#9  0x00007fdb0e804177 in CustomMakeManager::parse (this=0x250aee0, 
item=0x7fdb1016dea0)
    at 
/home/milian/projects/kde4/kdevelop/projectmanagers/custommake/custommakemanager.cpp:171
#10 0x00007fdb4214da5b in KDevelop::ImportProjectJobPrivate::import 
(this=0x2c84620, folder=0x7fdb1016dea0)
    at /home/milian/projects/kde4/kdevplatform/project/importprojectjob.cpp:53
---Type <return> to continue, or q <return> to quit---
#11 0x00007fdb4214daa9 in KDevelop::ImportProjectJobPrivate::import 
(this=0x2c84620, folder=0x261d770) at 
/home/milian/projects/kde4/kdevplatform/project/importprojectjob.cpp:57
#12 0x00007fdb4214e090 in 
QtConcurrent::VoidStoredMemberFunctionPointerCall1<void, 
KDevelop::ImportProjectJobPrivate, KDevelop::ProjectFolderItem*, 
KDevelop::ProjectFolderItem*>::runFunctor (this=0x16967a0) at 
/usr/include/QtCore/qtconcurrentstoredfunctioncall.h:426
#13 0x00007fdb4214d7d0 in QtConcurrent::RunFunctionTask<void>::run 
(this=0x16967a0) at /usr/include/QtCore/qtconcurrentrunbase.h:120
#14 0x00007fdb44fa9b88 in ?? () from /usr/lib/libQtCore.so.4
#15 0x00007fdb44fb353e in ?? () from /usr/lib/libQtCore.so.4
#16 0x00007fdb44d2acb0 in start_thread () from /lib/libpthread.so.0
#17 0x00007fdb434089dd in clone () from /lib/libc.so.6
#18 0x0000000000000000 in ?? ()

Thread 1 (Thread 0x7fdb48b60760 (LWP 4287)):
#0  0x00007fdb44d2f40c in pthread_cond_wait@@GLIBC_2.3.2 () from 
/lib/libpthread.so.0
#1  0x00007fdb44fb3c2b in QWaitCondition::wait(QMutex*, unsigned long) () from 
/usr/lib/libQtCore.so.4
#2  0x00007fdb44fa3914 in QFutureInterfaceBase::waitForFinished() () from 
/usr/lib/libQtCore.so.4
#3  0x00007fdb4214d33f in KDevelop::ImportProjectJob::doKill (this=0x28ce9f0) 
at /home/milian/projects/kde4/kdevplatform/project/importprojectjob.cpp:104
#4  0x00007fdb486091e1 in KJob::kill(KJob::KillVerbosity) () from 
/usr/lib/libkdecore.so.5
#5  0x00007fdb4801433b in KDevelop::RunController::stopAllProcesses 
(this=0x196c5d0) at 
/home/milian/projects/kde4/kdevplatform/shell/runcontroller.cpp:591
#6  0x00007fdb480122d7 in KDevelop::RunController::cleanup (this=0x196c5d0) at 
/home/milian/projects/kde4/kdevplatform/shell/runcontroller.cpp:328
#7  0x00007fdb47fe57eb in KDevelop::Core::cleanup (this=0x162bf80) at 
/home/milian/projects/kde4/kdevplatform/shell/core.cpp:332
#8  0x00007fdb47fd0b84 in KDevelop::MainWindow::~MainWindow (this=0x1477e20, 
__in_chrg=<value optimized out>, __vtt_parm=<value optimized out>)
    at /home/milian/projects/kde4/kdevplatform/shell/mainwindow.cpp:127
#9  0x00007fdb47fd0c9a in KDevelop::MainWindow::~MainWindow (this=0x1477e20, 
__in_chrg=<value optimized out>, __vtt_parm=<value optimized out>)
    at /home/milian/projects/kde4/kdevplatform/shell/mainwindow.cpp:133
#10 0x00007fdb450b01c8 in QObject::event(QEvent*) () from 
/usr/lib/libQtCore.so.4
#11 0x00007fdb4429931d in QWidget::event(QEvent*) () from 
/usr/lib/libQtGui.so.4
#12 0x00007fdb4465d6db in QMainWindow::event(QEvent*) () from 
/usr/lib/libQtGui.so.4
#13 0x00007fdb4596afb3 in KXmlGuiWindow::event(QEvent*) () from 
/usr/lib/libkdeui.so.5
#14 0x00007fdb442482b4 in QApplicationPrivate::notify_helper(QObject*, 
QEvent*) () from /usr/lib/libQtGui.so.4
#15 0x00007fdb4424cdca in QApplication::notify(QObject*, QEvent*) () from 
/usr/lib/libQtGui.so.4
#16 0x00007fdb45868226 in KApplication::notify(QObject*, QEvent*) () from 
/usr/lib/libkdeui.so.5
---Type <return> to continue, or q <return> to quit---
#17 0x000000000040528c in KDevelopApplication::notify (this=0x7fff7abb9450, 
receiver=0x1477e20, event=0x31a0e80) at 
/home/milian/projects/kde4/kdevelop/app/main.cpp:90
#18 0x00007fdb4509bebc in QCoreApplication::notifyInternal(QObject*, QEvent*) 
() from /usr/lib/libQtCore.so.4
#19 0x00007fdb4509f6e5 in QCoreApplicationPrivate::sendPostedEvents(QObject*, 
int, QThreadData*) () from /usr/lib/libQtCore.so.4
#20 0x00007fdb450c6db3 in ?? () from /usr/lib/libQtCore.so.4
#21 0x00007fdb3e0a3bf3 in g_main_context_dispatch () from 
/usr/lib/libglib-2.0.so.0
#22 0x00007fdb3e0a43d0 in ?? () from /usr/lib/libglib-2.0.so.0
#23 0x00007fdb3e0a466d in g_main_context_iteration () from 
/usr/lib/libglib-2.0.so.0
#24 0x00007fdb450c6f4f in 
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () 
from /usr/lib/libQtCore.so.4
#25 0x00007fdb442ed23e in ?? () from /usr/lib/libQtGui.so.4
#26 0x00007fdb4509b252 in 
QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from 
/usr/lib/libQtCore.so.4
#27 0x00007fdb4509b49c in 
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from 
/usr/lib/libQtCore.so.4
#28 0x00007fdb4509f99b in QCoreApplication::exec() () from 
/usr/lib/libQtCore.so.4
#29 0x000000000040b774 in main (argc=3, argv=0x7fff7abbb218) at 
/home/milian/projects/kde4/kdevelop/app/main.cpp:468
(gdb)

I could add e.g. ICore::shuttingDown() calls just before all invokeMethod 
calls, but that might still deadlock sometimes (rarely) and it's imo just not 
nice.

So - has anyone an idea how to solve this properly?

Bye
-- 
Milian Wolff
mail at milianw.de
http://milianw.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20101120/d3cd6efd/attachment.sig>


More information about the KDevelop-devel mailing list