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