メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcTaskEngine.c

説明を見る。

    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     //dkcFree((void **)&tp);
    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 );//&[0]
    00054     dkcFree((void **) (*pp)->mTaskWorkPool );//&[0]
    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