ClangPchManager: Show extra progress for dependency building

Task-number: QTCREATORBUG-21956
Change-Id: Id244c9ef9fc7825489daa143b21fcca78164d8c7
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2019-02-19 20:46:08 +01:00
parent 8c781f7e6a
commit f009dad9ef
12 changed files with 97 additions and 41 deletions

View File

@@ -235,11 +235,5 @@ enum class SymbolTag : uchar
using SymbolTags = Utils::SizedArray<SymbolTag, 7>; using SymbolTags = Utils::SizedArray<SymbolTag, 7>;
enum class ProgressType enum class ProgressType { Invalid, PrecompiledHeader, Indexing, DependencyCreation };
{ } // namespace ClangBackEnd
Invalid,
PrecompiledHeader,
Indexing
};
}

View File

@@ -36,23 +36,27 @@ class ProgressMessage
public: public:
ProgressMessage() = default; ProgressMessage() = default;
ProgressMessage(ProgressType progressType, int progress, int total) ProgressMessage(ProgressType progressType, int progress, int total)
: progressType(progressType), : progress(progress)
progress(progress), , total(total)
total(total) , progressType(progressType)
{} {}
friend QDataStream &operator<<(QDataStream &out, const ProgressMessage &message) friend QDataStream &operator<<(QDataStream &out, const ProgressMessage &message)
{ {
out << message.progress; out << message.progress;
out << message.total; out << message.total;
out << static_cast<int>(message.progressType);
return out; return out;
} }
friend QDataStream &operator>>(QDataStream &in, ProgressMessage &message) friend QDataStream &operator>>(QDataStream &in, ProgressMessage &message)
{ {
int progressTupe;
in >> message.progress; in >> message.progress;
in >> message.total; in >> message.total;
in >> progressTupe;
message.progressType = static_cast<ProgressType>(progressTupe);
return in; return in;
} }
@@ -69,9 +73,9 @@ public:
} }
public: public:
ProgressType progressType = ProgressType::Invalid;
int progress = 0; int progress = 0;
int total = 0; int total = 0;
ProgressType progressType = ProgressType::Invalid;
}; };
DECLARE_MESSAGE(ProgressMessage) DECLARE_MESSAGE(ProgressMessage)

View File

@@ -65,12 +65,19 @@ public:
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms}; Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database}; ClangBackEnd::FilePathCaching filePathCache{database};
ClangPchManager::ProgressManager progressManager{ ClangPchManager::ProgressManager pchCreationProgressManager{[](QFutureInterface<void> &promise) {
[] (QFutureInterface<void> &promise) { auto title = QCoreApplication::translate("ClangPchProgressManager",
auto title = QCoreApplication::translate("ClangPchProgressManager", "Creating PCHs", "PCH stands for precompiled header"); "Creating PCHs",
Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr); "PCH stands for precompiled header");
Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr);
}}; }};
PchManagerClient pchManagerClient{progressManager}; ClangPchManager::ProgressManager dependencyCreationProgressManager{
[](QFutureInterface<void> &promise) {
auto title = QCoreApplication::translate("ClangPchProgressManager",
"Creating Dependencies");
Core::ProgressManager::addTask(promise.future(), title, "dependency creation", nullptr);
}};
PchManagerClient pchManagerClient{pchCreationProgressManager, dependencyCreationProgressManager};
PchManagerConnectionClient connectionClient{&pchManagerClient}; PchManagerConnectionClient connectionClient{&pchManagerClient};
QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(), QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(),
pchManagerClient, pchManagerClient,

View File

@@ -53,7 +53,16 @@ void PchManagerClient::precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeader
void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message) void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message)
{ {
m_progressManager.setProgress(message.progress, message.total); switch (message.progressType) {
case ClangBackEnd::ProgressType::PrecompiledHeader:
m_pchCreationProgressManager.setProgress(message.progress, message.total);
break;
case ClangBackEnd::ProgressType::DependencyCreation:
m_dependencyCreationProgressManager.setProgress(message.progress, message.total);
break;
default:
break;
}
} }
void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId) void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId)

View File

@@ -42,8 +42,10 @@ class CLANGPCHMANAGER_EXPORT PchManagerClient final : public ClangBackEnd::PchMa
{ {
friend class PchManagerNotifierInterface; friend class PchManagerNotifierInterface;
public: public:
PchManagerClient(ProgressManagerInterface &progressManager) PchManagerClient(ProgressManagerInterface &pchCreationProgressManager,
: m_progressManager(progressManager) ProgressManagerInterface &dependencyCreationProgressManager)
: m_pchCreationProgressManager(pchCreationProgressManager)
, m_dependencyCreationProgressManager(dependencyCreationProgressManager)
{} {}
void alive() override; void alive() override;
@@ -78,7 +80,8 @@ private:
ClangBackEnd::ProjectPartPchs m_projectPartPchs; ClangBackEnd::ProjectPartPchs m_projectPartPchs;
std::vector<PchManagerNotifierInterface*> m_notifiers; std::vector<PchManagerNotifierInterface*> m_notifiers;
PchManagerConnectionClient *m_connectionClient=nullptr; PchManagerConnectionClient *m_connectionClient=nullptr;
ProgressManagerInterface &m_progressManager; ProgressManagerInterface &m_pchCreationProgressManager;
ProgressManagerInterface &m_dependencyCreationProgressManager;
}; };
} // namespace ClangPchManager } // namespace ClangPchManager

