diff src/parallel_execution/worker.c @ 125:77e60b6cdace

Work dependency example
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 27 Sep 2016 17:22:00 +0900
parents 4ff6f093b695
children
line wrap: on
line diff
--- 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 {