Mercurial > hg > Members > innparusu > Gears
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) {