View File

@@ -224,12 +224,19 @@ struct Data // because we have a cycle dependency
clangPchManagerServer, clangPchManagerServer,
includeWatcher}; includeWatcher};
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database}; PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};
ClangBackEnd::ProgressCounter progressCounter{[&](int progress, int total) { ClangBackEnd::ProgressCounter pchCreationProgressCounter{[&](int progress, int total) {
executeInLoop([&] { clangPchManagerServer.setProgress(progress, total); }); executeInLoop([&] {
clangPchManagerServer.setPchCreationProgress(progress, total);
});
}};
ClangBackEnd::ProgressCounter dependencyCreationProgressCounter{[&](int progress, int total) {
executeInLoop([&] {
clangPchManagerServer.setDependencyCreationProgress(progress, total);
});
}}; }};
ClangBackEnd::PchTaskQueue pchTaskQueue{systemTaskScheduler, ClangBackEnd::PchTaskQueue pchTaskQueue{systemTaskScheduler,
projectTaskScheduler, projectTaskScheduler,
progressCounter, pchCreationProgressCounter,
preCompiledHeaderStorage, preCompiledHeaderStorage,
database}; database};
ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue}; ClangBackEnd::PchTasksMerger pchTaskMerger{pchTaskQueue};
@@ -248,19 +255,19 @@ struct Data // because we have a cycle dependency
database}; database};
ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider, ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider,
pchTaskMerger, pchTaskMerger,
progressCounter}; dependencyCreationProgressCounter};
PchManagerServer clangPchManagerServer{includeWatcher, PchManagerServer clangPchManagerServer{includeWatcher,
pchTaskGenerator, pchTaskGenerator,
projectParts, projectParts,
generatedFiles}; generatedFiles};
TaskScheduler systemTaskScheduler{pchCreatorManager, TaskScheduler systemTaskScheduler{pchCreatorManager,
pchTaskQueue, pchTaskQueue,
progressCounter, pchCreationProgressCounter,
std::thread::hardware_concurrency(), std::thread::hardware_concurrency(),
ClangBackEnd::CallDoInMainThreadAfterFinished::No}; ClangBackEnd::CallDoInMainThreadAfterFinished::No};
TaskScheduler projectTaskScheduler{pchCreatorManager, TaskScheduler projectTaskScheduler{pchCreatorManager,
pchTaskQueue, pchTaskQueue,
progressCounter, pchCreationProgressCounter,
std::thread::hardware_concurrency(), std::thread::hardware_concurrency(),
ClangBackEnd::CallDoInMainThreadAfterFinished::Yes}; ClangBackEnd::CallDoInMainThreadAfterFinished::Yes};
}; };

View File

@@ -132,9 +132,14 @@ void PchManagerServer::pathsChanged(const FilePathIds &/*filePathIds*/)
{ {
} }
void PchManagerServer::setProgress(int progress, int total) void PchManagerServer::setPchCreationProgress(int progress, int total)
{ {
client()->progress({ProgressType::PrecompiledHeader, progress, total}); client()->progress({ProgressType::PrecompiledHeader, progress, total});
} }
void PchManagerServer::setDependencyCreationProgress(int progress, int total)
{
client()->progress({ProgressType::DependencyCreation, progress, total});
}
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -60,7 +60,8 @@ public:
void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override; void pathsWithIdsChanged(const Utils::SmallStringVector &ids) override;
void pathsChanged(const FilePathIds &filePathIds) override; void pathsChanged(const FilePathIds &filePathIds) override;
void setProgress(int progress, int total); void setPchCreationProgress(int progress, int total);
void setDependencyCreationProgress(int progress, int total);
private: private:
ClangPathWatcherInterface &m_fileSystemWatcher; ClangPathWatcherInterface &m_fileSystemWatcher;

View File

