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