diff options
author | Marco Bubke <marco.bubke@qt.io> | 2019-02-11 18:11:04 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2019-02-12 14:02:36 +0000 |
commit | 846ed7c50d7b9891c1095e7b90b6f4ba4b3e414a (patch) | |
tree | 28fe338d5cccde072923646e9291fa20b9a3f1fa /src/tools/clangpchmanagerbackend | |
parent | 562b1eef5d1fc16c306b4bda088a523e12d9539a (diff) | |
download | qt-creator-846ed7c50d7b9891c1095e7b90b6f4ba4b3e414a.tar.gz |
ClangRefactoring: Add thread safety for progress report
Task-number: QTCREATORBUG-21950
Change-Id: Id067e23a501253f3b73671f6939164e314b5c8a9
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/tools/clangpchmanagerbackend')
-rw-r--r-- | src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp index 80bb8886aa..58d749ec3a 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp @@ -72,6 +72,48 @@ using ClangBackEnd::FilePathCache; using ClangBackEnd::FilePathView; using ClangBackEnd::TimeStamp; +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) +template<typename CallableType> +class CallableEvent : public QEvent +{ +public: + using Callable = std::decay_t<CallableType>; + 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<typename Callable> +void executeInLoop(Callable &&callable, QObject *object = QCoreApplication::instance()) +{ + if (QThread *thread = qobject_cast<QThread *>(object)) + object = QAbstractEventDispatcher::instance(thread); + + QCoreApplication::postEvent(object, + new CallableEvent<Callable>(std::forward<Callable>(callable)), + Qt::HighEventPriority); +} +#else +template<typename Callable> +void executeInLoop(Callable &&callable, QObject *object = QCoreApplication::instance()) +{ + if (QThread *thread = qobject_cast<QThread *>(object)) + object = QAbstractEventDispatcher::instance(thread); + + QMetaObject::invokeMethod(object, std::forward<Callable>(callable)); +} +#endif + class PchManagerApplication final : public QCoreApplication { public: @@ -182,8 +224,9 @@ struct Data // because we have a cycle dependency clangPchManagerServer, includeWatcher}; PrecompiledHeaderStorage<> preCompiledHeaderStorage{database}; - ClangBackEnd::ProgressCounter progressCounter{ - [&](int progress, int total) { clangPchManagerServer.setProgress(progress, total); }}; + ClangBackEnd::ProgressCounter progressCounter{[&](int progress, int total) { + executeInLoop([&] { clangPchManagerServer.setProgress(progress, total); }); + }}; ClangBackEnd::PchTaskQueue pchTaskQueue{systemTaskScheduler, projectTaskScheduler, progressCounter, |