diff src/parallel_execution/TaskManagerImpl.cbc @ 398:fc4fcd441700

Fix spanwTasks
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 29 Aug 2017 01:01:44 +0900
parents 864cd4e346e9
children 394e38952c80
line wrap: on
line diff
--- a/src/parallel_execution/TaskManagerImpl.cbc	Thu Aug 24 17:23:41 2017 +0900
+++ b/src/parallel_execution/TaskManagerImpl.cbc	Tue Aug 29 01:01:44 2017 +0900
@@ -17,7 +17,6 @@
     taskManager->spawn = C_spawnTaskManagerImpl;
     taskManager->shutdown  = C_shutdownTaskManagerImpl;
     struct TaskManagerImpl* taskManagerImpl = new TaskManagerImpl();
-    taskManagerImpl -> activeQueue = createSingleLinkedQueue(context);
     taskManagerImpl -> taskQueue = createSingleLinkedQueue(context);
     taskManagerImpl -> numWorker = taskManager->maxCPU;
     taskManagerImpl -> loopCounter = new LoopCounter();
@@ -53,71 +52,91 @@
     }
 }
 
-__code spawnTasksTaskManagerImpl(struct TaskManagerImpl* taskManagerImpl, struct Context** tasks, __code next1(...), struct TaskManager* taskManager) {
-    int i = taskManagerImpl->loopCounter->i;
-    if(i < GET_SIZE(tasks)) {
-        struct Context* task = tasks[i];
-        taskManagerImpl->loopCounter->i++;
-        task->taskManager = &taskManager->taskManager->TaskManager;
-        taskManager->context = task;
-        taskManager->next = C_spawnTasksTaskManagerImpl;
-        goto meta(context, C_setWaitTask);
-    }
-    taskManagerImpl->loopCounter->i = 0;
-    goto meta(context, C_spawnTasksTaskManagerImpl1);
+__code spawnTasksTaskManagerImpl(struct TaskManagerImpl* taskManager, struct Queue* tasks, __code next1(...), struct Queue* queue) {
+    queue->queue = (union Data*)tasks;
+    queue->next      = C_spawnTasksTaskManagerImpl1;
+    queue->whenEmpty = C_spawnTasksTaskManagerImpl3;
+    goto meta(context, tasks->isEmpty);
 }
 
-__code spawnTasksTaskManagerImpl_stub(struct Context* context) {
-    TaskManagerImpl* taskManager = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
-    goto spawnTasksTaskManagerImpl(context,
-                               taskManager,
-                               Gearef(context, TaskManager)->tasks,
-                               Gearef(context, TaskManager)->next1,
-                               Gearef(context, TaskManager));
-}
-
-__code spawnTasksTaskManagerImpl1(struct TaskManagerImpl* taskManagerImpl, struct Context** tasks, __code next1(...), struct TaskManager* taskManager) {
-    int i = taskManagerImpl->loopCounter->i;
-    if(i < GET_SIZE(tasks)) {
-        struct Context* task = tasks[i];
-        taskManagerImpl->loopCounter->i++;
-        taskManager->context = task;
-        taskManager->next = C_spawnTasksTaskManagerImpl1;
-        goto meta(context, C_spawnTaskManagerImpl);
-    }
-    taskManagerImpl->loopCounter->i = 0;
-    goto meta(context, next1);
+__code spawnTasksTaskManagerImpl1(struct TaskManagerImpl* taskManager, struct Queue* tasks, __code next1(...), struct Queue* queue) {
+    queue->queue = (union Data*)tasks;
+    queue->next      = C_spawnTasksTaskManagerImpl2;
+    goto meta(context, tasks->take);
 }
 
 __code spawnTasksTaskManagerImpl1_stub(struct Context* context) {
-    TaskManagerImpl* taskManager = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
-    goto spawnTasksTaskManagerImpl1(context,
-                               taskManager,
-                               Gearef(context, TaskManager)->tasks,
-                               Gearef(context, TaskManager)->next1,
-                               Gearef(context, TaskManager));
+	TaskManagerImpl* taskManager = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
+	Queue* tasks = Gearef(context, TaskManager)->tasks;
+	enum Code next1 = Gearef(context, TaskManager)->next1;
+	Queue* queue = Gearef(context, Queue);
+	goto spawnTasksTaskManagerImpl1(context, taskManager, tasks, next1, queue);
+} 
+
+__code spawnTasksTaskManagerImpl2(struct TaskManagerImpl* taskManagerImpl, struct Context* task, struct TaskManager* taskManager) {
+    task->taskManager = &taskManager->taskManager->TaskManager;
+    taskManager->context = task;
+    taskManager->next = C_spawnTasksTaskManagerImpl;
+    goto meta(context, C_setWaitTask);
+}
+
+__code spawnTasksTaskManagerImpl2_stub(struct Context* context) {
+	TaskManagerImpl* taskManagerImpl = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
+	Context* task = (struct Context*)Gearef(context, Queue)->data;
+	TaskManager* taskManager = Gearef(context, TaskManager);
+	goto spawnTasksTaskManagerImpl2(context, taskManagerImpl, task, taskManager);
+} 
+
+__code spawnTasksTaskManagerImpl3(struct TaskManagerImpl* taskManager, __code next1(...), struct Queue* queue) {
+    queue->queue     = (union Data*)taskManager->taskQueue;
+    queue->next      = C_spawnTasksTaskManagerImpl4;
+    queue->whenEmpty = next1;
+    goto meta(context, taskManager->taskQueue->isEmpty);
 }
 
-__code setWaitTask(struct Queue* queue, struct LoopCounter* loopCounter, struct Context* task, __code next(...)) {
-    int i = loopCounter->i;
+__code spawnTasksTaskManagerImpl4(struct TaskManagerImpl* taskManager, __code next1(...), struct Queue* queue) {
+    queue->queue = (union Data*)taskManager->taskQueue;
+    queue->next      = C_spawnTasksTaskManagerImpl5;
+    goto meta(context, taskManager->taskQueue->take);
+}
+
+__code spawnTasksTaskManagerImpl5(struct TaskManagerImpl* taskManagerImpl, struct Context* task, struct TaskManager* taskManager) {
+    taskManager->context = task;
+    taskManager->next = C_spawnTasksTaskManagerImpl3;
+    goto meta(context, C_spawnTaskManagerImpl);
+}
+
+__code spawnTasksTaskManagerImpl5_stub(struct Context* context) {
+	TaskManagerImpl* taskManagerImpl = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
+	Context* task = (struct Context*)Gearef(context, Queue)->data;
+	TaskManager* taskManager = Gearef(context, TaskManager);
+	goto spawnTasksTaskManagerImpl5(context, taskManagerImpl, task, taskManager);
+} 
+
+__code setWaitTask(struct TaskManagerImpl* taskManager, struct Context* task, __code next(...), struct Queue* queue) {
+    int i = taskManager->loopCounter->i;
     if(task->idg+i < task->maxIdg) {
         queue->queue = (Data *)GET_WAIT_LIST(task->data[task->idg + i]);
+        queue->data  = (Data *)task;
         queue->next  = C_setWaitTask;
-        queue->data  = (Data *)task;
-        loopCounter->i++;
+        taskManager->loopCounter->i++;
         goto meta(context, queue->queue->Queue.put);
     }
-    loopCounter->i = 0;
-    goto next(...);
+    taskManager->loopCounter->i = 0;
+    queue->queue = (Data *)taskManager->taskQueue;
+    queue->data  = (Data *)task;
+    queue->next  = next;
+    goto meta(context, taskManager->taskQueue->put);
 }
 
 __code setWaitTask_stub(struct Context* context) {
+    TaskManagerImpl* taskManager = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
     struct Context* task = Gearef(context, TaskManager)->context;
     goto setWaitTask(context,
-                     Gearef(context, Queue),
-                     Gearef(task, LoopCounter),
+                     taskManager,
                      task,
-                     Gearef(context, TaskManager)->next);
+                     Gearef(context, TaskManager)->next,
+                     Gearef(context, Queue));
 }
 
 __code spawnTaskManagerImpl(struct TaskManagerImpl* taskManager, struct Iterator* iterator, struct Context* task, __code next(...)) {
@@ -167,8 +186,8 @@
             Gearef(context, TaskManager)->next);
 }
 
-__code shutdownTaskManagerImpl(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct TaskManagerImpl* taskManagerImpl, struct Queue* queue, __code next(...)) {
-    int i = loopCounter->i;
+__code shutdownTaskManagerImpl(struct TaskManagerImpl* taskManagerImpl, __code next(...), struct TaskManager* taskManager, struct Queue* queue) {
+    int i = taskManagerImpl->loopCounter->i;
     if (taskManager->cpu <= i && i < taskManager->maxCPU) {
         struct Queue* tasks = taskManagerImpl->workers[i]->tasks;
         queue->queue = (union Data*)tasks;
@@ -177,23 +196,27 @@
         goto meta(context, tasks->put);
     }
 
-    loopCounter->i = 0;
+    taskManagerImpl->loopCounter->i = 0;
     goto meta(context, next);
 }
 
 __code shutdownTaskManagerImpl_stub(struct Context* context) {
     TaskManagerImpl* taskManagerImpl = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
-    goto shutdownTaskManagerImpl(context, Gearef(context, LoopCounter), &Gearef(context, TaskManager)->taskManager->TaskManager, taskManagerImpl, Gearef(context, Queue), Gearef(context, TaskManager)->next);
+    goto shutdownTaskManagerImpl(context,
+                                 taskManagerImpl,
+                                 Gearef(context, TaskManager)->next,
+                                 &Gearef(context, TaskManager)->taskManager->TaskManager,
+                                 Gearef(context, Queue));
 }
 
-__code shutdownTaskManagerImpl1(struct LoopCounter* loopCounter, TaskManagerImpl* taskManagerImpl) {
-    int i = loopCounter->i;
-    pthread_join(taskManagerImpl->workers[i]->worker->CPUWorker.thread, NULL);
-    loopCounter->i++;
+__code shutdownTaskManagerImpl1(TaskManagerImpl* taskManager) {
+    int i = taskManager->loopCounter->i;
+    pthread_join(taskManager->workers[i]->worker->CPUWorker.thread, NULL);
+    taskManager->loopCounter->i++;
     goto meta(context, C_shutdownTaskManagerImpl);
 }
 
 __code shutdownTaskManagerImpl1_stub(struct Context* context) {
     TaskManagerImpl* taskManagerImpl = (TaskManagerImpl*)GearImpl(context, TaskManager, taskManager);
-    goto shutdownTaskManagerImpl1(context, Gearef(context, LoopCounter), taskManagerImpl);
+    goto shutdownTaskManagerImpl1(context, taskManagerImpl);
 }