logic: terminating all running tasks before closing the application (issue #343)

This commit is contained in:
malte_langkabel
2017-04-12 10:46:56 +02:00
parent 0e4b606c7c
commit 6e342fa87c
23 changed files with 127 additions and 25 deletions
+5
View File
@@ -54,3 +54,8 @@ void TaskParseWrapper::doReset(std::shared_ptr<Blackboard> blackboard)
{
m_taskRunner->reset();
}
void TaskParseWrapper::doTerminate()
{
m_taskRunner->terminate();
}
+1
View File
@@ -28,6 +28,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
PersistentStorage* m_storage;
+5
View File
@@ -1,5 +1,10 @@
#include "utility/ScopedFunctor.h"
ScopedFunctor::ScopedFunctor()
: m_onDestroy([](){})
{
}
ScopedFunctor::ScopedFunctor(std::function<void(void)> onDestroy)
: m_onDestroy(onDestroy)
{
+1
View File
@@ -6,6 +6,7 @@
class ScopedFunctor
{
public:
ScopedFunctor();
ScopedFunctor(std::function<void(void)> onDestroy);
~ScopedFunctor();
+5
View File
@@ -48,3 +48,8 @@ void Task::reset(std::shared_ptr<Blackboard> blackboard)
m_enterCalled = false;
m_exitCalled = false;
}
void Task::terminate()
{
}
+1
View File
@@ -23,6 +23,7 @@ public:
TaskState update(std::shared_ptr<Blackboard> blackboard);
void reset(std::shared_ptr<Blackboard> blackboard);
virtual void terminate(); // caution: this should only be called just before quitting the app.
private:
virtual void doEnter(std::shared_ptr<Blackboard> blackboard) = 0;
@@ -13,3 +13,8 @@ std::shared_ptr<TaskDecorator> TaskDecorator::addChildTask(std::shared_ptr<Task>
setTask(child);
return shared_from_this();
}
void TaskDecorator::terminate()
{
doTerminate();
}
@@ -15,6 +15,10 @@ public:
std::shared_ptr<TaskDecorator> addChildTask(std::shared_ptr<Task> child);
virtual void setTask(std::shared_ptr<Task> task) = 0;
virtual void terminate();
private:
virtual void doTerminate() = 0;
};
#endif // TASK_DECORATOR_H
@@ -48,3 +48,8 @@ void TaskDecoratorRepeat::doReset(std::shared_ptr<Blackboard> blackboard)
{
m_taskRunner->reset();
}
void TaskDecoratorRepeat::doTerminate()
{
m_taskRunner->terminate();
}
@@ -24,6 +24,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::shared_ptr<TaskRunner> m_taskRunner;
const ConditionType m_condition;
+6 -1
View File
@@ -27,4 +27,9 @@ std::shared_ptr<TaskGroup> TaskGroup::addChildTasks(std::shared_ptr<Task> child1
addTask(child2);
addTask(child3);
return shared_from_this();
}
}
void TaskGroup::terminate()
{
doTerminate();
}
+4
View File
@@ -18,6 +18,10 @@ public:
std::shared_ptr<TaskGroup> addChildTasks(std::shared_ptr<Task> child1, std::shared_ptr<Task> child2, std::shared_ptr<Task> child3);
virtual void addTask(std::shared_ptr<Task> task) = 0;
virtual void terminate();
private:
virtual void doTerminate() = 0;
};
@@ -73,6 +73,19 @@ void TaskGroupParallel::doReset(std::shared_ptr<Blackboard> blackboard)
}
}
void TaskGroupParallel::doTerminate()
{
for (size_t i = 0; i < m_tasks.size(); i++)
{
m_tasks[i]->taskRunner->terminate();
if (m_tasks[i]->thread)
{
m_tasks[i]->thread->detach();
m_tasks[i]->thread.reset();
}
}
}
void TaskGroupParallel::processTaskThreaded(std::shared_ptr<TaskInfo> taskInfo, std::shared_ptr<Blackboard> blackboard)
{
ScopedFunctor functor([&](){
@@ -33,6 +33,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
void processTaskThreaded(std::shared_ptr<TaskInfo> taskInfo, std::shared_ptr<Blackboard> blackboard);
int getActveTaskCount() const;
@@ -54,3 +54,11 @@ void TaskGroupSelector::doReset(std::shared_ptr<Blackboard> blackboard)
m_taskRunners[i]->reset();
}
}
void TaskGroupSelector::doTerminate()
{
for (size_t i = 0; i < m_taskRunners.size(); i++)
{
m_taskRunners[i]->terminate();
}
}
@@ -18,6 +18,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::vector<std::shared_ptr<TaskRunner>> m_taskRunners;
int m_taskIndex;
@@ -54,3 +54,11 @@ void TaskGroupSequence::doReset(std::shared_ptr<Blackboard> blackboard)
m_taskRunners[i]->reset();
}
}
void TaskGroupSequence::doTerminate()
{
for (size_t i = 0; i < m_taskRunners.size(); i++)
{
m_taskRunners[i]->terminate();
}
}
@@ -18,6 +18,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::vector<std::shared_ptr<TaskRunner>> m_taskRunners;
int m_taskIndex;
@@ -26,4 +26,13 @@ void TaskRunner::reset()
m_reset = true;
}
void TaskRunner::terminate()
{
if (m_task)
{
m_task->terminate();
}
}
+2 -1
View File
@@ -13,10 +13,11 @@ public:
Task::TaskState update(std::shared_ptr<Blackboard> blackboard);
void reset();
void terminate(); // caution: this should only be called just before quitting the app.
private:
std::shared_ptr<Task> m_task;
bool m_reset;
};
#endif // TASK_H
#endif // TASK_RUNNER_H
@@ -161,6 +161,7 @@ void TaskScheduler::processTasks()
if (!m_loopIsRunning)
{
runner->terminate();
break;
}
}
+10 -7
View File
@@ -35,14 +35,17 @@ bool SourceGroupCxx::prepareRefresh()
{
MessageStatus("Can't refresh project").dispatch();
if (Application::getInstance()->hasGUI())
if (std::shared_ptr<Application> application = Application::getInstance())
{
std::vector<std::string> options;
options.push_back("Ok");
Application::getInstance()->handleDialog(
"Can't refresh. The compilation database of the project does not exist anymore: " + cdbPath.str(),
options
);
if (application->hasGUI())
{
std::vector<std::string> options;
options.push_back("Ok");
application->handleDialog(
"Can't refresh. The compilation database of the project does not exist anymore: " + cdbPath.str(),
options
);
}
}
return false;
}
+30 -16
View File
@@ -51,18 +51,20 @@ void SourceGroupJava::fetchAllSourceFilePaths()
std::vector<FilePath> sourcePaths;
if (m_settings->getAbsoluteMavenProjectFilePath().exists())
{
if (Application::getInstance()->hasGUI())
std::shared_ptr<Application> application = Application::getInstance();
if (application && application->hasGUI())
{
Application::getInstance()->getDialogView()->showStatusDialog("Preparing Project", "Maven\nFetching Source Directories");
application->getDialogView()->showStatusDialog("Preparing Project", "Maven\nFetching Source Directories");
}
const FilePath mavenPath(ApplicationSettings::getInstance()->getMavenPath());
const FilePath projectRootPath = m_settings->getAbsoluteMavenProjectFilePath().parentDirectory();
sourcePaths = utility::mavenGetAllDirectoriesFromEffectivePom(mavenPath, projectRootPath, m_settings->getShouldIndexMavenTests());
if (Application::getInstance()->hasGUI())
if (application && application->hasGUI())
{
Application::getInstance()->getDialogView()->hideStatusDialog();
application->getDialogView()->hideStatusDialog();
}
}
else
@@ -159,23 +161,29 @@ bool SourceGroupJava::prepareJavaEnvironment()
bool SourceGroupJava::prepareMavenData()
{
if (m_settings->getAbsoluteMavenProjectFilePath().exists())
if (m_settings && m_settings->getAbsoluteMavenProjectFilePath().exists())
{
const FilePath mavenPath = ApplicationSettings::getInstance()->getMavenPath();
const FilePath projectRootPath = m_settings->getAbsoluteMavenProjectFilePath().parentDirectory();
if (Application::getInstance()->hasGUI())
ScopedFunctor dialogHider;
std::shared_ptr<Application> application = Application::getInstance();
if (application && application->hasGUI())
{
ScopedFunctor dialogHider([](){
// this makes sure to hide the dialog when leaving this method.
dialogHider = ScopedFunctor([](){
Application::getInstance()->getDialogView()->hideStatusDialog();
});
Application::getInstance()->getDialogView()->showStatusDialog("Preparing Project", "Maven\nGenerating Source Files");
bool success = utility::mavenGenerateSources(
mavenPath, projectRootPath
);
}
if (!success)
bool success = utility::mavenGenerateSources(mavenPath, projectRootPath);
if (!success)
{
if (application && application->hasGUI())
{
const std::string dialogMessage =
"Sourcetrail was unable to locate Maven on this machine.\n"
@@ -184,11 +192,15 @@ bool SourceGroupJava::prepareMavenData()
MessageStatus(dialogMessage, true, false).dispatch();
Application::getInstance()->handleDialog(dialogMessage);
return false;
}
return false;
}
if (application && application->hasGUI())
{
Application::getInstance()->getDialogView()->showStatusDialog("Preparing Project", "Maven\nExporting Dependencies");
}
utility::mavenCopyDependencies(
mavenPath, projectRootPath, m_settings->getAbsoluteMavenDependenciesDirectory()
);
@@ -235,11 +247,13 @@ std::vector<FilePath> SourceGroupJava::getClassPath()
std::set<FilePath> SourceGroupJava::fetchRootDirectories()
{
if (Application::getInstance()->hasGUI())
if (std::shared_ptr<Application> application = Application::getInstance())
{
Application::getInstance()->getDialogView()->showStatusDialog("Preparing Project", "Gathering Root\nDirectories");
if (application->hasGUI())
{
application->getDialogView()->showStatusDialog("Preparing Project", "Gathering Root\nDirectories");
}
}
std::set<FilePath> rootDirectories;
std::shared_ptr<JavaEnvironment> javaEnvironment = JavaEnvironmentFactory::getInstance()->createEnvironment();