forked from qt-creator/qt-creator
Clang: Avoid duplicate jobs without changes in-between
This could happen, e.g. with this message order:
>>> updateTranslationUnitsForEditor()
add job<1>
run job<1>
>>> updateVisibleTranslationUnits(Utf8String(), {})
>>> updateVisibleTranslationUnits(path, {path})
add job<2>
finish job<1>
run job<2> -- Ops, nothing is changed but job<2> is started
This led to an outdated translation unit (e.g. wrong highlighting).
Now JobQueue checks for duplicates in the queue and checks all the
currently running jobs.
Change-Id: I05843fddcbd21ce0489681c283227c0027ded428
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -45,8 +45,11 @@ Jobs::Jobs(Documents &documents,
|
||||
, m_client(client)
|
||||
, m_queue(documents, projectParts)
|
||||
{
|
||||
m_queue.setIsJobRunningHandler([this](const Utf8String &translationUnitId) {
|
||||
return isJobRunning(translationUnitId);
|
||||
m_queue.setIsJobRunningForTranslationUnitHandler([this](const Utf8String &translationUnitId) {
|
||||
return isJobRunningForTranslationUnit(translationUnitId);
|
||||
});
|
||||
m_queue.setIsJobRunningForJobRequestHandler([this](const JobRequest &jobRequest) {
|
||||
return isJobRunningForJobRequest(jobRequest);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -146,12 +149,21 @@ JobRequests Jobs::queue() const
|
||||
return m_queue.queue();
|
||||
}
|
||||
|
||||
bool Jobs::isJobRunning(const Utf8String &translationUnitId) const
|
||||
bool Jobs::isJobRunningForTranslationUnit(const Utf8String &translationUnitId) const
|
||||
{
|
||||
const auto hasJobRequest = [translationUnitId](const RunningJob &runningJob) {
|
||||
const auto hasTranslationUnitId = [translationUnitId](const RunningJob &runningJob) {
|
||||
return runningJob.translationUnitId == translationUnitId;
|
||||
};
|
||||
|
||||
return Utils::anyOf(m_running.values(), hasTranslationUnitId);
|
||||
}
|
||||
|
||||
bool Jobs::isJobRunningForJobRequest(const JobRequest &jobRequest) const
|
||||
{
|
||||
const auto hasJobRequest = [jobRequest](const RunningJob &runningJob) {
|
||||
return runningJob.jobRequest == jobRequest;
|
||||
};
|
||||
|
||||
return Utils::anyOf(m_running.values(), hasJobRequest);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user