# HG changeset patch # User Tatsuki IHA # Date 1474964520 -32400 # Node ID 77e60b6cdace3c0d23c807deec473ca8ac9a90af # Parent acf0453b1c7afc4487af65bf02535bbd476dd8f2 Work dependency example diff -r acf0453b1c7a -r 77e60b6cdace src/parallel_execution/context.c --- a/src/parallel_execution/context.c Tue Sep 27 16:19:31 2016 +0900 +++ b/src/parallel_execution/context.c Tue Sep 27 17:22:00 2016 +0900 @@ -61,7 +61,7 @@ extern __code putQueue2_stub(struct Context*); extern __code putQueue3_stub(struct Context*); extern __code putQueue4_stub(struct Context*); -extern __code initWorker_stub(struct Context*); +extern __code getTask_stub(struct Context*); extern __code getQueue1_stub(struct Context*); extern __code getInputData1_stub(struct Context*); extern __code getInputData2_stub(struct Context*); @@ -141,7 +141,7 @@ context->code[PutQueue2] = putQueue2_stub; context->code[PutQueue3] = putQueue3_stub; context->code[PutQueue4] = putQueue4_stub; - context->code[InitWorker] = initWorker_stub; + context->code[GetTask] = getTask_stub; context->code[GetQueue1] = getQueue1_stub; context->code[GetInputData1] = getInputData1_stub; context->code[GetInputData2] = getInputData2_stub; diff -r acf0453b1c7a -r 77e60b6cdace src/parallel_execution/context.h --- a/src/parallel_execution/context.h Tue Sep 27 16:19:31 2016 +0900 +++ b/src/parallel_execution/context.h Tue Sep 27 17:22:00 2016 +0900 @@ -70,7 +70,7 @@ PutQueue2, PutQueue3, PutQueue4, - InitWorker, + GetTask, GetQueue1, GetInputData1, GetInputData2, @@ -158,6 +158,8 @@ struct Element* first; struct Element* last; int count; + enum Code next; + enum Code emptyNext; } queue; struct Element { union Data* data; diff -r acf0453b1c7a -r 77e60b6cdace src/parallel_execution/dependency.c --- a/src/parallel_execution/dependency.c Tue Sep 27 16:19:31 2016 +0900 +++ b/src/parallel_execution/dependency.c Tue Sep 27 17:22:00 2016 +0900 @@ -54,6 +54,7 @@ struct Integer* integer = (struct Integer *)data; struct Queue* waitMeTasks = (struct Queue *)(integer + integer->mDataOffset / sizeof(struct Integer)); context->next = CheckTaskFinish2; + waitMeTasks->emptyNext = GetTask; goto meta_checkTaskFinish1(context, waitMeTasks, GetQueue1); } @@ -67,7 +68,6 @@ */ __code checkTaskFinish2(struct Context* context, struct Task* task) { // using cas? - // if (__sync_fetch_and_sub(&task->idsCount, 1)) { goto meta(context, GetQueue1); } else { diff -r acf0453b1c7a -r 77e60b6cdace src/parallel_execution/main.c --- a/src/parallel_execution/main.c Tue Sep 27 16:19:31 2016 +0900 +++ b/src/parallel_execution/main.c Tue Sep 27 17:22:00 2016 +0900 @@ -328,7 +328,7 @@ if (i < worker->num) { struct Context* worker_context = &worker->contexts[i]; - worker_context->next = InitWorker; + worker_context->next = GetTask; worker_context->data[Tree] = context->data[Tree]; worker_context->data[ActiveQueue] = context->data[ActiveQueue]; worker_context->data[WaitQueue] = context->data[WaitQueue]; diff -r acf0453b1c7a -r 77e60b6cdace src/parallel_execution/worker.c --- a/src/parallel_execution/worker.c Tue Sep 27 16:19:31 2016 +0900 +++ b/src/parallel_execution/worker.c Tue Sep 27 17:22:00 2016 +0900 @@ -3,21 +3,27 @@ #include "context.h" #include "origin_cs.h" -__code initWorker(struct Context* context) { - context->next = GetInputData1; - goto meta(context, GetQueue1); +__code meta_getTask(struct Context* context, struct Queue* queue, enum Code next) { + context->data[Queue] = (union Data *)queue; + goto (context->code[next])(context); } -__code initWorker_stub(struct Context* context) { - goto initWorker(context); +__code getTask(struct Context* context, struct Queue* activeQueue) { + context->next = GetInputData1; + activeQueue->emptyNext = GetTask; + goto meta_getTask(context, activeQueue, GetQueue1); +} + +__code getTask_stub(struct Context* context) { + goto getTask(context, &context->data[ActiveQueue]->queue); } __code getQueue1(struct Context* context, struct Queue* queue, struct Element* element) { if (queue->first == 0) - return; + goto meta(context, queue->emptyNext); element->data = queue->first->data; - if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->first->next)) { + if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->next)) { queue->count--; goto meta(context, context->next); } else {