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

View File

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