gradido/src/cpp/tasks/Task.cpp

64 lines
1.5 KiB
C++

#include "Task.h"
namespace UniLib {
namespace controller {
Task::Task()
: mTaskScheduled(false), mFinishCommand(nullptr), mParentTaskPtrArray(nullptr),
mParentTaskPtrArraySize(0), mDeleted(false), mReferenceCount(1)
{
}
Task::Task(size_t taskPointerArraySize)
: mTaskScheduled(false), mFinishCommand(nullptr), mParentTaskPtrArray(new TaskPtr[taskPointerArraySize]), mParentTaskPtrArraySize(taskPointerArraySize),
mDeleted(false)
{
}
Task::~Task()
{
if (mParentTaskPtrArraySize) {
delete[] mParentTaskPtrArray;
}
mParentTaskPtrArraySize = 0;
mWorkingMutex.lock();
mDeleted = true;
mWorkingMutex.unlock();
}
bool Task::isAllParentsReady()
{
bool allFinished = true;
lock();
for(size_t i = 0; i < mParentTaskPtrArraySize; i++) {
TaskPtr task = mParentTaskPtrArray[i];
if (!task.isNull()) {
allFinished = false;
continue;
}
if(!task->isTaskFinished()) {
allFinished = false;
if(!task->isTaskSheduled())
mParentTaskPtrArray[i]->scheduleTask(mParentTaskPtrArray[i]);
}
}
unlock();
return allFinished;
}
void Task::duplicate()
{
mReferenceCount++;
}
void Task::release()
{
mReferenceCount--;
if (0 == mReferenceCount) {
delete this;
}
}
}
}