diff --git a/src/lib/data/TaskCleanStorage.cpp b/src/lib/data/TaskCleanStorage.cpp index f14b4736..c1b24b0c 100644 --- a/src/lib/data/TaskCleanStorage.cpp +++ b/src/lib/data/TaskCleanStorage.cpp @@ -8,7 +8,7 @@ #include "Application.h" TaskCleanStorage::TaskCleanStorage( - PersistentStorage* storage, const std::vector& filePaths, bool clearAllErrors + std::weak_ptr storage, const std::vector& filePaths, bool clearAllErrors ) : m_storage(storage) , m_filePaths(filePaths) @@ -25,23 +25,29 @@ void TaskCleanStorage::doEnter(std::shared_ptr blackboard) if (!m_filePaths.empty() || m_clearAllErrors) { - m_storage->setMode(SqliteIndexStorage::STORAGE_MODE_CLEAR); + if (std::shared_ptr storage = m_storage.lock()) + { + storage->setMode(SqliteIndexStorage::STORAGE_MODE_CLEAR); + } } } Task::TaskState TaskCleanStorage::doUpdate(std::shared_ptr blackboard) { - if (m_clearAllErrors) + if (std::shared_ptr storage = m_storage.lock()) { - m_storage->clearAllErrors(); - } - - m_storage->clearFileElements(m_filePaths, [=](int progress) + if (m_clearAllErrors) { - Application::getInstance()->getDialogView(DialogView::UseCase::INDEXING)->showProgressDialog( - L"Clearing", std::to_wstring(m_filePaths.size()) + L" Files", progress); + storage->clearAllErrors(); } - ); + + storage->clearFileElements(m_filePaths, [=](int progress) + { + Application::getInstance()->getDialogView(DialogView::UseCase::INDEXING)->showProgressDialog( + L"Clearing", std::to_wstring(m_filePaths.size()) + L" Files", progress); + } + ); + } m_filePaths.clear(); diff --git a/src/lib/data/TaskCleanStorage.h b/src/lib/data/TaskCleanStorage.h index f23429cb..a0ea5ac1 100644 --- a/src/lib/data/TaskCleanStorage.h +++ b/src/lib/data/TaskCleanStorage.h @@ -15,7 +15,7 @@ class TaskCleanStorage { public: TaskCleanStorage( - PersistentStorage* storage, + std::weak_ptr storage, const std::vector& filePaths, bool clearAllErrors ); @@ -26,7 +26,7 @@ private: void doExit(std::shared_ptr blackboard) override; void doReset(std::shared_ptr blackboard) override; - PersistentStorage* m_storage; + std::weak_ptr m_storage; std::vector m_filePaths; bool m_clearAllErrors; diff --git a/src/lib/data/TaskFinishParsing.cpp b/src/lib/data/TaskFinishParsing.cpp index cf0259ef..08c87ad0 100644 --- a/src/lib/data/TaskFinishParsing.cpp +++ b/src/lib/data/TaskFinishParsing.cpp @@ -109,6 +109,7 @@ Task::TaskState TaskFinishParsing::doUpdate(std::shared_ptr blackboa void TaskFinishParsing::doExit(std::shared_ptr blackboard) { + m_storage.reset(); } void TaskFinishParsing::doReset(std::shared_ptr blackboard) diff --git a/src/lib/data/TaskInjectStorage.cpp b/src/lib/data/TaskInjectStorage.cpp index 329ca4de..f0cb6c3c 100644 --- a/src/lib/data/TaskInjectStorage.cpp +++ b/src/lib/data/TaskInjectStorage.cpp @@ -8,7 +8,7 @@ TaskInjectStorage::TaskInjectStorage( std::shared_ptr storageProvider, - std::shared_ptr target + std::weak_ptr target ) : m_storageProvider(storageProvider) , m_target(target) @@ -26,8 +26,11 @@ Task::TaskState TaskInjectStorage::doUpdate(std::shared_ptr blackboa std::shared_ptr source = m_storageProvider->consumeLargestStorage(); if (source) { - m_target->inject(source.get()); - return STATE_SUCCESS; + if (std::shared_ptr target = m_target.lock()) + { + target->inject(source.get()); + return STATE_SUCCESS; + } } } else diff --git a/src/lib/data/TaskInjectStorage.h b/src/lib/data/TaskInjectStorage.h index ad76b1ec..f2602fb6 100644 --- a/src/lib/data/TaskInjectStorage.h +++ b/src/lib/data/TaskInjectStorage.h @@ -14,7 +14,7 @@ class TaskInjectStorage public: TaskInjectStorage( std::shared_ptr storageProvider, - std::shared_ptr target + std::weak_ptr target ); private: @@ -24,7 +24,7 @@ private: void doReset(std::shared_ptr blackboard) override; std::shared_ptr m_storageProvider; - std::shared_ptr m_target; + std::weak_ptr m_target; }; #endif // TASK_INJECT_STORAGE_H diff --git a/src/lib/data/parser/TaskParseWrapper.cpp b/src/lib/data/parser/TaskParseWrapper.cpp index c000df4b..0f7ddd7a 100644 --- a/src/lib/data/parser/TaskParseWrapper.cpp +++ b/src/lib/data/parser/TaskParseWrapper.cpp @@ -6,15 +6,11 @@ #include "utility/utility.h" #include "Application.h" -TaskParseWrapper::TaskParseWrapper(PersistentStorage* storage) +TaskParseWrapper::TaskParseWrapper(std::weak_ptr storage) : m_storage(storage) { } -TaskParseWrapper::~TaskParseWrapper() -{ -} - void TaskParseWrapper::doEnter(std::shared_ptr blackboard) { int sourceFileCount = 0; @@ -30,7 +26,10 @@ void TaskParseWrapper::doEnter(std::shared_ptr blackboard) if (sourceFileCount > 0) { - m_storage->setMode(SqliteIndexStorage::STORAGE_MODE_WRITE); + if (std::shared_ptr storage = m_storage.lock()) + { + storage->setMode(SqliteIndexStorage::STORAGE_MODE_WRITE); + } } } diff --git a/src/lib/data/parser/TaskParseWrapper.h b/src/lib/data/parser/TaskParseWrapper.h index fb6d0d2a..9526a1ed 100644 --- a/src/lib/data/parser/TaskParseWrapper.h +++ b/src/lib/data/parser/TaskParseWrapper.h @@ -16,8 +16,7 @@ class TaskParseWrapper : public TaskDecorator { public: - TaskParseWrapper(PersistentStorage* storage); - virtual ~TaskParseWrapper(); + TaskParseWrapper(std::weak_ptr storage); private: virtual void doEnter(std::shared_ptr blackboard); @@ -25,7 +24,7 @@ private: virtual void doExit(std::shared_ptr blackboard); virtual void doReset(std::shared_ptr blackboard); - PersistentStorage* m_storage; + std::weak_ptr m_storage; TimeStamp m_start; }; diff --git a/src/lib/project/Project.cpp b/src/lib/project/Project.cpp index 9040673e..730f5b55 100644 --- a/src/lib/project/Project.cpp +++ b/src/lib/project/Project.cpp @@ -422,7 +422,7 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView) if (info.mode != REFRESH_ALL_FILES && (info.filesToClear.size() || info.nonIndexedFilesToClear.size())) { taskSequential->addTask(std::make_shared( - tempStorage.get(), + tempStorage, utility::toVector(utility::concat(info.filesToClear, info.nonIndexedFilesToClear)), info.mode == REFRESH_UPDATED_AND_INCOMPLETE_FILES )); @@ -467,7 +467,7 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView) taskSequential->addTask(std::make_shared>("indexed_source_file_count", 0)); taskSequential->addTask(std::make_shared>("indexer_count", 0)); - std::shared_ptr taskParserWrapper = std::make_shared(tempStorage.get()); + std::shared_ptr taskParserWrapper = std::make_shared(tempStorage); taskSequential->addTask(taskParserWrapper); std::shared_ptr taskParallelIndexing = std::make_shared(); @@ -537,7 +537,6 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView) taskSequential->addTask(std::make_shared(tempStorage)); - taskSequential->addTask(std::make_shared()->addChildTasks( std::make_shared()->addChildTasks( std::make_shared("keep_database"), diff --git a/src/lib/utility/messaging/Message.h b/src/lib/utility/messaging/Message.h index ac41e2e0..61663f8e 100644 --- a/src/lib/utility/messaging/Message.h +++ b/src/lib/utility/messaging/Message.h @@ -12,10 +12,7 @@ class Message : public MessageBase { public: - - virtual ~Message() - { - } + virtual ~Message() = default; virtual std::string getType() const {