forked from qt-creator/qt-creator
Clang: Fix crash on exit
There were threads running but the instances they called were already deleted. Now we delete the scheduler first which is the thread holder and which is waiting that all threads are finished. Task-number: QTCREATORBUG-21882 Change-Id: I2e9f4d8381d79fab9a93346cef6598ab8e8f7850 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
@@ -183,16 +183,6 @@ struct Data // because we have a cycle dependency
|
|||||||
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};
|
PrecompiledHeaderStorage<> preCompiledHeaderStorage{database};
|
||||||
ClangBackEnd::ProgressCounter progressCounter{
|
ClangBackEnd::ProgressCounter progressCounter{
|
||||||
[&](int progress, int total) { clangPchManagerServer.setProgress(progress, total); }};
|
[&](int progress, int total) { clangPchManagerServer.setProgress(progress, total); }};
|
||||||
TaskScheduler systemTaskScheduler{pchCreatorManager,
|
|
||||||
pchTaskQueue,
|
|
||||||
progressCounter,
|
|
||||||
std::thread::hardware_concurrency(),
|
|
||||||
ClangBackEnd::CallDoInMainThreadAfterFinished::No};
|
|
||||||
TaskScheduler projectTaskScheduler{pchCreatorManager,
|
|
||||||
pchTaskQueue,
|
|
||||||
progressCounter,
|
|
||||||
std::thread::hardware_concurrency(),
|
|
||||||
ClangBackEnd::CallDoInMainThreadAfterFinished::Yes};
|
|
||||||
ClangBackEnd::PchTaskQueue pchTaskQueue{systemTaskScheduler,
|
ClangBackEnd::PchTaskQueue pchTaskQueue{systemTaskScheduler,
|
||||||
projectTaskScheduler,
|
projectTaskScheduler,
|
||||||
progressCounter,
|
progressCounter,
|
||||||
@@ -212,6 +202,16 @@ struct Data // because we have a cycle dependency
|
|||||||
database};
|
database};
|
||||||
ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider, pchTaskMerger};
|
ClangBackEnd::PchTaskGenerator pchTaskGenerator{buildDependencyProvider, pchTaskMerger};
|
||||||
PchManagerServer clangPchManagerServer{includeWatcher, pchTaskGenerator, projectParts, generatedFiles};
|
PchManagerServer clangPchManagerServer{includeWatcher, pchTaskGenerator, projectParts, generatedFiles};
|
||||||
|
TaskScheduler systemTaskScheduler{pchCreatorManager,
|
||||||
|
pchTaskQueue,
|
||||||
|
progressCounter,
|
||||||
|
std::thread::hardware_concurrency(),
|
||||||
|
ClangBackEnd::CallDoInMainThreadAfterFinished::No};
|
||||||
|
TaskScheduler projectTaskScheduler{pchCreatorManager,
|
||||||
|
pchTaskQueue,
|
||||||
|
progressCounter,
|
||||||
|
std::thread::hardware_concurrency(),
|
||||||
|
ClangBackEnd::CallDoInMainThreadAfterFinished::Yes};
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@@ -80,6 +80,11 @@ public:
|
|||||||
, m_callDoInMainThreadAfterFinished(callDoInMainThreadAfterFinished)
|
, m_callDoInMainThreadAfterFinished(callDoInMainThreadAfterFinished)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
~TaskScheduler()
|
||||||
|
{
|
||||||
|
syncTasks();
|
||||||
|
}
|
||||||
|
|
||||||
void addTasks(std::vector<Task> &&tasks)
|
void addTasks(std::vector<Task> &&tasks)
|
||||||
{
|
{
|
||||||
for (auto &task : tasks) {
|
for (auto &task : tasks) {
|
||||||
|
@@ -93,8 +93,8 @@ struct Data // because we have a cycle dependency
|
|||||||
RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
|
||||||
FilePathCaching filePathCache{database};
|
FilePathCaching filePathCache{database};
|
||||||
GeneratedFiles generatedFiles;
|
GeneratedFiles generatedFiles;
|
||||||
SymbolIndexing symbolIndexing{database, filePathCache, generatedFiles, [&] (int progress, int total) { clangCodeModelServer.setProgress(progress, total); }};
|
|
||||||
RefactoringServer clangCodeModelServer{symbolIndexing, filePathCache, generatedFiles};
|
RefactoringServer clangCodeModelServer{symbolIndexing, filePathCache, generatedFiles};
|
||||||
|
SymbolIndexing symbolIndexing{database, filePathCache, generatedFiles, [&] (int progress, int total) { clangCodeModelServer.setProgress(progress, total); }};
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@@ -124,8 +124,6 @@ private:
|
|||||||
FileStatusCache m_fileStatusCache{m_filePathCache};
|
FileStatusCache m_fileStatusCache{m_filePathCache};
|
||||||
SymbolsCollectorManager m_collectorManger;
|
SymbolsCollectorManager m_collectorManger;
|
||||||
ProgressCounter m_progressCounter;
|
ProgressCounter m_progressCounter;
|
||||||
SymbolIndexerTaskScheduler m_indexerScheduler;
|
|
||||||
SymbolIndexerTaskQueue m_indexerQueue{m_indexerScheduler, m_progressCounter};
|
|
||||||
SymbolIndexer m_indexer{m_indexerQueue,
|
SymbolIndexer m_indexer{m_indexerQueue,
|
||||||
m_symbolStorage,
|
m_symbolStorage,
|
||||||
m_buildDependencyStorage,
|
m_buildDependencyStorage,
|
||||||
@@ -133,6 +131,8 @@ private:
|
|||||||
m_filePathCache,
|
m_filePathCache,
|
||||||
m_fileStatusCache,
|
m_fileStatusCache,
|
||||||
m_symbolStorage.m_database};
|
m_symbolStorage.m_database};
|
||||||
|
SymbolIndexerTaskQueue m_indexerQueue{m_indexerScheduler, m_progressCounter};
|
||||||
|
SymbolIndexerTaskScheduler m_indexerScheduler;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ClangBackEnd
|
} // namespace ClangBackEnd
|
||||||
|
@@ -241,12 +241,6 @@ protected:
|
|||||||
Manager collectorManger{generatedFiles};
|
Manager collectorManger{generatedFiles};
|
||||||
NiceMock<MockFunction<void(int, int)>> mockSetProgressCallback;
|
NiceMock<MockFunction<void(int, int)>> mockSetProgressCallback;
|
||||||
ClangBackEnd::ProgressCounter progressCounter{mockSetProgressCallback.AsStdFunction()};
|
ClangBackEnd::ProgressCounter progressCounter{mockSetProgressCallback.AsStdFunction()};
|
||||||
Scheduler indexerScheduler{collectorManger,
|
|
||||||
indexerQueue,
|
|
||||||
progressCounter,
|
|
||||||
1,
|
|
||||||
ClangBackEnd::CallDoInMainThreadAfterFinished::Yes};
|
|
||||||
SymbolIndexerTaskQueue indexerQueue{indexerScheduler, progressCounter};
|
|
||||||
ClangBackEnd::SymbolIndexer indexer{indexerQueue,
|
ClangBackEnd::SymbolIndexer indexer{indexerQueue,
|
||||||
mockSymbolStorage,
|
mockSymbolStorage,
|
||||||
mockBuildDependenciesStorage,
|
mockBuildDependenciesStorage,
|
||||||
@@ -254,6 +248,12 @@ protected:
|
|||||||
filePathCache,
|
filePathCache,
|
||||||
fileStatusCache,
|
fileStatusCache,
|
||||||
mockSqliteTransactionBackend};
|
mockSqliteTransactionBackend};
|
||||||
|
SymbolIndexerTaskQueue indexerQueue{indexerScheduler, progressCounter};
|
||||||
|
Scheduler indexerScheduler{collectorManger,
|
||||||
|
indexerQueue,
|
||||||
|
progressCounter,
|
||||||
|
1,
|
||||||
|
ClangBackEnd::CallDoInMainThreadAfterFinished::Yes};
|
||||||
MockSymbolsCollector &mockCollector{static_cast<MockSymbolsCollector&>(collectorManger.unusedProcessor())};
|
MockSymbolsCollector &mockCollector{static_cast<MockSymbolsCollector&>(collectorManger.unusedProcessor())};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user