in #135049 the file can cause a deadlock on exit: #4 0x420d9676 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/tls/libpthread.so.0 #5 0x40ad56ad in KstWaitCondition::wait (this=0x40b0c15c, mutex=0x40b0c14c, time=4294967295) at kst/src/libkst/kstwaitcondition_unix.cpp:309 #6 0x40a97ea5 in KstRWLock::writeLock (this=0x40b0c148) at kst/src/libkst/rwlock.cpp:93 #7 0x40425aa0 in KstDoc::deleteContents (this=0x8205ab0) at kst/src/libkstapp/kstdoc.cpp:803 #8 0x4041a2c0 in ~KstDoc (this=0x8205ab0) at kst/src/libkstapp/kstdoc.cpp:90 #9 0x419b7dae in ~QWidget (this=0x82074f0) at qwidget.cpp:973 #10 0x41a84a65 in ~QMainWindow (this=0x82074f0) at qmainwindow.cpp:917 #11 0x411bd374 in KMainWindow::~KMainWindow () at qcstring.h:65 #12 0x4125e4ad in KDockMainWindow::~KDockMainWindow () at qcstring.h:65 #13 0x40c35a6b in KParts::DockMainWindow::~DockMainWindow () from /opt/kde-devel/lib/libkparts.so.2 #14 0x40bde391 in KMdiMainFrm::~KMdiMainFrm () from /opt/kde-devel/lib/libkmdi.so.1 #15 0x404ab0e2 in ~KstApp (this=0x82074f0) at kst/src/libkstapp/kst.cpp:258 #16 0x0805e4d4 in main (argc=2, argv=0xbffff294) at kst/src/kst/main.cpp:821
SVN commit 592888 by staikos: Remove some deadlock cases BUG: 135171 BUG: 135176 M +15 -12 kstdoc.cpp M +5 -3 updatethread.cpp --- trunk/extragear/graphics/kst/src/libkstapp/kstdoc.cpp #592887:592888 @@ -792,14 +792,25 @@ } } + KST::dataObjectList.lock().writeLock(); + // Avoid deadlock in DataObject destructor + KstDataObjectList tmpDol = QDeepCopy<KstDataObjectList>(KST::dataObjectList); + KST::dataObjectList.clear(); + KST::dataObjectList.lock().unlock(); + tmpDol.clear(); + + KST::dataSourceList.lock().writeLock(); + KST::dataSourceList.clear(); + KST::dataSourceList.lock().unlock(); + + KST::matrixList.lock().writeLock(); + KST::matrixList.clear(); + KST::matrixList.lock().unlock(); + KST::vectorList.lock().writeLock(); KST::vectorList.clear(); KST::vectorList.lock().unlock(); - KST::matrixList.lock().writeLock(); - KST::matrixList.clear(); - KST::matrixList.lock().unlock(); - KST::scalarList.lock().writeLock(); KST::scalarList.clear(); KST::scalarList.lock().unlock(); @@ -808,14 +819,6 @@ KST::stringList.clear(); KST::stringList.lock().unlock(); - KST::dataSourceList.lock().writeLock(); - KST::dataSourceList.clear(); - KST::dataSourceList.lock().unlock(); - - KST::dataObjectList.lock().writeLock(); - KST::dataObjectList.clear(); - KST::dataObjectList.lock().unlock(); - emit updateDialogs(); } --- trunk/extragear/graphics/kst/src/libkstapp/updatethread.cpp #592887:592888 @@ -19,6 +19,8 @@ #include <assert.h> +#include <qdeepcopy.h> + #include "ksdebug.h" #include "kstdatacollection.h" @@ -234,7 +236,9 @@ KstScalar::clearScalarsDirty(); // Must do this first and take a risk of // falling slightly behind KST::scalarList.lock().readLock(); - for (KstScalarList::ConstIterator i = KST::scalarList.begin(); i != KST::scalarList.end(); ++i) { + KstScalarList sl = QDeepCopy<KstScalarList>(KST::scalarList); // avoid deadlock on exit + KST::scalarList.lock().unlock(); + for (KstScalarList::ConstIterator i = sl.begin(); i != sl.end(); ++i) { KstScalarPtr sp = *i; sp->writeLock(); @@ -246,11 +250,9 @@ } if (_done) { - KST::scalarList.lock().unlock(); return false; } } - KST::scalarList.lock().unlock(); } if (U == KstObject::UPDATE) {
Change version to 1.x