logic: fixed crash when renaming the temp storage while it is still used

This commit is contained in:
mlangkabel
2018-07-10 14:14:48 +02:00
parent 58eb994a60
commit ee3bf41a27
9 changed files with 37 additions and 33 deletions
+16 -10
View File
@@ -8,7 +8,7 @@
#include "Application.h" #include "Application.h"
TaskCleanStorage::TaskCleanStorage( TaskCleanStorage::TaskCleanStorage(
PersistentStorage* storage, const std::vector<FilePath>& filePaths, bool clearAllErrors std::weak_ptr<PersistentStorage> storage, const std::vector<FilePath>& filePaths, bool clearAllErrors
) )
: m_storage(storage) : m_storage(storage)
, m_filePaths(filePaths) , m_filePaths(filePaths)
@@ -25,23 +25,29 @@ void TaskCleanStorage::doEnter(std::shared_ptr<Blackboard> blackboard)
if (!m_filePaths.empty() || m_clearAllErrors) if (!m_filePaths.empty() || m_clearAllErrors)
{ {
m_storage->setMode(SqliteIndexStorage::STORAGE_MODE_CLEAR); if (std::shared_ptr<PersistentStorage> storage = m_storage.lock())
{
storage->setMode(SqliteIndexStorage::STORAGE_MODE_CLEAR);
}
} }
} }
Task::TaskState TaskCleanStorage::doUpdate(std::shared_ptr<Blackboard> blackboard) Task::TaskState TaskCleanStorage::doUpdate(std::shared_ptr<Blackboard> blackboard)
{ {
if (m_clearAllErrors) if (std::shared_ptr<PersistentStorage> storage = m_storage.lock())
{ {
m_storage->clearAllErrors(); if (m_clearAllErrors)
}
m_storage->clearFileElements(m_filePaths, [=](int progress)
{ {
Application::getInstance()->getDialogView(DialogView::UseCase::INDEXING)->showProgressDialog( storage->clearAllErrors();
L"Clearing", std::to_wstring(m_filePaths.size()) + L" Files", progress);
} }
);
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(); m_filePaths.clear();
+2 -2
View File
@@ -15,7 +15,7 @@ class TaskCleanStorage
{ {
public: public:
TaskCleanStorage( TaskCleanStorage(
PersistentStorage* storage, std::weak_ptr<PersistentStorage> storage,
const std::vector<FilePath>& filePaths, const std::vector<FilePath>& filePaths,
bool clearAllErrors bool clearAllErrors
); );
@@ -26,7 +26,7 @@ private:
void doExit(std::shared_ptr<Blackboard> blackboard) override; void doExit(std::shared_ptr<Blackboard> blackboard) override;
void doReset(std::shared_ptr<Blackboard> blackboard) override; void doReset(std::shared_ptr<Blackboard> blackboard) override;
PersistentStorage* m_storage; std::weak_ptr<PersistentStorage> m_storage;
std::vector<FilePath> m_filePaths; std::vector<FilePath> m_filePaths;
bool m_clearAllErrors; bool m_clearAllErrors;
+1
View File
@@ -109,6 +109,7 @@ Task::TaskState TaskFinishParsing::doUpdate(std::shared_ptr<Blackboard> blackboa
void TaskFinishParsing::doExit(std::shared_ptr<Blackboard> blackboard) void TaskFinishParsing::doExit(std::shared_ptr<Blackboard> blackboard)
{ {
m_storage.reset();
} }
void TaskFinishParsing::doReset(std::shared_ptr<Blackboard> blackboard) void TaskFinishParsing::doReset(std::shared_ptr<Blackboard> blackboard)
+6 -3
View File
@@ -8,7 +8,7 @@
TaskInjectStorage::TaskInjectStorage( TaskInjectStorage::TaskInjectStorage(
std::shared_ptr<StorageProvider> storageProvider, std::shared_ptr<StorageProvider> storageProvider,
std::shared_ptr<Storage> target std::weak_ptr<Storage> target
) )
: m_storageProvider(storageProvider) : m_storageProvider(storageProvider)
, m_target(target) , m_target(target)
@@ -26,8 +26,11 @@ Task::TaskState TaskInjectStorage::doUpdate(std::shared_ptr<Blackboard> blackboa
std::shared_ptr<IntermediateStorage> source = m_storageProvider->consumeLargestStorage(); std::shared_ptr<IntermediateStorage> source = m_storageProvider->consumeLargestStorage();
if (source) if (source)
{ {
m_target->inject(source.get()); if (std::shared_ptr<Storage> target = m_target.lock())
return STATE_SUCCESS; {
target->inject(source.get());
return STATE_SUCCESS;
}
} }
} }
else else
+2 -2
View File
@@ -14,7 +14,7 @@ class TaskInjectStorage
public: public:
TaskInjectStorage( TaskInjectStorage(
std::shared_ptr<StorageProvider> storageProvider, std::shared_ptr<StorageProvider> storageProvider,
std::shared_ptr<Storage> target std::weak_ptr<Storage> target
); );
private: private:
@@ -24,7 +24,7 @@ private:
void doReset(std::shared_ptr<Blackboard> blackboard) override; void doReset(std::shared_ptr<Blackboard> blackboard) override;
std::shared_ptr<StorageProvider> m_storageProvider; std::shared_ptr<StorageProvider> m_storageProvider;
std::shared_ptr<Storage> m_target; std::weak_ptr<Storage> m_target;
}; };
#endif // TASK_INJECT_STORAGE_H #endif // TASK_INJECT_STORAGE_H
+5 -6
View File
@@ -6,15 +6,11 @@
#include "utility/utility.h" #include "utility/utility.h"
#include "Application.h" #include "Application.h"
TaskParseWrapper::TaskParseWrapper(PersistentStorage* storage) TaskParseWrapper::TaskParseWrapper(std::weak_ptr<PersistentStorage> storage)
: m_storage(storage) : m_storage(storage)
{ {
} }
TaskParseWrapper::~TaskParseWrapper()
{
}
void TaskParseWrapper::doEnter(std::shared_ptr<Blackboard> blackboard) void TaskParseWrapper::doEnter(std::shared_ptr<Blackboard> blackboard)
{ {
int sourceFileCount = 0; int sourceFileCount = 0;
@@ -30,7 +26,10 @@ void TaskParseWrapper::doEnter(std::shared_ptr<Blackboard> blackboard)
if (sourceFileCount > 0) if (sourceFileCount > 0)
{ {
m_storage->setMode(SqliteIndexStorage::STORAGE_MODE_WRITE); if (std::shared_ptr<PersistentStorage> storage = m_storage.lock())
{
storage->setMode(SqliteIndexStorage::STORAGE_MODE_WRITE);
}
} }
} }
+2 -3
View File
@@ -16,8 +16,7 @@ class TaskParseWrapper
: public TaskDecorator : public TaskDecorator
{ {
public: public:
TaskParseWrapper(PersistentStorage* storage); TaskParseWrapper(std::weak_ptr<PersistentStorage> storage);
virtual ~TaskParseWrapper();
private: private:
virtual void doEnter(std::shared_ptr<Blackboard> blackboard); virtual void doEnter(std::shared_ptr<Blackboard> blackboard);
@@ -25,7 +24,7 @@ private:
virtual void doExit(std::shared_ptr<Blackboard> blackboard); virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard); virtual void doReset(std::shared_ptr<Blackboard> blackboard);
PersistentStorage* m_storage; std::weak_ptr<PersistentStorage> m_storage;
TimeStamp m_start; TimeStamp m_start;
}; };
+2 -3
View File
@@ -422,7 +422,7 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView)
if (info.mode != REFRESH_ALL_FILES && (info.filesToClear.size() || info.nonIndexedFilesToClear.size())) if (info.mode != REFRESH_ALL_FILES && (info.filesToClear.size() || info.nonIndexedFilesToClear.size()))
{ {
taskSequential->addTask(std::make_shared<TaskCleanStorage>( taskSequential->addTask(std::make_shared<TaskCleanStorage>(
tempStorage.get(), tempStorage,
utility::toVector(utility::concat(info.filesToClear, info.nonIndexedFilesToClear)), utility::toVector(utility::concat(info.filesToClear, info.nonIndexedFilesToClear)),
info.mode == REFRESH_UPDATED_AND_INCOMPLETE_FILES info.mode == REFRESH_UPDATED_AND_INCOMPLETE_FILES
)); ));
@@ -467,7 +467,7 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView)
taskSequential->addTask(std::make_shared<TaskSetValue<int>>("indexed_source_file_count", 0)); taskSequential->addTask(std::make_shared<TaskSetValue<int>>("indexed_source_file_count", 0));
taskSequential->addTask(std::make_shared<TaskSetValue<int>>("indexer_count", 0)); taskSequential->addTask(std::make_shared<TaskSetValue<int>>("indexer_count", 0));
std::shared_ptr<TaskParseWrapper> taskParserWrapper = std::make_shared<TaskParseWrapper>(tempStorage.get()); std::shared_ptr<TaskParseWrapper> taskParserWrapper = std::make_shared<TaskParseWrapper>(tempStorage);
taskSequential->addTask(taskParserWrapper); taskSequential->addTask(taskParserWrapper);
std::shared_ptr<TaskGroupParallel> taskParallelIndexing = std::make_shared<TaskGroupParallel>(); std::shared_ptr<TaskGroupParallel> taskParallelIndexing = std::make_shared<TaskGroupParallel>();
@@ -537,7 +537,6 @@ void Project::buildIndex(const RefreshInfo& info, DialogView* dialogView)
taskSequential->addTask(std::make_shared<TaskFinishParsing>(tempStorage)); taskSequential->addTask(std::make_shared<TaskFinishParsing>(tempStorage));
taskSequential->addTask(std::make_shared<TaskGroupSelector>()->addChildTasks( taskSequential->addTask(std::make_shared<TaskGroupSelector>()->addChildTasks(
std::make_shared<TaskGroupSequence>()->addChildTasks( std::make_shared<TaskGroupSequence>()->addChildTasks(
std::make_shared<TaskFindValue>("keep_database"), std::make_shared<TaskFindValue>("keep_database"),
+1 -4
View File
@@ -12,10 +12,7 @@ class Message
: public MessageBase : public MessageBase
{ {
public: public:
virtual ~Message() = default;
virtual ~Message()
{
}
virtual std::string getType() const virtual std::string getType() const
{ {