mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
92 lines
2.2 KiB
C++
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();
|
|
}
|
|
|
|
}
|
|
} |