# HG changeset patch # User Tatsuki IHA # Date 1473735265 -32400 # Node ID 4ff6f093b695dd8ee636784c82e05ddaae33695b # Parent a086857e1812b29bdb5dc1788933ed00e7317818 Fix segmentation fault diff -r a086857e1812 -r 4ff6f093b695 src/parallel_execution/context.c --- 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; diff -r a086857e1812 -r 4ff6f093b695 src/parallel_execution/context.h --- 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, diff -r a086857e1812 -r 4ff6f093b695 src/parallel_execution/dependency.c --- 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); } diff -r a086857e1812 -r 4ff6f093b695 src/parallel_execution/main.c --- 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); } diff -r a086857e1812 -r 4ff6f093b695 src/parallel_execution/worker.c --- 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;