int AddTask(void (*p_Task)(void),unsigned char TaskPriority) { unsigned char TaskPriorityTmp; if (TaskArray[TaskPriority]==0) { TaskArray[TaskPriority]=p_Task; CurrentPriority=(CurrentPriority>TaskPriority)?TaskPriority:CurrentPriority; } else return -1; if (firstaddtask==0) { ListHead=(struct TaskTimeList *)malloc(sizeof(struct TaskTimeList)); ListHead->next=0; ListHead->tasknode=(struct TaskPrioNode *)malloc(sizeof(struct TaskPrioNode)); ListHead->tasknode->next=0; ListHead->Time=0; ListHead->tasknode->Priority=TaskPriority; firstaddtask=-1; } else { TaskPriorityTmp=CurrentPriority; CurrentPriority=TaskPriority; TaskDelay(0); CurrentPriority=TaskPriorityTmp; } return 0; }
void __task demo_task(void * data) { int i; i = (int)data; for(;;){ lock_kernel(); printf("Task Data: %d\n", i); unlock_kernel(); TaskDelay(100*i); } }
// Each child class has to be added to the switch in this function (clumsy..) Task* Task::createFromStr(const string params, bool rand) { vector<string> exploded; Task *result; split(params, ITEM_SEPARATOR[0], exploded); switch (exploded[0][0]) { case TASK_WIN_AGAINST: result = NEW TaskWinAgainst(); break; case TASK_SLAUGHTER: result = NEW TaskSlaughter(); break; case TASK_DELAY: result = NEW TaskDelay(); break; case TASK_IMMORTAL: result = NEW TaskImmortal(); break; case TASK_MASSIVE_BURIAL: result = NEW TaskMassiveBurial(); break; case TASK_WISDOM: result = NEW TaskWisdom(); break; case TASK_PACIFISM: result = NEW TaskPacifism(); break; default: #if defined (WIN32) || defined (LINUX) DebugTrace("\nTasks.cpp::createFromStr: Undefined class type\n"); #endif result = NEW TaskWinAgainst(); } if (!result) { #if defined (WIN32) || defined (LINUX) DebugTrace("\nTask::createFromStr: Failed to create task\n"); #endif return NULL; } result->persistentAttribs = exploded; if (exploded.size() >= COMMON_ATTRIBS_COUNT) { result->restoreCommonAttribs(); if (exploded.size() > COMMON_ATTRIBS_COUNT) { result->restoreCustomAttribs(); } } else if (rand) { result->randomize(); } return result; }