@@ -53,9 +53,11 @@ using testing::Not;
class PchManagerClient : public ::testing::Test class PchManagerClient : public ::testing::Test
{ {
protected: protected:
NiceMock<MockProgressManager> mockProgressManager; NiceMock<MockProgressManager> mockPchCreationProgressManager;
NiceMock<MockProgressManager> mockDependencyCreationProgressManager;
ClangPchManager::PchManagerClient client{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
NiceMock<MockPchManagerServer> mockPchManagerServer; NiceMock<MockPchManagerServer> mockPchManagerServer;
ClangPchManager::PchManagerClient client{mockProgressManager};
NiceMock<MockPchManagerNotifier> mockPchManagerNotifier{client}; NiceMock<MockPchManagerNotifier> mockPchManagerNotifier{client};
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
@@ -158,11 +160,17 @@ TEST_F(PchManagerClient, ProjectPartPchForProjectPartIdIsUpdated)
42); 42);
} }
TEST_F(PchManagerClient, SetProgress) TEST_F(PchManagerClient, SetPchCreationProgress)
{ {
EXPECT_CALL(mockProgressManager, setProgress(10, 20)); EXPECT_CALL(mockPchCreationProgressManager, setProgress(10, 20));
client.progress({ClangBackEnd::ProgressType::PrecompiledHeader, 10, 20}); client.progress({ClangBackEnd::ProgressType::PrecompiledHeader, 10, 20});
} }
TEST_F(PchManagerClient, SetDependencyCreationProgress)
{
EXPECT_CALL(mockDependencyCreationProgressManager, setProgress(30, 40));
client.progress({ClangBackEnd::ProgressType::DependencyCreation, 30, 40});
} }
} // namespace

View File

@@ -176,12 +176,26 @@ TEST_F(PchManagerServer, UpdateProjectPartQueueByPathIds)
server.pathsWithIdsChanged({projectPartId1}); server.pathsWithIdsChanged({projectPartId1});
} }
TEST_F(PchManagerServer, SetProgress) TEST_F(PchManagerServer, SetPchCreationProgress)
{ {
EXPECT_CALL(mockPchManagerClient, progress(AllOf(Field(&ClangBackEnd::ProgressMessage::progress, 20), EXPECT_CALL(mockPchManagerClient,
Field(&ClangBackEnd::ProgressMessage::total, 30)))); progress(AllOf(Field(&ClangBackEnd::ProgressMessage::progressType,
ClangBackEnd::ProgressType::PrecompiledHeader),
Field(&ClangBackEnd::ProgressMessage::progress, 20),
Field(&ClangBackEnd::ProgressMessage::total, 30))));
server.setProgress(20, 30); server.setPchCreationProgress(20, 30);
}
TEST_F(PchManagerServer, SetDependencyCreationProgress)
{
EXPECT_CALL(mockPchManagerClient,
progress(AllOf(Field(&ClangBackEnd::ProgressMessage::progressType,
ClangBackEnd::ProgressType::DependencyCreation),
Field(&ClangBackEnd::ProgressMessage::progress, 20),
Field(&ClangBackEnd::ProgressMessage::total, 30))));
server.setDependencyCreationProgress(20, 30);
} }
TEST_F(PchManagerServer, RemoveToolChainsArguments) TEST_F(PchManagerServer, RemoveToolChainsArguments)

View File

@@ -135,8 +135,10 @@ protected:
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory}; Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
ClangBackEnd::FilePathCaching filePathCache{database}; ClangBackEnd::FilePathCaching filePathCache{database};
NiceMock<MockProgressManager> mockProgressManager; NiceMock<MockProgressManager> mockPchCreationProgressManager;
ClangPchManager::PchManagerClient pchManagerClient{mockProgressManager}; NiceMock<MockProgressManager> mockDependencyCreationProgressManager;
ClangPchManager::PchManagerClient pchManagerClient{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
MockPchManagerNotifier mockPchManagerNotifier{pchManagerClient}; MockPchManagerNotifier mockPchManagerNotifier{pchManagerClient};
NiceMock<MockPchManagerServer> mockPchManagerServer; NiceMock<MockPchManagerServer> mockPchManagerServer;
ClangPchManager::ProjectUpdater updater{mockPchManagerServer, filePathCache}; ClangPchManager::ProjectUpdater updater{mockPchManagerServer, filePathCache};

View File

@@ -87,8 +87,10 @@ protected:
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
ClangBackEnd::FilePathCaching filePathCache{database}; ClangBackEnd::FilePathCaching filePathCache{database};
NiceMock<MockRefactoringServer> mockRefactoringServer; NiceMock<MockRefactoringServer> mockRefactoringServer;
NiceMock<MockProgressManager> mockProgressManager; NiceMock<MockProgressManager> mockPchCreationProgressManager;
ClangPchManager::PchManagerClient pchManagerClient{mockProgressManager}; NiceMock<MockProgressManager> mockDependencyCreationProgressManager;
ClangPchManager::PchManagerClient pchManagerClient{mockPchCreationProgressManager,
mockDependencyCreationProgressManager};
MockCppModelManager mockCppModelManager; MockCppModelManager mockCppModelManager;
ClangRefactoring::RefactoringProjectUpdater updater{mockRefactoringServer, pchManagerClient, mockCppModelManager, filePathCache}; ClangRefactoring::RefactoringProjectUpdater updater{mockRefactoringServer, pchManagerClient, mockCppModelManager, filePathCache};
Utils::SmallString projectPartId; Utils::SmallString projectPartId;