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) {
|
|
8 struct TaskManager* taskManager = &ALLOCATE(context, TaskManager)->taskManager;
|
|
9 struct TaskManager* taskManagerImpl = &ALLOCATE(context, TaskManagerImpl)->taskManagerImpl;
|
182
|
10 taskManagerImpl -> activeQueue = createSynchronizedQueue(context);
|
|
11 taskManagerImpl -> waitQueue = createSynchronizedQueue(context);
|
|
12 taskManager->taskManager = (union Data*)taskManagerImpl;
|
178
|
13 taskManager->spawn = C_spawnTaskManager;
|
|
14 taskManager->shutdown = C_shutdownTaskManager;
|
184
|
15 taskManager->deadLockDetected = C_deadLockDetected;
|
178
|
16 return (union Data*)(taskManager);
|
|
17 }
|
|
18
|
|
19 __code spawnTaskManager(struct Context* context, struct Task* task, struct Element* element, struct Queue* queue, struct Queue* activeQueue, struct Queue* waitQueue) {
|
|
20 if (task->idsCount == 0) {
|
|
21 // enqueue activeQueue
|
|
22 queue->queue = (union Data*)activeQueue;
|
|
23 } else {
|
|
24 // enqueue waitQueue
|
|
25 queue->queue = (union Data*)waitQueue;
|
|
26 }
|
|
27 queue->data = element->data;
|
|
28 queue->next = context->next;
|
|
29 goto meta(context, queue->queue->put);
|
|
30 }
|
|
31
|
|
32 __code spawnTaskManager_stub(struct Context* context) {
|
|
33 goto spawnTask(context,
|
|
34 context->data[D_Element]->element.data,
|
|
35 &context->data[D_Element]->element,
|
|
36 &context->data[D_ActiveQueue]->Queue,
|
|
37 &context->data[D_WaitQueue]->Queue);
|
|
38 }
|
|
39
|
182
|
40 __code shutdownTaskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) {
|
178
|
41 int i = loopCounter->i;
|
|
42
|
|
43 if (i < worker->num) {
|
|
44 pthread_join(worker->contexts[i].thread, NULL);
|
|
45 loopCounter->i++;
|
|
46
|
|
47 goto meta(context, TaskManager);
|
|
48 }
|
|
49
|
|
50 loopCounter->i = 0;
|
|
51
|
|
52 Time *t = &context->data[D_Time]->Time;
|
|
53 t->next = C_code2;
|
|
54 goto meta(context, EndTime);
|
|
55 }
|
|
56
|
182
|
57 __code shutdownTaskManager_stub(struct Context* context) {
|
|
58 goto shutdownTaskManager(context, &context->data[D_LoopCounter]->loopCounter, &context->data[D_Worker]->worker);
|
178
|
59 }
|