logic: terminating all running tasks before closing the application (issue #343)
This commit is contained in:
@@ -54,3 +54,8 @@ void TaskParseWrapper::doReset(std::shared_ptr<Blackboard> blackboard)
|
||||
{
|
||||
m_taskRunner->reset();
|
||||
}
|
||||
|
||||
void TaskParseWrapper::doTerminate()
|
||||
{
|
||||
m_taskRunner->terminate();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
#include "utility/ScopedFunctor.h"
|
||||
|
||||
ScopedFunctor::ScopedFunctor()
|
||||
: m_onDestroy([](){})
|
||||
{
|
||||
}
|
||||
|
||||
ScopedFunctor::ScopedFunctor(std::function<void(void)> onDestroy)
|
||||
: m_onDestroy(onDestroy)
|
||||
{
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
class ScopedFunctor
|
||||
{
|
||||
public:
|
||||
ScopedFunctor();
|
||||
ScopedFunctor(std::function<void(void)> onDestroy);
|
||||
~ScopedFunctor();
|
||||
|
||||
|
||||
@@ -48,3 +48,8 @@ void Task::reset(std::shared_ptr<Blackboard> blackboard)
|
||||
m_enterCalled = false;
|
||||
m_exitCalled = false;
|
||||
}
|
||||
|
||||
void Task::terminate()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user