summaryrefslogtreecommitdiff
path: root/src/tools/clangpchmanagerbackend
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2019-02-11 18:11:04 +0100
committerMarco Bubke <marco.bubke@qt.io>2019-02-12 14:02:36 +0000
commit846ed7c50d7b9891c1095e7b90b6f4ba4b3e414a (patch)
tree28fe338d5cccde072923646e9291fa20b9a3f1fa /src/tools/clangpchmanagerbackend
parent562b1eef5d1fc16c306b4bda088a523e12d9539a (diff)
downloadqt-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.cpp47
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,