Revert "Use QtcProcess for clangbackend"

This reverts commit 8724a4efbb.

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 <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Cristian Adam
2021-12-17 19:54:37 +01:00
parent 3e585483c9
commit d65e47b5c6
9 changed files with 43 additions and 70 deletions

View File

@@ -36,8 +36,6 @@
#include <QProcess> #include <QProcess>
#include <QThread> #include <QThread>
using namespace Utils;
namespace ClangBackEnd { namespace ClangBackEnd {
ConnectionClient::ConnectionClient(const QString &connectionName) ConnectionClient::ConnectionClient(const QString &connectionName)
@@ -161,7 +159,7 @@ void ConnectionClient::restartProcessIfTimerIsNotResettedAndSocketIsEmpty()
restartProcessAsynchronously(); restartProcessAsynchronously();
} }
void ConnectionClient::endProcess(QtcProcess *process) void ConnectionClient::endProcess(QProcess *process)
{ {
if (isProcessRunning(process) && isConnected()) { if (isProcessRunning(process) && isConnected()) {
sendEndMessage(); 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->terminate();
process->waitForFinished(1000); process->waitForFinished(1000);
} }
} }
void ConnectionClient::killProcess(QtcProcess *process) void ConnectionClient::killProcess(QProcess *process)
{ {
if (isProcessRunning(process)) { if (isProcessRunning(process)) {
process->kill(); process->kill();
@@ -215,7 +213,7 @@ void ConnectionClient::resetTemporaryDirectory()
m_processCreator.resetTemporaryDirectory(); m_processCreator.resetTemporaryDirectory();
} }
void ConnectionClient::initializeProcess(QtcProcess *process) void ConnectionClient::initializeProcess(QProcess *process)
{ {
connectStandardOutputAndError(process); connectStandardOutputAndError(process);
@@ -301,7 +299,7 @@ bool ConnectionClient::waitForConnected()
} }
QtcProcess *ConnectionClient::processForTestOnly() QProcess *ConnectionClient::processForTestOnly()
{ {
getProcessFromFuture(); getProcessFromFuture();
@@ -313,15 +311,15 @@ QIODevice *ConnectionClient::ioDevice()
return m_localSocket; return m_localSocket;
} }
bool ConnectionClient::isProcessRunning(QtcProcess *process) bool ConnectionClient::isProcessRunning(QProcess *process)
{ {
return process && process->state() == QProcess::Running; 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, &QProcess::readyReadStandardOutput, this, &ConnectionClient::printStandardOutput);
connect(process, &QtcProcess::readyReadStandardError, this, &ConnectionClient::printStandardError); connect(process, &QProcess::readyReadStandardError, this, &ConnectionClient::printStandardError);
} }
void ConnectionClient::connectLocalSocketError() const void ConnectionClient::connectLocalSocketError() const

View File

@@ -28,7 +28,6 @@
#include "clangcodemodelserverproxy.h" #include "clangcodemodelserverproxy.h"
#include "lineprefixer.h" #include "lineprefixer.h"
#include "processcreator.h" #include "processcreator.h"
#include "processhandle.h"
#include <QLocalServer> #include <QLocalServer>
#include <QLocalSocket> #include <QLocalSocket>
@@ -38,7 +37,9 @@
#include <future> #include <future>
#include <memory> #include <memory>
namespace Utils { class QtcProcess; } QT_BEGIN_NAMESPACE
class QProcess;
QT_END_NAMESPACE
class Utf8String; class Utf8String;
class Utf8StringVector; class Utf8StringVector;
@@ -76,7 +77,7 @@ public:
bool waitForEcho(); bool waitForEcho();
bool waitForConnected(); bool waitForConnected();
Utils::QtcProcess *processForTestOnly(); QProcess *processForTestOnly();
signals: signals:
void connectedToLocalSocket(); void connectedToLocalSocket();
@@ -102,22 +103,22 @@ protected:
virtual void newConnectedServer(QLocalSocket *localSocket) = 0; virtual void newConnectedServer(QLocalSocket *localSocket) = 0;
private: private:
static bool isProcessRunning(Utils::QtcProcess *process); static bool isProcessRunning(QProcess *process);
void finishProcess(QProcessUniquePointer &&process); void finishProcess(QProcessUniquePointer &&process);
void endProcess(Utils::QtcProcess *process); void endProcess(QProcess *process);
void terminateProcess(Utils::QtcProcess *process); void terminateProcess(QProcess *process);
void killProcess(Utils::QtcProcess *process); void killProcess(QProcess *process);
void finishConnection(); void finishConnection();
void printLocalSocketError(QLocalSocket::LocalSocketError socketError); void printLocalSocketError(QLocalSocket::LocalSocketError socketError);
void printStandardOutput(); void printStandardOutput();
void printStandardError(); void printStandardError();
void initializeProcess(Utils::QtcProcess *process); void initializeProcess(QProcess *process);
void resetTemporaryDirectory(); void resetTemporaryDirectory();
void connectLocalSocketDisconnected(); void connectLocalSocketDisconnected();
void disconnectLocalSocketDisconnected(); void disconnectLocalSocketDisconnected();
void connectStandardOutputAndError(Utils::QtcProcess *process) const; void connectStandardOutputAndError(QProcess *process) const;
void connectLocalSocketError() const; void connectLocalSocketError() const;
void connectAliveTimer(); void connectAliveTimer();
void connectNewConnection(); void connectNewConnection();

View File

@@ -28,15 +28,10 @@
#include "processexception.h" #include "processexception.h"
#include "processstartedevent.h" #include "processstartedevent.h"
#include <utils/commandline.h>
#include <utils/qtcprocess.h>
#include <QCoreApplication> #include <QCoreApplication>
#include <QFileInfo> #include <QFileInfo>
#include <QTemporaryDir> #include <QTemporaryDir>
using namespace Utils;
namespace ClangBackEnd { namespace ClangBackEnd {
using namespace std::chrono_literals; using namespace std::chrono_literals;
@@ -61,7 +56,7 @@ void ProcessCreator::setArguments(const QStringList &arguments)
m_arguments = arguments; m_arguments = arguments;
} }
void ProcessCreator::setEnvironment(const Environment &environment) void ProcessCreator::setEnvironment(const Utils::Environment &environment)
{ {
m_environment = environment; m_environment = environment;
} }
@@ -70,11 +65,10 @@ std::future<QProcessUniquePointer> ProcessCreator::createProcess() const
{ {
return std::async(std::launch::async, [&] { return std::async(std::launch::async, [&] {
checkIfProcessPathExists(); checkIfProcessPathExists();
auto process = QProcessUniquePointer(new QtcProcess(ProcessMode::Writer)); auto process = QProcessUniquePointer(new QProcess);
process->setProcessChannelMode(QProcess::ForwardedChannels); process->setProcessChannelMode(QProcess::QProcess::ForwardedChannels);
process->setEnvironment(processEnvironment()); process->setProcessEnvironment(processEnvironment());
process->setCommand(CommandLine(FilePath::fromString(m_processPath), m_arguments)); process->start(m_processPath, m_arguments);
process->start();
process->waitForStarted(5000); process->waitForStarted(5000);
checkIfProcessWasStartingSuccessful(process.get()); 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) if (process->exitStatus() == QProcess::CrashExit || process->exitCode() != 0)
dispatchProcessError(process); dispatchProcessError(process);
} }
void ProcessCreator::dispatchProcessError(QtcProcess *process) const void ProcessCreator::dispatchProcessError(QProcess *process) const
{ {
switch (process->error()) { switch (process->error()) {
case QProcess::UnknownError: { case QProcess::UnknownError: {
@@ -164,24 +158,24 @@ const QTemporaryDir &ProcessCreator::temporaryDirectory() const
void ProcessCreator::resetTemporaryDirectory() void ProcessCreator::resetTemporaryDirectory()
{ {
m_temporaryDirectory = std::make_unique<TemporaryDirectory>(m_temporaryDirectoryPattern); m_temporaryDirectory = std::make_unique<Utils::TemporaryDirectory>(m_temporaryDirectoryPattern);
} }
Environment ProcessCreator::processEnvironment() const QProcessEnvironment ProcessCreator::processEnvironment() const
{ {
auto processEnvironment = Environment::systemEnvironment(); auto processEnvironment = QProcessEnvironment::systemEnvironment();
if (temporaryDirectory().isValid()) { if (temporaryDirectory().isValid()) {
const QString temporaryDirectoryPath = temporaryDirectory().path(); const QString temporaryDirectoryPath = temporaryDirectory().path();
processEnvironment.appendOrSet("TMPDIR", temporaryDirectoryPath); processEnvironment.insert("TMPDIR", temporaryDirectoryPath);
processEnvironment.appendOrSet("TMP", temporaryDirectoryPath); processEnvironment.insert("TMP", temporaryDirectoryPath);
processEnvironment.appendOrSet("TEMP", 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) { for (auto it = env.constBegin(); it != env.constEnd(); ++it) {
if (env.isEnabled(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; return processEnvironment;

View File

@@ -39,13 +39,9 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QTemporaryDir; class QTemporaryDir;
class QProcessEnvironment;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils {
class Environment;
class QtcProcess;
}
namespace ClangBackEnd { namespace ClangBackEnd {
class CLANGSUPPORT_EXPORT ProcessCreator class CLANGSUPPORT_EXPORT ProcessCreator
@@ -66,12 +62,12 @@ public:
private: private:
void checkIfProcessPathExists() const; void checkIfProcessPathExists() const;
void checkIfProcessWasStartingSuccessful(Utils::QtcProcess *process) const; void checkIfProcessWasStartingSuccessful(QProcess *process) const;
[[noreturn]] void dispatchProcessError(Utils::QtcProcess *process) const; [[noreturn]] void dispatchProcessError(QProcess *process) const;
void postProcessStartedEvent() const; void postProcessStartedEvent() const;
[[noreturn]] void throwProcessException(const QString &message) const; [[noreturn]] void throwProcessException(const QString &message) const;
Utils::Environment processEnvironment() const; QProcessEnvironment processEnvironment() const;
private: private:
std::unique_ptr<Utils::TemporaryDirectory> m_temporaryDirectory; std::unique_ptr<Utils::TemporaryDirectory> m_temporaryDirectory;

View File

@@ -25,7 +25,7 @@
#pragma once #pragma once
#include <utils/qtcprocess.h> #include <QProcess>
#include <memory> #include <memory>
@@ -34,7 +34,7 @@ namespace ClangBackEnd {
class QProcessUniquePointerDeleter class QProcessUniquePointerDeleter
{ {
public: public:
void operator()(Utils::QtcProcess* process) void operator()(QProcess* process)
{ {
process->kill(); process->kill();
process->waitForFinished(); process->waitForFinished();
@@ -42,6 +42,6 @@ public:
} }
}; };
using QProcessUniquePointer = std::unique_ptr<Utils::QtcProcess, QProcessUniquePointerDeleter>; using QProcessUniquePointer = std::unique_ptr<QProcess, QProcessUniquePointerDeleter>;
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -23,9 +23,6 @@ elseif (MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
endif() 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 add_qtc_test(unittest GTEST
INCLUDES INCLUDES
BEFORE "../mockup" BEFORE "../mockup"
@@ -43,7 +40,6 @@ add_qtc_test(unittest GTEST
QTC_RESOURCE_DIR="${CMAKE_CURRENT_LIST_DIR}/../../../share/qtcreator" QTC_RESOURCE_DIR="${CMAKE_CURRENT_LIST_DIR}/../../../share/qtcreator"
TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/data" TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/data"
ECHOSERVER="$<TARGET_FILE_DIR:echo>/echo" ECHOSERVER="$<TARGET_FILE_DIR:echo>/echo"
TEST_RELATIVE_LIBEXEC_PATH="${TEST_RELATIVE_LIBEXEC_PATH}"
SOURCES SOURCES
abstractviewmock.h abstractviewmock.h
clientserverinprocess-test.cpp clientserverinprocess-test.cpp

View File

@@ -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 += \ SOURCES += \
clientserverinprocess-test.cpp \ clientserverinprocess-test.cpp \
clientserveroutsideprocess-test.cpp \ clientserveroutsideprocess-test.cpp \

View File

@@ -98,10 +98,6 @@ Project {
if (libclang.present) { if (libclang.present) {
defines.push("CLANG_UNIT_TESTS"); 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; return defines;
} }
cpp.cxxFlags: { cpp.cxxFlags: {

View File

@@ -29,13 +29,11 @@
#include <sqlitelibraryinitializer.h> #include <sqlitelibraryinitializer.h>
#include <sqliteglobal.h> #include <sqliteglobal.h>
#include <utils/launcherinterface.h>
#include <utils/singleton.h>
#include <utils/temporarydirectory.h> #include <utils/temporarydirectory.h>
#include <utils/singleton.h>
#include <QGuiApplication> #include <QGuiApplication>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QScopeGuard>
#ifdef WITH_BENCHMARKS #ifdef WITH_BENCHMARKS
#include <benchmark/benchmark.h> #include <benchmark/benchmark.h>
@@ -61,8 +59,6 @@ int main(int argc, char *argv[])
Sqlite::Database::activateLogging(); Sqlite::Database::activateLogging();
QGuiApplication application(argc, argv); QGuiApplication application(argc, argv);
Utils::LauncherInterface::setPathToLauncher(qApp->applicationDirPath() + '/'
+ QLatin1String(TEST_RELATIVE_LIBEXEC_PATH));
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
#ifdef WITH_BENCHMARKS #ifdef WITH_BENCHMARKS
benchmark::Initialize(&argc, argv); benchmark::Initialize(&argc, argv);