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]);
+}