00001
00008 #define DKUTIL_C_TASK_ENGINE_C
00009 #include "dkcTaskEngine.h"
00010
00011 DKC_TASK_ENGINE *dkcAllocTaskEngine(size_t taskworksize){
00012 BYTE *temp = NULL;
00013
00014 DKC_TASK_ENGINE *p = NULL;
00015 DKC_TASK *tp = NULL;
00016
00017 if(0==taskworksize){
00018 return NULL;
00019 }
00020
00021
00022
00023 p = dkcAllocate(sizeof(DKC_TASK_ENGINE));
00024 if(NULL==p){
00025 return NULL;
00026 }
00027
00028 temp = dkcAllocate(taskworksize * dkcdTASK_NUM);
00029 if(NULL==temp){
00030 goto Error;
00031 }
00032 tp = dkcAllocate(sizeof(DKC_TASK) * dkcdTASK_NUM);
00033 if(NULL==tp){
00034 goto Error;
00035 }
00036
00037
00038
00039 dkcTaskEngineInit(p,&tp,&temp);
00040
00041 return p;
00042
00043
00044 Error:
00045
00046 dkcFree((void **)&temp);
00047 dkcFree((void **)&p);
00048
00049 return NULL;
00050 }
00051
00052 int dkcFreeTaskEngine(DKC_TASK_ENGINE **pp){
00053 dkcFree((void **) (*pp)->mTaskPool );
00054 dkcFree((void **) (*pp)->mTaskWorkPool );
00055 return dkcFree((void **) pp );
00056 }
00057
00058 static void Return(DKC_TASK_ENGINE *a,DKC_TASK *b)
00059 {
00060 return;
00061 }
00062
00063 void dkcTaskEngineInit(DKC_TASK_ENGINE *p,DKC_TASK *TaskPool[dkcdTASK_NUM],BYTE *TaskWorkPool[dkcdTASK_NUM]){
00064 int i;
00065 size_t taskworksize = p->mTaskWorkSize;
00066 p->mNowPriority = 0;
00067
00068 for(i=0;i<dkcdTASK_NUM;i++){
00069 p->mTaskWorkPool[i] = TaskWorkPool[i * taskworksize];
00070
00071 TaskPool[i]->proc = Return;
00072 TaskPool[i]->work = p->mTaskWorkPool[i];
00073
00074 p->mTaskPool[i] = (BYTE *)TaskPool[i];
00075 }
00076 }
00077
00079 int dkcTaskEngineSet(DKC_TASK_ENGINE *p,TASK_COUNT_T prio,DKC_TASK_PROC proc){
00080 DKC_TASK_PROC sentinel = Return;
00081 DKC_TASK *pt = (DKC_TASK *)p->mTaskPool[prio];
00082
00083 if(pt->proc != sentinel)
00084 {
00085 return edk_FAILED;
00086 }
00087
00088
00089 pt->proc = proc;
00090
00091 return edk_SUCCEEDED;
00092 }
00093
00095 int dkcTaskEngineKill(DKC_TASK_ENGINE *p,TASK_COUNT_T prio)
00096 {
00097 DKC_TASK *pt = (DKC_TASK *)p->mTaskPool[prio];
00098
00099 pt->proc = Return;
00100 return edk_SUCCEEDED;
00101 }
00102
00104 int dkcTaskEngineIteration(DKC_TASK_ENGINE *p){
00105 unsigned int i;
00106
00107 DKC_TASK_PROC proc;
00108 DKC_TASK *task_p;
00109
00110 for(i=0;i<dkcdTASK_NUM;i++){
00111 task_p = (DKC_TASK *)(p->mTaskPool[i]);
00112 proc = task_p->proc;
00113 p->mNowPriority = (TASK_COUNT_T)i;
00114
00115
00116 proc(p,task_p);
00117
00118 }
00119 return edk_SUCCEEDED;
00120
00121 }
00122
00123
00125 BOOL dkcTaskEngineEmpty(DKC_TASK_ENGINE *p,TASK_COUNT_T prio){
00126 DKC_TASK_PROC tp = Return;
00127 DKC_TASK *task_p = (DKC_TASK *)p->mTaskPool[prio];
00128
00129 return (task_p->proc==tp);
00130 }
00131
00132
00133
00134
00135