From 211aef94e6ca38df921010c06995c7b7dd4785b1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 22 Feb 2019 11:37:30 +0100 Subject: [PATCH] Clang: Share executeInLoop Change-Id: Id02902e1e7abdb8b3430e7b228547c4372a424ce Reviewed-by: Ivan Donchevskii --- src/libs/clangsupport/clangsupport-lib.pri | 1 + src/libs/clangsupport/executeinloop.h | 72 +++++++++++++++++++ .../clangpchmanagerbackendmain.cpp | 43 +---------- .../source/taskscheduler.h | 42 +---------- .../clangrefactoringbackendmain.cpp | 43 +---------- 5 files changed, 76 insertions(+), 125 deletions(-) create mode 100644 src/libs/clangsupport/executeinloop.h diff --git a/src/libs/clangsupport/clangsupport-lib.pri b/src/libs/clangsupport/clangsupport-lib.pri index 221ccfd001e..7ab8e47ac78 100644 --- a/src/libs/clangsupport/clangsupport-lib.pri +++ b/src/libs/clangsupport/clangsupport-lib.pri @@ -108,6 +108,7 @@ HEADERS += \ $$PWD/clangrefactoringservermessages.h \ $$PWD/alivemessage.h \ $$PWD/completionsmessage.h \ + $$PWD/executeinloop.h \ $$PWD/requestcompletionsmessage.h \ $$PWD/echomessage.h \ $$PWD/endmessage.h \ diff --git a/src/libs/clangsupport/executeinloop.h b/src/libs/clangsupport/executeinloop.h new file mode 100644 index 00000000000..9c3eddeb4d1 --- /dev/null +++ b/src/libs/clangsupport/executeinloop.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include +#include + +#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 diff --git a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp index 17af1a2bc31..89567b8d386 100644 --- a/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp +++ b/src/tools/clangpchmanagerbackend/clangpchmanagerbackendmain.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -72,48 +73,6 @@ using ClangBackEnd::FilePathCache; using ClangBackEnd::FilePathView; using ClangBackEnd::TimeStamp; -#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 - class PchManagerApplication final : public QCoreApplication { public: diff --git a/src/tools/clangpchmanagerbackend/source/taskscheduler.h b/src/tools/clangpchmanagerbackend/source/taskscheduler.h index 37fdc744a84..31d82ed2c4d 100644 --- a/src/tools/clangpchmanagerbackend/source/taskscheduler.h +++ b/src/tools/clangpchmanagerbackend/source/taskscheduler.h @@ -30,6 +30,7 @@ #include "queueinterface.h" #include "progresscounter.h" +#include #include #include #include @@ -149,47 +150,6 @@ private: m_futures.erase(split, m_futures.end()); } - #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 - private: std::vector m_futures; ProcessorManager &m_processorManager; diff --git a/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp b/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp index 876c047fb85..9579f760c9c 100644 --- a/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp +++ b/src/tools/clangrefactoringbackend/clangrefactoringbackendmain.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -51,48 +52,6 @@ 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;