diff --git a/src/libs/clangsupport/progresscounter.h b/src/libs/clangsupport/progresscounter.h index fbdc9dda456..449754f9149 100644 --- a/src/libs/clangsupport/progresscounter.h +++ b/src/libs/clangsupport/progresscounter.h @@ -26,6 +26,7 @@ #pragma once #include +#include namespace ClangBackEnd { @@ -33,6 +34,7 @@ class ProgressCounter { public: using SetProgressCallback = std::function; + using Lock = std::lock_guard; ProgressCounter(SetProgressCallback &&progressCallback) : m_progressCallback(std::move(progressCallback)) @@ -40,6 +42,8 @@ public: void addTotal(int total) { + Lock lock(m_mutex); + if (total) { m_total += total; @@ -49,6 +53,8 @@ public: void removeTotal(int total) { + Lock lock(m_mutex); + if (total) { m_total -= total; @@ -58,6 +64,8 @@ public: void addProgress(int progress) { + Lock lock(m_mutex); + if (progress) { m_progress += progress; @@ -65,6 +73,21 @@ public: } } + int total() const + { + Lock lock(m_mutex); + + return m_total; + } + + int progress() const + { + Lock lock(m_mutex); + + return m_total; + } + +private: void sendProgress() { m_progressCallback(m_progress, m_total); @@ -75,17 +98,8 @@ public: } } - int total() const - { - return m_total; - } - - int progress() const - { - return m_total; - } - private: + mutable std::mutex m_mutex; std::function m_progressCallback; int m_progress = 0; int m_total = 0; diff --git a/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp b/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp index 23a127c17f2..876c047fb85 100644 --- a/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp +++ b/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp @@ -51,6 +51,48 @@ using ClangBackEnd::RefactoringDatabaseInitializer; using ClangBackEnd::ConnectionServer; using ClangBackEnd::SymbolIndexing; +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) +template +class CallableEvent : public QEvent +{ +public: + using Callable = std::decay_t; + CallableEvent(Callable &&callable) + : QEvent(QEvent::None) + , callable(std::move(callable)) + {} + CallableEvent(const Callable &callable) + : QEvent(QEvent::None) + , callable(callable) + {} + + ~CallableEvent() { callable(); } + +public: + Callable callable; +}; + +template +void executeInLoop(Callable &&callable, QObject *object = QCoreApplication::instance()) +{ + if (QThread *thread = qobject_cast(object)) + object = QAbstractEventDispatcher::instance(thread); + + QCoreApplication::postEvent(object, + new CallableEvent(std::forward(callable)), + Qt::HighEventPriority); +} +#else +template +void executeInLoop(Callable &&callable, QObject *object = QCoreApplication::instance()) +{ + if (QThread *thread = qobject_cast(object)) + object = QAbstractEventDispatcher::instance(thread); + + QMetaObject::invokeMethod(object, std::forward(callable)); +} +#endif + QStringList processArguments(QCoreApplication &application) { QCommandLineParser parser; @@ -95,7 +137,14 @@ struct Data // because we have a cycle dependency FilePathCaching filePathCache{database}; GeneratedFiles generatedFiles; RefactoringServer clangCodeModelServer{symbolIndexing, filePathCache, generatedFiles}; - SymbolIndexing symbolIndexing{database, filePathCache, generatedFiles, [&] (int progress, int total) { clangCodeModelServer.setProgress(progress, total); }}; + SymbolIndexing symbolIndexing{database, + filePathCache, + generatedFiles, + [&](int progress, int total) { + executeInLoop([&] { + clangCodeModelServer.setProgress(progress, total); + }); + }}; }; #ifdef Q_OS_WIN diff --git a/tests/unit/unittest/commandlinebuilder-test.cpp b/tests/unit/unittest/commandlinebuilder-test.cpp index 3ec2b032246..3d684e10bca 100644 --- a/tests/unit/unittest/commandlinebuilder-test.cpp +++ b/tests/unit/unittest/commandlinebuilder-test.cpp @@ -417,7 +417,7 @@ TYPED_TEST(CommandLineBuilder, C18) Builder builder{this->emptyProjectInfo, {}, InputFileType::Header, "/source/file.c"}; - ASSERT_THAT(builder.commandLine, Contains("-std=c18")); + ASSERT_THAT(builder.commandLine, Contains("-std=c17")); } TYPED_TEST(CommandLineBuilder, GnuC89) @@ -461,7 +461,7 @@ TYPED_TEST(CommandLineBuilder, GnuC18) Builder builder{this->emptyProjectInfo, {}, InputFileType::Header, "/source/file.c"}; - ASSERT_THAT(builder.commandLine, Contains("-std=gnu18")); + ASSERT_THAT(builder.commandLine, Contains("-std=gnu17")); } TYPED_TEST(CommandLineBuilder, IncludesOrder)