Fix task stopping checks in CBrain

This possibly fixes some issues resulting from improperly
stopping tasks (CTask::Abort() not called before deleting the task).
Found while looking for instances of #318.
dev-mp
Piotr Dziwinski 2014-08-10 17:57:41 +02:00
parent 9de086390b
commit 360b72ac5a
2 changed files with 39 additions and 124 deletions

View File

@ -812,11 +812,11 @@ void CBrain::StopProgram()
void CBrain::StopTask() void CBrain::StopTask()
{ {
if ( m_primaryTask != 0 ) if (m_primaryTask != nullptr)
{ {
m_primaryTask->Abort(); m_primaryTask->Abort();
delete m_primaryTask; // stops the current task delete m_primaryTask; // stops the current task
m_primaryTask = 0; m_primaryTask = nullptr;
} }
} }
@ -900,16 +900,10 @@ void CBrain::StopEditScript(bool bCancel)
Error CBrain::StartTaskTake() Error CBrain::StartTaskTake()
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskTake(); Error err = m_primaryTask->StartTaskTake();
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -918,16 +912,10 @@ Error CBrain::StartTaskTake()
Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm) Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskManip(order, arm); Error err = m_primaryTask->StartTaskManip(order, arm);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -936,16 +924,10 @@ Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank) Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskFlag(order, rank); Error err = m_primaryTask->StartTaskFlag(order, rank);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -954,16 +936,10 @@ Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank)
Error CBrain::StartTaskBuild(ObjectType type) Error CBrain::StartTaskBuild(ObjectType type)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskBuild(type); Error err = m_primaryTask->StartTaskBuild(type);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -972,16 +948,10 @@ Error CBrain::StartTaskBuild(ObjectType type)
Error CBrain::StartTaskSearch() Error CBrain::StartTaskSearch()
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskSearch(); Error err = m_primaryTask->StartTaskSearch();
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -990,38 +960,26 @@ Error CBrain::StartTaskSearch()
Error CBrain::StartTaskTerraform() Error CBrain::StartTaskTerraform()
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskTerraform(); Error err = m_primaryTask->StartTaskTerraform();
UpdateInterface(); UpdateInterface();
return err; return err;
} }
// Change pencil. // Change pencil.
Error CBrain::StartTaskPen(bool bDown, int color) Error CBrain::StartTaskPen(bool down, int color)
{ {
Error err;
m_physics->SetMotorSpeedX(0.0f); m_physics->SetMotorSpeedX(0.0f);
m_physics->SetMotorSpeedY(0.0f); m_physics->SetMotorSpeedY(0.0f);
m_physics->SetMotorSpeedZ(0.0f); m_physics->SetMotorSpeedZ(0.0f);
if ( m_primaryTask != 0 ) StopTask();
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskPen(bDown, color); Error err = m_primaryTask->StartTaskPen(down, color);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1030,16 +988,10 @@ Error CBrain::StartTaskPen(bool bDown, int color)
Error CBrain::StartTaskRecover() Error CBrain::StartTaskRecover()
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskRecover(); Error err = m_primaryTask->StartTaskRecover();
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1048,16 +1000,10 @@ Error CBrain::StartTaskRecover()
Error CBrain::StartTaskShield(TaskShieldMode mode) Error CBrain::StartTaskShield(TaskShieldMode mode)
{ {
Error err; StopTask();
if ( m_secondaryTask != 0 )
{
delete m_secondaryTask; // stops the current task
m_secondaryTask = 0;
}
m_secondaryTask = new CTaskManager(m_object); m_secondaryTask = new CTaskManager(m_object);
err = m_secondaryTask->StartTaskShield(mode, 1000.0f); Error err = m_secondaryTask->StartTaskShield(mode, 1000.0f);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1066,16 +1012,10 @@ Error CBrain::StartTaskShield(TaskShieldMode mode)
Error CBrain::StartTaskFire(float delay) Error CBrain::StartTaskFire(float delay)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskFire(delay); Error err = m_primaryTask->StartTaskFire(delay);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1084,16 +1024,10 @@ Error CBrain::StartTaskFire(float delay)
Error CBrain::StartTaskSpiderExplo() Error CBrain::StartTaskSpiderExplo()
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskSpiderExplo(); Error err = m_primaryTask->StartTaskSpiderExplo();
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1102,16 +1036,10 @@ Error CBrain::StartTaskSpiderExplo()
Error CBrain::StartTaskFireAnt(Math::Vector impact) Error CBrain::StartTaskFireAnt(Math::Vector impact)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskFireAnt(impact); Error err = m_primaryTask->StartTaskFireAnt(impact);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1120,16 +1048,10 @@ Error CBrain::StartTaskFireAnt(Math::Vector impact)
Error CBrain::StartTaskGunGoal(float dirV, float dirH) Error CBrain::StartTaskGunGoal(float dirV, float dirH)
{ {
Error err; StopTask();
if ( m_secondaryTask != 0 )
{
delete m_secondaryTask; // stops the current task
m_secondaryTask = 0;
}
m_secondaryTask = new CTaskManager(m_object); m_secondaryTask = new CTaskManager(m_object);
err = m_secondaryTask->StartTaskGunGoal(dirV, dirH); Error err = m_secondaryTask->StartTaskGunGoal(dirV, dirH);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1138,16 +1060,10 @@ Error CBrain::StartTaskGunGoal(float dirV, float dirH)
Error CBrain::StartTaskReset(Math::Vector goal, Math::Vector angle) Error CBrain::StartTaskReset(Math::Vector goal, Math::Vector angle)
{ {
Error err; StopTask();
if ( m_primaryTask != 0 )
{
delete m_primaryTask; // stops the current task
m_primaryTask = 0;
}
m_primaryTask = new CTaskManager(m_object); m_primaryTask = new CTaskManager(m_object);
err = m_primaryTask->StartTaskReset(goal, angle); Error err = m_primaryTask->StartTaskReset(goal, angle);
UpdateInterface(); UpdateInterface();
return err; return err;
} }
@ -1156,30 +1072,29 @@ Error CBrain::StartTaskReset(Math::Vector goal, Math::Vector angle)
Error CBrain::EndedTask() Error CBrain::EndedTask()
{ {
Error err; if (m_secondaryTask != nullptr) // current task?
if ( m_secondaryTask != 0 ) // current task?
{ {
err = m_secondaryTask->IsEnded(); Error err = m_secondaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended? if ( err != ERR_CONTINUE ) // job ended?
{ {
delete m_secondaryTask; delete m_secondaryTask;
m_secondaryTask = 0; m_secondaryTask = nullptr;
UpdateInterface(); UpdateInterface();
} }
} }
if ( m_primaryTask != 0 ) // current task? if (m_primaryTask != nullptr) // current task?
{ {
err = m_primaryTask->IsEnded(); Error err = m_primaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended? if ( err != ERR_CONTINUE ) // job ended?
{ {
delete m_primaryTask; delete m_primaryTask;
m_primaryTask = 0; m_primaryTask = nullptr;
UpdateInterface(); UpdateInterface();
} }
return err; return err;
} }
return ERR_STOP; return ERR_STOP;
} }

View File

@ -128,7 +128,7 @@ public:
Error StartTaskBuild(ObjectType type); Error StartTaskBuild(ObjectType type);
Error StartTaskSearch(); Error StartTaskSearch();
Error StartTaskTerraform(); Error StartTaskTerraform();
Error StartTaskPen(bool bDown, int color); Error StartTaskPen(bool down, int color);
Error StartTaskRecover(); Error StartTaskRecover();
Error StartTaskShield(TaskShieldMode mode); Error StartTaskShield(TaskShieldMode mode);
Error StartTaskFire(float delay); Error StartTaskFire(float delay);