changeset 123:4ff6f093b695

Fix segmentation fault
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 13 Sep 2016 11:54:25 +0900
parents a086857e1812
children acf0453b1c7a
files src/parallel_execution/context.c src/parallel_execution/context.h src/parallel_execution/dependency.c src/parallel_execution/main.c src/parallel_execution/worker.c
diffstat 5 files changed, 38 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/context.c	Thu Aug 25 03:23:29 2016 +0900
+++ b/src/parallel_execution/context.c	Tue Sep 13 11:54:25 2016 +0900
@@ -51,6 +51,7 @@
 extern __code createTask2_stub(struct Context*);
 extern __code createTask3_stub(struct Context*);
 extern __code createTask4_stub(struct Context*);
+extern __code createTask5_stub(struct Context*);
 extern __code poll1_stub(struct Context*);
 extern __code poll2_stub(struct Context*);
 /* extern __code createTask3_stub(struct Context*); */
@@ -80,6 +81,7 @@
     context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
     context->code = (__code(**) (struct Context*)) NEWN(ALLOCATE_SIZE, void*);
     context->data = NEWN(ALLOCATE_SIZE, union Data*);
+    context->mData = NEWN(ALLOCATE_SIZE, union Data*);
     context->heapStart = NEWN(context->heapLimit, char);
     context->heap = context->heapStart;
 
@@ -130,6 +132,9 @@
     context->code[CreateTask2]   = createTask2_stub;
     context->code[CreateTask3]   = createTask3_stub;
     context->code[CreateTask4]   = createTask4_stub;
+    context->code[CreateTask5]   = createTask5_stub;
+    context->code[Poll1]         = poll1_stub;
+    context->code[Poll2]         = poll2_stub;
     context->code[PutQueue1]     = putQueue1_stub;
     context->code[PutQueue2]     = putQueue2_stub;
     context->code[PutQueue3]     = putQueue3_stub;
--- a/src/parallel_execution/context.h	Thu Aug 25 03:23:29 2016 +0900
+++ b/src/parallel_execution/context.h	Tue Sep 13 11:54:25 2016 +0900
@@ -62,6 +62,7 @@
     CreateTask2,
     CreateTask3,
     CreateTask4,
+    CreateTask5,
     Poll1,
     Poll2,
     PutQueue1,
--- a/src/parallel_execution/dependency.c	Thu Aug 25 03:23:29 2016 +0900
+++ b/src/parallel_execution/dependency.c	Tue Sep 13 11:54:25 2016 +0900
@@ -15,7 +15,10 @@
 }
 
 __code waitFor_stub(struct Context* context) {
-    // think
+    goto waitFor(context,
+            &context->data[context->dataNum-1]->task,
+            &context->data[Element]->element,
+            &context->data[Node]->node.value);
 }
 
 __code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) {
@@ -80,6 +83,7 @@
 
 __code add(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
     output->value = input1->value + input2->value;
+    printf("%d + %d = %d\n", input1->value, input2->value, output->value);
     goto meta(context, context->next);
 }
 
@@ -92,6 +96,7 @@
 
 __code mult(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
     output->value = input1->value * input2->value;
+    printf("%d * %d = %d\n", input1->value, input2->value, output->value);
     goto meta(context, context->next);
 }
 
--- a/src/parallel_execution/main.c	Thu Aug 25 03:23:29 2016 +0900
+++ b/src/parallel_execution/main.c	Tue Sep 13 11:54:25 2016 +0900
@@ -207,15 +207,15 @@
 __code createTask3(struct Context* context, struct Allocate* allocate) {
     allocate->size = sizeof(struct Task);
     allocator(context);
-    goto meta(context, CreateTask2);
+    goto meta(context, CreateTask4);
 }
 
 __code createTask3_stub(struct Context* context) {
-    goto createTask1(context, &context->data[Allocate]->allocate);
+    goto createTask3(context, &context->data[Allocate]->allocate);
 }
 
 
-__code createTask4(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Node* node) {
+__code createTask4(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
     int i = loopCounter->i;
 
     task->code = Add;
@@ -224,9 +224,7 @@
     task->iKeys[1] = i-2;
     loopCounter->i -= 2;
     element->data = (union Data *)task;
-    context->next = WaitFor;
-
-    node->key = task->oKeys[0];
+    context->next = CreateTask5;
     goto meta(context, Get);
 }
 
@@ -234,8 +232,23 @@
     goto createTask4(context,
             &context->data[LoopCounter]->loopCounter,
             &context->data[context->dataNum]->task,
-            &context->data[Element]->element,
-            &context->data[Node]->node);
+            &context->data[Element]->element
+            );
+}
+
+__code createTask5(struct Context* context, struct Task* task, struct Node* node) {
+    node->key = task->oKeys[0];
+    loopCounter->i = 0;
+    context->next = Code1;
+    goto meta(context, WaitFor);
+}
+
+__code createTask5_stub(struct Context* context) {
+    goto createTask4(context,
+            &context->data[LoopCounter]->loopCounter,
+            &context->data[context->dataNum]->task,
+            &context->data[Node]->node
+            );
 }
 
 __code putQueue1(struct Context* context, struct Allocate* allocate) {
@@ -324,7 +337,7 @@
 
 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker, struct Queue* waitQueue, struct Queue* ActiveQueue) {
     if (waitQueue->first) {
-        goto meta(context, Poll1);
+       goto meta(context, Poll1);
     }
     int i = loopCounter->i;
     if (i < worker->num) {
@@ -353,6 +366,7 @@
 }
 
 __code poll1(struct Context* context, struct Queue* waitQueue) {
+    usleep(100);
     context->next = Poll2;
     goto meta_poll1(context, waitQueue, GetQueue1);
 }
--- a/src/parallel_execution/worker.c	Thu Aug 25 03:23:29 2016 +0900
+++ b/src/parallel_execution/worker.c	Tue Sep 13 11:54:25 2016 +0900
@@ -16,8 +16,8 @@
     if (queue->first == 0)
         return;
 
-    element = queue->first;
-    if (__sync_bool_compare_and_swap(&queue->first, element, element->next)) {
+    element->data = queue->first->data;
+    if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->first->next)) {
         queue->count--;
         goto meta(context, context->next);
     } else {
@@ -31,7 +31,7 @@
 
 __code getInputData1(struct Context* context, struct Task* task, struct Node* node, struct LoopCounter* loopCounter) {
     int i = loopCounter->i;
-    if(i < sizeof(task->iKeys)/ sizeof(int)) {
+    if(i < sizeof(task->iKeys) / sizeof(int)) {
         context->next = GetInputData2;
         node->key = task->iKeys[i];
         struct Traverse *t = &context->data[Traverse]->traverse;