annotate src/parallel_execution/TaskManager.c @ 184:21840c7fb309

merge
author mir3636
date Thu, 15 Dec 2016 17:41:00 +0900
parents 57a11c15ff4c
children 5708390a9d88
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
1 #include "context.h"
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
2 #include "stack.h"
182
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
3 #include "queue.h"
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
4 #include "origin_cs.h"
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
5 #include <stdio.h>
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
6
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
7 union Data* createTaskManager(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
8 struct TaskManager* taskManager = &ALLOCATE(context, TaskManager)->taskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
9 struct TaskManager* taskManagerImpl = &ALLOCATE(context, TaskManagerImpl)->taskManagerImpl;
182
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
10 taskManagerImpl -> activeQueue = createSynchronizedQueue(context);
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
11 taskManagerImpl -> waitQueue = createSynchronizedQueue(context);
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
12 taskManager->taskManager = (union Data*)taskManagerImpl;
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
13 taskManager->spawn = C_spawnTaskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
14 taskManager->shutdown = C_shutdownTaskManager;
184
mir3636
parents: 182
diff changeset
15 taskManager->deadLockDetected = C_deadLockDetected;
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
16 return (union Data*)(taskManager);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
17 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
18
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
19 __code spawnTaskManager(struct Context* context, struct Task* task, struct Element* element, struct Queue* queue, struct Queue* activeQueue, struct Queue* waitQueue) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
20 if (task->idsCount == 0) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
21 // enqueue activeQueue
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
22 queue->queue = (union Data*)activeQueue;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
23 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
24 // enqueue waitQueue
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
25 queue->queue = (union Data*)waitQueue;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
26 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
27 queue->data = element->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
28 queue->next = context->next;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
29 goto meta(context, queue->queue->put);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
30 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
31
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
32 __code spawnTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
33 goto spawnTask(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
34 context->data[D_Element]->element.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
35 &context->data[D_Element]->element,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
36 &context->data[D_ActiveQueue]->Queue,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
37 &context->data[D_WaitQueue]->Queue);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
38 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
39
182
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
40 __code shutdownTaskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) {
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
41 int i = loopCounter->i;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
42
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
43 if (i < worker->num) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
44 pthread_join(worker->contexts[i].thread, NULL);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
45 loopCounter->i++;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
46
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
47 goto meta(context, TaskManager);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
48 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
49
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
50 loopCounter->i = 0;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
51
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
52 Time *t = &context->data[D_Time]->Time;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
53 t->next = C_code2;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
54 goto meta(context, EndTime);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
55 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
56
182
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
57 __code shutdownTaskManager_stub(struct Context* context) {
57a11c15ff4c Add queue_test
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 178
diff changeset
58 goto shutdownTaskManager(context, &context->data[D_LoopCounter]->loopCounter, &context->data[D_Worker]->worker);
178
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
59 }