changeset 456:95f58f2b2c0e

Add TaskIterator
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Mon, 11 Dec 2017 16:26:55 +0900
parents dcc42f3e7e97
children 2b36a1878c6f
files src/parallel_execution/TaskIterator.cbc
diffstat 1 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/TaskIterator.cbc	Mon Dec 11 16:26:55 2017 +0900
@@ -0,0 +1,28 @@
+#include "../context.h"
+#include <stdio.h>
+
+createTaskIterator(struct Context, struct List list) {
+    struct Iterator* iterator = new Iterator();
+    struct TaskIterator* taskIterator = new TaskIterator();
+    iterator->itearot = (union Data*)taskIterator;
+    iterator->exec = C_execTaskIterator;
+    iterator->barrier = C_barrierTaskIterator;
+    taskIterator->taskList = list;
+}
+
+__code execTaskIterator(struct taskIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) {
+    if (iterator->list->next == null) {
+        goto next(...);
+    }
+    iterator->list = list->next;
+    struct Context* task = (struct Context*)iterator->list->data;
+    struct TaskManager taskManager = task->taskManager;
+    taskManager->spawn(task, C_execTaskIterator);
+}
+
+__code barrierTaskIterator(struct MultiDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) {
+    if (__sync_fetch_and_sub(&iterator->count, 1) == 1) {
+        goto next(...);
+    }
+    goto whenWait(...);
+}