changeset 111:556e203de999

Add dependency.c
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Mon, 02 May 2016 20:39:02 +0900
parents fbcdbe8db53c
children e3cba827d489
files src/parallel_execution/dependency.c src/parallel_execution/main.c
diffstat 2 files changed, 108 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/dependency.c	Mon May 02 20:39:02 2016 +0900
@@ -0,0 +1,61 @@
+#include "context.h"
+#include "origin_cs.h"
+
+__code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) {
+    context->data[Queue] = (Data *)queue;
+    goto (context->code[next])(context);
+}
+
+__code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
+    element->task = slave;
+    task->next = WaitFor2;
+    // enqueue waitMe
+    goto meta_waitFor(context, task->waitMe, PutQueue1);
+}
+
+__code waitFor1_stub(struct Context* context) {
+    // next think
+}
+
+__code waitFor2(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
+    element->task = master;
+    task->next = context->next;
+    // enqueue waitI
+    goto meta_waitFor(context, task->waitI, PutQueue1);
+}
+
+__code waitFor2_stub(struct Context* context) {
+    // next think
+}
+
+__code spawnTask(struct Context* context, struct Task* task, struct Queue* activeQueue, struct Queue* waitQueue) {
+    if (task->wait_i->count == task->wait_task_count) {
+        element->task = task;
+        // enqueue activeQueue
+        goto meta(context, PutQueue1);
+    }
+    else {
+        element->task = task;
+        // enqueue waitQueue
+        goto meta(context, PutQueue1);
+    }
+}
+
+__code spawnTask_stub(struct Context* context) {
+    // next think
+}
+
+__code taskA(struct Context*) {
+    printf("TaskA\n");
+    goto meta(context, context->next);
+}
+
+__code taskB(struct Context*) {
+    printf("TaskB\n");
+    goto meta(context, context->next);
+}
+
+__code taskC(struct Context*) {
+    printf("TaskC\n");
+    goto meta(context, context->next);
+}
--- a/src/parallel_execution/main.c	Mon May 02 20:04:06 2016 +0900
+++ b/src/parallel_execution/main.c	Mon May 02 20:39:02 2016 +0900
@@ -50,7 +50,7 @@
 
 __code code2(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) {
     int i = loopCounter->i;
-    
+
     if (i < length) {
         //        printf("%d\n", array->array[i]);
         if (array->array[i] == (i*2)) {
@@ -81,7 +81,7 @@
     loopCounter->i = 0;
     goto meta(context, Code1);
 }
-        
+
 __code createData1_stub(struct Context* context) {
     goto createData1(context, &context->data[Allocate]->allocate, &context->data[LoopCounter]->loopCounter);
 }
@@ -95,7 +95,7 @@
 
     node->key = i;
     node->value = (union Data*)array;
-    
+
     context->next = CreateTask1;
 
     goto meta(context, PutTree);
@@ -103,9 +103,9 @@
 
 __code createData2_stub(struct Context* context) {
     goto createData2(context,
-                     &context->data[LoopCounter]->loopCounter,
-                     &context->data[context->dataNum]->array,
-                     &context->data[Node]->node);
+            &context->data[LoopCounter]->loopCounter,
+            &context->data[context->dataNum]->array,
+            &context->data[Node]->node);
 }
 
 __code createTask1(struct Context* context, struct Allocate* allocate) {
@@ -146,6 +146,47 @@
             &context->data[ActiveQueue]->queue);
 }
 
+
+//__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
+//    int i = loopCounter->i;
+// 
+//    task->code = TaskC;
+//    task->key = i;
+// 
+//    element->task = task;
+//
+//    context->next = CreateData1;
+//    loopCounter->i++;
+//
+//    goto meta(context, PutQueue1);
+//}
+//
+//__code createTask2_stub(struct Context* context) {
+//    goto createTask2(context,
+//                     &context->data[LoopCounter]->loopCounter,
+//                     &context->data[context->dataNum]->task,
+//                     &context->data[Element]->element);
+//}
+//
+//__code createTask3(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Task* slave, struct Element* element) {
+//    int i = loopCounter->i;
+//    
+//    task->code = TaskB;
+//    task->key = i;
+//    element->task = task;
+//
+//    context->next = CreateData1;
+//    loopCounter->i++;
+//    
+//    goto meta(context, WaitFor1);
+//}
+//
+//__code createTask3_stub(struct Context* context) {
+//    goto createTask2(context,
+//                     &context->data[context->dataNum]->task,
+//                     &context->data[Element]->element);
+//}
+
 __code putQueue1(struct Context* context, struct Allocate* allocate) {
     allocate->size = sizeof(struct Element);
     allocator(context);