Mercurial > hg > Members > innparusu > Gears
diff src/parallel_execution/dependency.c @ 122:a086857e1812
implement dependency example. do not work
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 25 Aug 2016 03:23:29 +0900 |
parents | bb8be1820302 |
children | 4ff6f093b695 |
line wrap: on
line diff
--- a/src/parallel_execution/dependency.c Tue Jul 26 13:06:46 2016 +0900 +++ b/src/parallel_execution/dependency.c Thu Aug 25 03:23:29 2016 +0900 @@ -3,13 +3,13 @@ #include "origin_cs.h" __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) { - context->data[Queue] = (union Data *)queue; + context->data[Queue] = (union Data*)queue; goto (context->code[next])(context); } __code waitFor(struct Context* context, struct Task* slave, struct Element* element, union Data* data) { - struct Integer integer = (struct Integer *)data; - struct Queue waitMeTasks = (struct Queue *)(integer + integer-> mDataOffset); + struct Integer* integer = (struct Integer *)data; + struct Queue* waitMeTasks = (struct Queue *)(integer + integer-> mDataOffset); element->data = (union Data *)slave; goto meta_waitFor(context, waitMeTasks, PutQueue1); } @@ -37,7 +37,7 @@ __code spawnTask_stub(struct Context* context) { goto spawnTask(context, - &context->data[context->dataNum]->task, + (struct Task *)(context->data[Element]->element.data), &context->data[Element]->element, &context->data[ActiveQueue]->queue, &context->data[WaitQueue]->queue); @@ -48,25 +48,34 @@ goto (context->code[next])(context); } -__code checkTaskFinish1(struct Context* context, struct Data* data) { - struct Integer integer = (struct Integer *)data; - struct Queue waitMeTasks = (struct Queue *)(integer + integer->mDataOffset); - context->next = check_task_finish2; - goto meta_check_task_finish1(context, waitMeTasks, GetQueue1); +__code checkTaskFinish1(struct Context* context, union Data* data) { + struct Integer* integer = (struct Integer *)data; + struct Queue* waitMeTasks = (struct Queue *)(integer + integer->mDataOffset); + context->next = CheckTaskFinish2; + goto meta_checkTaskFinish1(context, waitMeTasks, GetQueue1); } __code checkTaskFinish1_stub(struct Context* context) { + goto checkTaskFinish1(context, + ((struct Task*)(context->data[Element]->element.data))->oargs[0]); } /* * ready input data Gear for waitme task */ -__code checkTaskFinish2(struct Context* context) { - struct Task task = ((struct Task) element -> data); - task->idsCount--; +__code checkTaskFinish2(struct Context* context, struct Task* task) { + // using cas? + // + if (__sync_fetch_and_sub(&task->idsCount, 1)) { + goto meta(context, GetQueue1); + } else { + goto meta(context, CheckTaskFinish2); + } } __code checkTaskFinish2_stub(struct Context* context) { + goto checkTaskFinish1(context, + (struct Task*)(context->data[Element]->element.data)); } __code add(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) { @@ -74,7 +83,21 @@ goto meta(context, context->next); } +__code add_stub(struct Context* context) { + goto add(context, + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[0], + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[1], + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->oargs[0]); +} + __code mult(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) { output->value = input1->value * input2->value; goto meta(context, context->next); } + +__code mult_stub(struct Context* context) { + goto mult(context, + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[0], + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[1], + (struct Integer*)((struct Task*)(context->data[Element]->element.data))->oargs[0]); +}