duchain seems to be broken

dukju ahn dukjuahn at gmail.com
Sun May 6 13:16:47 UTC 2007


2007/5/5, Jakob Petsovits <jpetso at gmx.at>:
> On Saturday, 5. May 2007, Andreas Pakulat wrote:
> > Hi,
> >
> > somehow the duchain seems to be broken, opening a .cpp file in KDevelop
> > asserts in kateviewinternal:3180. According to Christoph Cullman its
> > probably wrong locking and indeed the assert checks that isSmartLocked()
> > is set.
>
> Ah right. This was the crash I asked you about (which did not happen on your
> system at that time), approximately two weeks ago.
>
> It's caused by a QMutexLocker which does not lock even if it really should,
> in lib/editor/editorintegrator.cpp:190 and the following lines:
>
> Range* newRange = data()->topRanges[currentUrl()][type] =
>         createRange(currentDocument()->documentRange());
> if (SmartInterface* iface = smart()) {
>     QMutexLocker lock(iface->smartMutex());
>     Q_ASSERT(newRange->isSmartRange());
>     iface->addHighlightToDocument( newRange->toSmartRange(), false );
>     newRange->toSmartRange()->addWatcher(data());
> }
>
> The line
>     iface->addHighlightToDocument( newRange->toSmartRange(), false );
> crashes, because the QMutexLocker two lines above DOES NOT LOCK the mutex.
> Check it for yourself by adding the debug lines
>
> bool smartLocked = true;
> if (iface->smartMutex()->tryLock()) {
>     iface->smartMutex()->unlock();
>     smartLocked = false;
> }
>
> directly after the QMutexLocker creation.
> (That's the code that Katepart uses to check if the mutex is locked.)

I've found the reason of error. The reason was the kdelibs/ktexteditor
The smartMutex is initialized with QMutex::Recursive mode. In case of
recursive mutex, one single thread can gain a lock again and again.
So in above code, the tryLock() can always gain a lock, and the return
value was false.

In short, the assert code which ktexteditor used was a bug. Only after
the mutex was initted with Non-Recursive more, or we change the
Q_ASSERT code in kdelibs, the error cannot be solved.




More information about the KDevelop-devel mailing list