diff src/parallel_execution/main.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/main.c	Tue Jul 26 13:06:46 2016 +0900
+++ b/src/parallel_execution/main.c	Thu Aug 25 03:23:29 2016 +0900
@@ -6,6 +6,7 @@
 
 extern __code initContext(struct Context* context);
 extern void allocator(struct Context* context);
+extern void metaAllocator(struct Context* context);
 
 int cpu_num = 1;
 int length = 1024;
@@ -14,7 +15,7 @@
 
 void print_queue(struct Element* element) {
     while (element) {
-        printf("%d\n", ((struct Task *)(element->data))->key);
+        //printf("%d\n", ((struct Task *)(element->data))->key);
         element = element->next;
     }
 }
@@ -180,7 +181,7 @@
 */
 
 
-__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Queue* activeQueue) {
+__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
     int i = loopCounter->i;
 
     task->code = Mult;
@@ -189,7 +190,7 @@
     task->idsCount = 1;
     loopCounter->i -= 2;
 
-    element->data = (union Data *)task;
+    element->data = (union Data*)task;
 
     context->next = CreateTask3;
 
@@ -223,18 +224,18 @@
     task->iKeys[1] = i-2;
     loopCounter->i -= 2;
     element->data = (union Data *)task;
-    context->next = WaitFor1;
+    context->next = WaitFor;
 
-    node->key = okeys[0];
+    node->key = task->oKeys[0];
     goto meta(context, Get);
 }
 
 __code createTask4_stub(struct Context* context) {
-    goto createTask3(context,
+    goto createTask4(context,
             &context->data[LoopCounter]->loopCounter,
             &context->data[context->dataNum]->task,
-            &context->data[Node]->node,
-            &context->data[Element]->element);
+            &context->data[Element]->element,
+            &context->data[Node]->node);
 }
 
 __code putQueue1(struct Context* context, struct Allocate* allocate) {
@@ -301,12 +302,12 @@
 
     if (i < worker->num) {
         struct Context* worker_context = &worker->contexts[i];
-        worker_context->next = GetQueue2;
+        worker_context->next = InitWorker;
         worker_context->data[Tree] = context->data[Tree];
         worker_context->data[ActiveQueue] = context->data[ActiveQueue];
         worker_context->data[WaitQueue] = context->data[WaitQueue];
         worker_context->data[Queue] = context->data[ActiveQueue];
-        pthread_create(&worker_context->thread, NULL, (void*)&getQueue1, worker_context);
+        pthread_create(&worker_context->thread, NULL, (void*)&start_code, worker_context);
         worker_context->thread_num = i;
         loopCounter->i++;
 
@@ -321,25 +322,53 @@
     goto createWorker(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker);
 }
 
-__code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) {
+__code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker, struct Queue* waitQueue, struct Queue* ActiveQueue) {
+    if (waitQueue->first) {
+        goto meta(context, Poll1);
+    }
     int i = loopCounter->i;
-
     if (i < worker->num) {
         pthread_join(worker->contexts[i].thread, NULL);
         loopCounter->i++;
 
         goto meta(context, TaskManager);
     }
-
     loopCounter->i = 0;
-
     struct Time *t = &context->data[Time]->time;
     t->next = Code2;
     goto meta(context, EndTime);
 }
 
 __code taskManager_stub(struct Context* context) {
-    goto taskManager(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker);
+    goto taskManager(context, 
+                     &context->data[LoopCounter]->loopCounter,
+                     &context->data[Worker]->worker,
+                     &context->data[WaitQueue]->queue,
+                     &context->data[ActiveQueue]->queue);
+}
+
+__code meta_poll1(struct Context* context, struct Queue* queue, enum Code next) {
+    context->data[Queue] = (union Data *)queue;
+    goto (context->code[next])(context);
+}
+
+__code poll1(struct Context* context, struct Queue* waitQueue) {
+    context->next = Poll2;
+    goto meta_poll1(context, waitQueue, GetQueue1);
+}
+
+__code poll1_stub(struct Context* context) {
+    goto poll1(context,
+            &context->data[WaitQueue]->queue);
+}
+
+__code poll2(struct Context* context) {
+    context->next = TaskManager;
+    goto meta(context, SpawnTask);
+}
+
+__code poll2_stub(struct Context* context) {
+    goto poll2(context);
 }
 
 void init(int argc, char** argv) {