annotate src/parallel_execution/TaskManager.c @ 178:5077cf9bf54e

add TaskManager.c
author mir3636
date Tue, 29 Nov 2016 18:09:28 +0900
parents
children 57a11c15ff4c
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"
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
3 #include "origin_cs.h"
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
4 #include <stdio.h>
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
5
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
6 union Data* createTaskManager(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
7 struct TaskManager* taskManager = &ALLOCATE(context, TaskManager)->taskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
8 struct TaskManager* taskManagerImpl = &ALLOCATE(context, TaskManagerImpl)->taskManagerImpl;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
9
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
10 taskManager->taskManager = (union Data*)taskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
11 taskManagerImpl->top = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
12 taskManager->spawn = C_spawnTaskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
13 taskManager->shutdown = C_shutdownTaskManager;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
14 return (union Data*)(taskManager);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
15 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
16
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
17 void printStack1(union Data* data) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
18 struct Node* node = &data->element.data->node;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
19 if (node == NULL) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
20 printf("NULL");
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
21 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
22 printf("key = %d ,", node->key);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
23 printStack1((union Data*)data->element.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
24 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
25 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
26
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
27 void printStack(union Data* data) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
28 printStack1(data);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
29 printf("\n");
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(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
33 if (task->idsCount == 0) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
34 // enqueue activeQueue
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
35 queue->queue = (union Data*)activeQueue;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
36 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
37 // enqueue waitQueue
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
38 queue->queue = (union Data*)waitQueue;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
39 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
40 queue->data = element->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
41 queue->next = context->next;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
42 goto meta(context, queue->queue->put);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
43 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
44
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
45 __code spawnTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
46 goto spawnTask(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
47 context->data[D_Element]->element.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
48 &context->data[D_Element]->element,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
49 &context->data[D_ActiveQueue]->Queue,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
50 &context->data[D_WaitQueue]->Queue);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
51 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
52
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
53 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
54 int i = loopCounter->i;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
55
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
56 if (i < worker->num) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
57 pthread_join(worker->contexts[i].thread, NULL);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
58 loopCounter->i++;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
59
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
60 goto meta(context, TaskManager);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
61 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
62
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
63 loopCounter->i = 0;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
64
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
65 Time *t = &context->data[D_Time]->Time;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
66 t->next = C_code2;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
67 goto meta(context, EndTime);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
68 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
69
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
70 __code taskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
71 goto taskManager(context, &context->data[D_LoopCounter]->loopCounter, &context->data[D_Worker]->worker);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
72 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
73
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
74 __code clearTaskManager(struct Context* context, struct SingleLinkedStack* stack,enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
75 stack->top = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
76 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
77 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
78
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
79 __code clearTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
80 goto clearTaskManager(context, (struct SingleLinkedStack *)context->data[D_Stack]->stack.stack->stack.stack, context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
81 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
82
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
83 __code pushTaskManager(struct Context* context, struct SingleLinkedStack* stack, struct Element* element, union Data* data, enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
84 element->next = stack->top;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
85 element->data = data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
86 stack->top = element;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
87 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
88 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
89
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
90 __code pushTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
91 struct Element* element = &ALLOCATE(context, Element)->element;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
92 goto pushTaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
93 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
94 element,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
95 context->data[D_Stack]->stack.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
96 context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
97 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
98
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
99 __code popTaskManager(struct Context* context, struct SingleLinkedStack* stack, union Data** data, enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
100 if (stack->top) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
101 *data = stack->top->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
102 stack->top = stack->top->next;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
103 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
104 *data = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
105 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
106 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
107 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
108
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
109 __code popTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
110 goto popTaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
111 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
112 &context->data[D_Stack]->stack.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
113 context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
114 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
115
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
116 __code pop2TaskManager(struct Context* context, struct SingleLinkedStack* stack, union Data** data, union Data** data1, enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
117 if (stack->top) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
118 *data = stack->top->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
119 stack->top = stack->top->next;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
120 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
121 *data = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
122 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
123 if (stack->top) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
124 *data1 = stack->top->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
125 stack->top = stack->top->next;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
126 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
127 *data1 = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
128 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
129 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
130 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
131
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
132 __code pop2TaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
133 goto pop2TaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
134 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
135 &context->data[D_Stack]->stack.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
136 &context->data[D_Stack]->stack.data1,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
137 context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
138 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
139
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
140 __code getTaskManager(struct Context* context, struct SingleLinkedStack* stack, union Data** data, enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
141 if (stack->top)
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
142 *data = stack->top->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
143 else
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
144 *data = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
145 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
146 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
147
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
148 __code getTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
149 goto getTaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
150 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
151 &context->data[D_Stack]->stack.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
152 context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
153 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
154
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
155 __code get2TaskManager(struct Context* context, struct SingleLinkedStack* stack, union Data** data, union Data** data1, enum Code next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
156 if (stack->top) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
157 *data = stack->top->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
158 if (stack->top->next) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
159 *data1 = stack->top->next->data;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
160 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
161 *data1 = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
162 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
163 } else {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
164 *data = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
165 *data1 = NULL;
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
166 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
167 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
168 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
169
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
170 __code get2TaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
171 goto get2TaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
172 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
173 &context->data[D_Stack]->stack.data,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
174 &context->data[D_Stack]->stack.data1,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
175 context->data[D_Stack]->stack.next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
176 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
177
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
178 __code isEmptyTaskManager(struct Context* context, struct SingleLinkedStack* stack, enum Code next,enum Code whenEmpty) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
179 if (stack->top)
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
180 goto meta(context, next);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
181 else
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
182 goto meta(context, whenEmpty);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
183 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
184
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
185 __code isEmptyTaskManager_stub(struct Context* context) {
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
186 goto isEmptyTaskManager(context,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
187 (struct TaskManager *)context->data[D_Stack]->stack.stack->stack.stack,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
188 context->data[D_Stack]->stack.next,
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
189 context->data[D_Stack]->stack.whenEmpty);
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
190 }
5077cf9bf54e add TaskManager.c
mir3636
parents:
diff changeset
191