From d65e47b5c6d21f58f40b5b8d468ff612fd2fe5b0 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 17 Dec 2021 19:54:37 +0100 Subject: [PATCH] Revert "Use QtcProcess for clangbackend" This reverts commit 8724a4efbb065d4a146cb35929870d3715132127. The above commit made code completion 3-4x slower on Windows, and 8x slower on macOS. Fixes: QTCREATORBUG-26754 Change-Id: I02424a40e10de2baf3fd01f19f9094c8e82f684a Reviewed-by: hjk Reviewed-by: Reviewed-by: Marco Bubke Reviewed-by: Cristian Adam --- src/libs/clangsupport/connectionclient.cpp | 22 ++++++------- src/libs/clangsupport/connectionclient.h | 19 ++++++------ src/libs/clangsupport/processcreator.cpp | 36 +++++++++------------- src/libs/clangsupport/processcreator.h | 12 +++----- src/libs/clangsupport/processhandle.h | 6 ++-- tests/unit/unittest/CMakeLists.txt | 4 --- tests/unit/unittest/unittest.pro | 4 --- tests/unit/unittest/unittest.qbs | 4 --- tests/unit/unittest/unittests-main.cpp | 6 +--- 9 files changed, 43 insertions(+), 70 deletions(-) diff --git a/src/libs/clangsupport/connectionclient.cpp b/src/libs/clangsupport/connectionclient.cpp index ff841f33d02..07754a9490a 100644 --- a/src/libs/clangsupport/connectionclient.cpp +++ b/src/libs/clangsupport/connectionclient.cpp @@ -36,8 +36,6 @@ #include #include -using namespace Utils; - namespace ClangBackEnd { ConnectionClient::ConnectionClient(const QString &connectionName) @@ -161,7 +159,7 @@ void ConnectionClient::restartProcessIfTimerIsNotResettedAndSocketIsEmpty() restartProcessAsynchronously(); } -void ConnectionClient::endProcess(QtcProcess *process) +void ConnectionClient::endProcess(QProcess *process) { if (isProcessRunning(process) && isConnected()) { sendEndMessage(); @@ -169,15 +167,15 @@ void ConnectionClient::endProcess(QtcProcess *process) } } -void ConnectionClient::terminateProcess(QtcProcess *process) +void ConnectionClient::terminateProcess(QProcess *process) { - if (!HostOsInfo::isWindowsHost() && isProcessRunning()) { + if (!Utils::HostOsInfo::isWindowsHost() && isProcessRunning()) { process->terminate(); process->waitForFinished(1000); } } -void ConnectionClient::killProcess(QtcProcess *process) +void ConnectionClient::killProcess(QProcess *process) { if (isProcessRunning(process)) { process->kill(); @@ -215,7 +213,7 @@ void ConnectionClient::resetTemporaryDirectory() m_processCreator.resetTemporaryDirectory(); } -void ConnectionClient::initializeProcess(QtcProcess *process) +void ConnectionClient::initializeProcess(QProcess *process) { connectStandardOutputAndError(process); @@ -301,7 +299,7 @@ bool ConnectionClient::waitForConnected() } -QtcProcess *ConnectionClient::processForTestOnly() +QProcess *ConnectionClient::processForTestOnly() { getProcessFromFuture(); @@ -313,15 +311,15 @@ QIODevice *ConnectionClient::ioDevice() return m_localSocket; } -bool ConnectionClient::isProcessRunning(QtcProcess *process) +bool ConnectionClient::isProcessRunning(QProcess *process) { return process && process->state() == QProcess::Running; } -void ConnectionClient::connectStandardOutputAndError(QtcProcess *process) const +void ConnectionClient::connectStandardOutputAndError(QProcess *process) const { - connect(process, &QtcProcess::readyReadStandardOutput, this, &ConnectionClient::printStandardOutput); - connect(process, &QtcProcess::readyReadStandardError, this, &ConnectionClient::printStandardError); + connect(process, &QProcess::readyReadStandardOutput, this, &ConnectionClient::printStandardOutput); + connect(process, &QProcess::readyReadStandardError, this, &ConnectionClient::printStandardError); } void ConnectionClient::connectLocalSocketError() const diff --git a/src/libs/clangsupport/connectionclient.h b/src/libs/clangsupport/connectionclient.h index aae1864ff5b..258bb323d13 100644 --- a/src/libs/clangsupport/connectionclient.h +++ b/src/libs/clangsupport/connectionclient.h @@ -28,7 +28,6 @@ #include "clangcodemodelserverproxy.h" #include "lineprefixer.h" #include "processcreator.h" -#include "processhandle.h" #include #include @@ -38,7 +37,9 @@ #include #include -namespace Utils { class QtcProcess; } +QT_BEGIN_NAMESPACE +class QProcess; +QT_END_NAMESPACE class Utf8String; class Utf8StringVector; @@ -76,7 +77,7 @@ public: bool waitForEcho(); bool waitForConnected(); - Utils::QtcProcess *processForTestOnly(); + QProcess *processForTestOnly(); signals: void connectedToLocalSocket(); @@ -102,22 +103,22 @@ protected: virtual void newConnectedServer(QLocalSocket *localSocket) = 0; private: - static bool isProcessRunning(Utils::QtcProcess *process); + static bool isProcessRunning(QProcess *process); void finishProcess(QProcessUniquePointer &&process); - void endProcess(Utils::QtcProcess *process); - void terminateProcess(Utils::QtcProcess *process); - void killProcess(Utils::QtcProcess *process); + void endProcess(QProcess *process); + void terminateProcess(QProcess *process); + void killProcess(QProcess *process); void finishConnection(); void printLocalSocketError(QLocalSocket::LocalSocketError socketError); void printStandardOutput(); void printStandardError(); - void initializeProcess(Utils::QtcProcess *process); + void initializeProcess(QProcess *process); void resetTemporaryDirectory(); void connectLocalSocketDisconnected(); void disconnectLocalSocketDisconnected(); - void connectStandardOutputAndError(Utils::QtcProcess *process) const; + void connectStandardOutputAndError(QProcess *process) const; void connectLocalSocketError() const; void connectAliveTimer(); void connectNewConnection(); diff --git a/src/libs/clangsupport/processcreator.cpp b/src/libs/clangsupport/processcreator.cpp index c0b9393607d..ad0d4b78840 100644 --- a/src/libs/clangsupport/processcreator.cpp +++ b/src/libs/clangsupport/processcreator.cpp @@ -28,15 +28,10 @@ #include "processexception.h" #include "processstartedevent.h" -#include -#include - #include #include #include -using namespace Utils; - namespace ClangBackEnd { using namespace std::chrono_literals; @@ -61,7 +56,7 @@ void ProcessCreator::setArguments(const QStringList &arguments) m_arguments = arguments; } -void ProcessCreator::setEnvironment(const Environment &environment) +void ProcessCreator::setEnvironment(const Utils::Environment &environment) { m_environment = environment; } @@ -70,11 +65,10 @@ std::future ProcessCreator::createProcess() const { return std::async(std::launch::async, [&] { checkIfProcessPathExists(); - auto process = QProcessUniquePointer(new QtcProcess(ProcessMode::Writer)); - process->setProcessChannelMode(QProcess::ForwardedChannels); - process->setEnvironment(processEnvironment()); - process->setCommand(CommandLine(FilePath::fromString(m_processPath), m_arguments)); - process->start(); + auto process = QProcessUniquePointer(new QProcess); + process->setProcessChannelMode(QProcess::QProcess::ForwardedChannels); + process->setProcessEnvironment(processEnvironment()); + process->start(m_processPath, m_arguments); process->waitForStarted(5000); checkIfProcessWasStartingSuccessful(process.get()); @@ -101,13 +95,13 @@ void ProcessCreator::checkIfProcessPathExists() const } } -void ProcessCreator::checkIfProcessWasStartingSuccessful(QtcProcess *process) const +void ProcessCreator::checkIfProcessWasStartingSuccessful(QProcess *process) const { if (process->exitStatus() == QProcess::CrashExit || process->exitCode() != 0) dispatchProcessError(process); } -void ProcessCreator::dispatchProcessError(QtcProcess *process) const +void ProcessCreator::dispatchProcessError(QProcess *process) const { switch (process->error()) { case QProcess::UnknownError: { @@ -164,24 +158,24 @@ const QTemporaryDir &ProcessCreator::temporaryDirectory() const void ProcessCreator::resetTemporaryDirectory() { - m_temporaryDirectory = std::make_unique(m_temporaryDirectoryPattern); + m_temporaryDirectory = std::make_unique(m_temporaryDirectoryPattern); } -Environment ProcessCreator::processEnvironment() const +QProcessEnvironment ProcessCreator::processEnvironment() const { - auto processEnvironment = Environment::systemEnvironment(); + auto processEnvironment = QProcessEnvironment::systemEnvironment(); if (temporaryDirectory().isValid()) { const QString temporaryDirectoryPath = temporaryDirectory().path(); - processEnvironment.appendOrSet("TMPDIR", temporaryDirectoryPath); - processEnvironment.appendOrSet("TMP", temporaryDirectoryPath); - processEnvironment.appendOrSet("TEMP", temporaryDirectoryPath); + processEnvironment.insert("TMPDIR", temporaryDirectoryPath); + processEnvironment.insert("TMP", temporaryDirectoryPath); + processEnvironment.insert("TEMP", temporaryDirectoryPath); } - const Environment &env = m_environment; + const Utils::Environment &env = m_environment; for (auto it = env.constBegin(); it != env.constEnd(); ++it) { if (env.isEnabled(it)) - processEnvironment.appendOrSet(env.key(it), env.expandedValueForKey(env.key(it))); + processEnvironment.insert(env.key(it), env.expandedValueForKey(env.key(it))); } return processEnvironment; diff --git a/src/libs/clangsupport/processcreator.h b/src/libs/clangsupport/processcreator.h index 5fdb797e30f..928857319b7 100644 --- a/src/libs/clangsupport/processcreator.h +++ b/src/libs/clangsupport/processcreator.h @@ -39,13 +39,9 @@ QT_BEGIN_NAMESPACE class QTemporaryDir; +class QProcessEnvironment; QT_END_NAMESPACE -namespace Utils { -class Environment; -class QtcProcess; -} - namespace ClangBackEnd { class CLANGSUPPORT_EXPORT ProcessCreator @@ -66,12 +62,12 @@ public: private: void checkIfProcessPathExists() const; - void checkIfProcessWasStartingSuccessful(Utils::QtcProcess *process) const; - [[noreturn]] void dispatchProcessError(Utils::QtcProcess *process) const; + void checkIfProcessWasStartingSuccessful(QProcess *process) const; + [[noreturn]] void dispatchProcessError(QProcess *process) const; void postProcessStartedEvent() const; [[noreturn]] void throwProcessException(const QString &message) const; - Utils::Environment processEnvironment() const; + QProcessEnvironment processEnvironment() const; private: std::unique_ptr m_temporaryDirectory; diff --git a/src/libs/clangsupport/processhandle.h b/src/libs/clangsupport/processhandle.h index 3f7444499b8..c19b7ee007b 100644 --- a/src/libs/clangsupport/processhandle.h +++ b/src/libs/clangsupport/processhandle.h @@ -25,7 +25,7 @@ #pragma once -#include +#include #include @@ -34,7 +34,7 @@ namespace ClangBackEnd { class QProcessUniquePointerDeleter { public: - void operator()(Utils::QtcProcess* process) + void operator()(QProcess* process) { process->kill(); process->waitForFinished(); @@ -42,6 +42,6 @@ public: } }; -using QProcessUniquePointer = std::unique_ptr; +using QProcessUniquePointer = std::unique_ptr; } // namespace ClangBackEnd diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 9642c8fa638..96b4b9c6571 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -23,9 +23,6 @@ elseif (MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") endif() -file(RELATIVE_PATH RELATIVE_TEST_PATH "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}") -file(RELATIVE_PATH TEST_RELATIVE_LIBEXEC_PATH "/${RELATIVE_TEST_PATH}" "/${IDE_LIBEXEC_PATH}") - add_qtc_test(unittest GTEST INCLUDES BEFORE "../mockup" @@ -43,7 +40,6 @@ add_qtc_test(unittest GTEST QTC_RESOURCE_DIR="${CMAKE_CURRENT_LIST_DIR}/../../../share/qtcreator" TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/data" ECHOSERVER="$/echo" - TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}" SOURCES abstractviewmock.h clientserverinprocess-test.cpp diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 3369cdfd693..733e311f948 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -56,10 +56,6 @@ QMAKE_LFLAGS += /INCREMENTAL } -TEST_RELATIVE_LIBEXEC_PATH = $$relative_path($$IDE_LIBEXEC_PATH, $$OUT_PWD) -win32:TEST_RELATIVE_LIBEXEC_PATH=../$$TEST_RELATIVE_LIBEXEC_PATH -DEFINES += 'TEST_RELATIVE_LIBEXEC_PATH="\\\"$$TEST_RELATIVE_LIBEXEC_PATH\\\""' - SOURCES += \ clientserverinprocess-test.cpp \ clientserveroutsideprocess-test.cpp \ diff --git a/tests/unit/unittest/unittest.qbs b/tests/unit/unittest/unittest.qbs index 686f167029b..563bf371c76 100644 --- a/tests/unit/unittest/unittest.qbs +++ b/tests/unit/unittest/unittest.qbs @@ -98,10 +98,6 @@ Project { if (libclang.present) { defines.push("CLANG_UNIT_TESTS"); } - var absLibExecPath = FileInfo.joinPaths(qbs.installRoot, qbs.installPrefix, - qtc.ide_libexec_path); - var relLibExecPath = FileInfo.relativePath(destinationDirectory, absLibExecPath); - defines.push('TEST_RELATIVE_LIBEXEC_PATH="' + relLibExecPath + '"'); return defines; } cpp.cxxFlags: { diff --git a/tests/unit/unittest/unittests-main.cpp b/tests/unit/unittest/unittests-main.cpp index a308b2a6a76..9ec5da12d12 100644 --- a/tests/unit/unittest/unittests-main.cpp +++ b/tests/unit/unittest/unittests-main.cpp @@ -29,13 +29,11 @@ #include #include -#include -#include #include +#include #include #include -#include #ifdef WITH_BENCHMARKS #include @@ -61,8 +59,6 @@ int main(int argc, char *argv[]) Sqlite::Database::activateLogging(); QGuiApplication application(argc, argv); - Utils::LauncherInterface::setPathToLauncher(qApp->applicationDirPath() + '/' - + QLatin1String(TEST_RELATIVE_LIBEXEC_PATH)); testing::InitGoogleTest(&argc, argv); #ifdef WITH_BENCHMARKS benchmark::Initialize(&argc, argv);