Skip to content

Don't invoke BackgroundParser::parseComplete() twice on failure

When a job fails, ThreadWeaver::QObjectDecorator emits both failed() and done() signals. BackgroundParser::parseComplete() is connected to both. So when a ParseJob fails, parseComplete() is called twice for the same job. The most obvious consequence is the too great value of d->m_doneParseJobs.

Two classes derived from ParseJob - CMakeParseJob and QmlJsParseJob - call ParseJob::abortJob() when they are aborted, which makes ParseJob::success() return false and thus causes QObjectDecorator to emit both signals.

In order to test what happens when the bug is triggered, I edited CMakeParseJob::run() code to unconditionally call abortJob(); return; after the if (!package.isEmpty()) { line. KDevelop seems to handle this well, but there are lots of relevant debug messages in the log:

kdevplatform.language: m_doneParseJobs larger than m_maxParseJobs: 0 -1
kdevplatform.language: m_doneParseJobs larger than m_maxParseJobs: 1 0

The simple fix is to connect only to the &ThreadWeaver::QObjectDecorator::done signal. Its documentation states:

"This signal is emitted when the job has been finished (no matter if it succeeded or not)."

Merge request reports