gradido/src/cpp/tasks/Task.cpp
2019-10-26 19:19:52 +02:00

92 lines
2.2 KiB
C++

#include "Task.h"
namespace UniLib {
namespace controller {
Task::Task()
: mTaskScheduled(false), mFinishCommand(nullptr), mParentTaskPtrArray(nullptr),
mParentTaskPtrArraySize(0), mDeleted(false), mFinished(false), mReferenceCount(1)
{
}
Task::Task(size_t taskPointerArraySize)
: mTaskScheduled(false), mFinishCommand(nullptr), mParentTaskPtrArray(new TaskPtr[taskPointerArraySize]), mParentTaskPtrArraySize(taskPointerArraySize),
mDeleted(false), mFinished(false), mReferenceCount(1)
{
}
Task::~Task()
{
mWorkingMutex.lock();
//printf("[Task::~Task]\n");
if (mParentTaskPtrArraySize) {
delete[] mParentTaskPtrArray;
}
if (mFinishCommand) {
delete mFinishCommand;
}
mParentTaskPtrArraySize = 0;
mDeleted = true;
//printf("[Task::~Task] finished\n");
mWorkingMutex.unlock();
}
bool Task::isAllParentsReady()
{
bool allFinished = true;
lock();
for(size_t i = 0; i < mParentTaskPtrArraySize; i++) {
TaskPtr task = mParentTaskPtrArray[i];
if (!task.isNull() && !task->isTaskFinished()) {
allFinished = false;
if(!task->isTaskSheduled())
mParentTaskPtrArray[i]->scheduleTask(mParentTaskPtrArray[i]);
}
}
unlock();
return allFinished;
}
TaskPtr Task::getParent(int index)
{
if (index < 0 || index >= mParentTaskPtrArraySize) {
return nullptr;
}
return mParentTaskPtrArray[index];
}
void Task::duplicate()
{
mReferenceMutex.lock();
mReferenceCount++;
//printf("[Task::duplicate] new value: %d\n", mReferenceCount);
mReferenceMutex.unlock();
}
void Task::release()
{
mReferenceMutex.lock();
mReferenceCount--;
//printf("[Task::release] new value: %d\n", mReferenceCount);
if (0 == mReferenceCount) {
mReferenceMutex.unlock();
delete this;
return;
}
mReferenceMutex.unlock();
}
void Task::setTaskFinished() {
lock();
mFinished = true;
if (mFinishCommand) {
mFinishCommand->taskFinished(this);
}
unlock();
}
}
}