Mercurial > hg > Gears > GearsAgda
annotate src/parallel_execution/taskManager.c @ 221:2454f4392316
Success create Task and inqueue Task
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 Jan 2017 21:39:33 +0900 |
parents | 6c0692c9bfed |
children | 77faa28128b4 |
rev | line source |
---|---|
178 | 1 #include "context.h" |
2 #include "stack.h" | |
182 | 3 #include "queue.h" |
178 | 4 #include "origin_cs.h" |
5 #include <stdio.h> | |
6 | |
7 union Data* createTaskManager(struct Context* context) { | |
209 | 8 struct TaskManager* taskManager = &ALLOCATE(context, TaskManager)->TaskManager; |
9 struct TaskManagerImpl* taskManagerImpl = &ALLOCATE(context, TaskManagerImpl)->TaskManagerImpl; | |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
10 taskManager->taskManager = (union Data*)taskManagerImpl; |
220 | 11 taskManagerImpl -> activeQueue = &createSynchronizedQueue(context)->Queue; |
12 taskManagerImpl -> taskQueue = &createSynchronizedQueue(context)->Queue; | |
178 | 13 taskManager->spawn = C_spawnTaskManager; |
14 taskManager->shutdown = C_shutdownTaskManager; | |
209 | 15 // taskManager->deadLockDetected = C_deadLockDetected; |
178 | 16 return (union Data*)(taskManager); |
17 } | |
18 | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
19 __code spawnTaskManager(struct Context* context, struct TaskManagerImpl* taskManager, struct Queue* queue, struct Task* task, enum Code next) { |
178 | 20 if (task->idsCount == 0) { |
21 // enqueue activeQueue | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
22 queue->queue = (union Data*)taskManager->activeQueue; |
178 | 23 } else { |
24 // enqueue waitQueue | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
25 queue->queue = (union Data*)taskManager->taskQueue; |
178 | 26 } |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
27 queue->data = (union Data*)task; |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
28 queue->next = next; |
209 | 29 goto meta(context, queue->queue->Queue.put); |
178 | 30 } |
31 | |
32 __code spawnTaskManager_stub(struct Context* context) { | |
209 | 33 goto spawnTaskManager(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
34 &context->data[D_TaskManager]->TaskManager.taskManager->TaskManager.taskManager->TaskManagerImpl, |
209 | 35 &context->data[D_Queue]->Queue, |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
36 context->data[D_TaskManager]->TaskManager.task, |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
37 context->data[D_TaskManager]->TaskManager.next |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
38 ); |
178 | 39 } |
40 | |
182 | 41 __code shutdownTaskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { |
178 | 42 int i = loopCounter->i; |
43 | |
209 | 44 if (i < worker->id) { |
178 | 45 pthread_join(worker->contexts[i].thread, NULL); |
46 loopCounter->i++; | |
47 | |
209 | 48 goto meta(context, C_taskManager); |
178 | 49 } |
50 | |
51 loopCounter->i = 0; | |
52 | |
53 Time *t = &context->data[D_Time]->Time; | |
54 t->next = C_code2; | |
209 | 55 goto meta(context, C_end_time); |
178 | 56 } |
57 | |
182 | 58 __code shutdownTaskManager_stub(struct Context* context) { |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
59 goto shutdownTaskManager(context, &context->data[D_LoopCounter]->LoopCounter, &context->data[D_Worker]->Worker); |
178 | 60 } |