diff src/parallel_execution/generate_stub.pl @ 398:fc4fcd441700

Fix spanwTasks
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 29 Aug 2017 01:01:44 +0900
parents c43ec0e3fa84
children 394e38952c80
line wrap: on
line diff
--- a/src/parallel_execution/generate_stub.pl	Thu Aug 24 17:23:41 2017 +0900
+++ b/src/parallel_execution/generate_stub.pl	Tue Aug 29 01:01:44 2017 +0900
@@ -327,7 +327,7 @@
                     if ($args =~ s/^(\s)*\_\_code\s+(\w+)\(([^)]*)\)//) {
                         my $next = $2;
                         my @args = split(/,/,$3);
-                        if ( &generateStubArgs($codeGearName, $next, "Code", $next, $interface,0) ) {
+                        if (&generateStubArgs($codeGearName, $next, "Code", $next, $interface,0) ) {
                             $newArgs .= "enum Code $next";
                         }
                         # analyze continuation arguments
@@ -422,22 +422,19 @@
                 my $outputCount = $codeGear{$codeGearName}->{'output'};
                 if (! $inParGoto) {
                     $inParGoto = 1;
-                    my $initTasks = << "EOFEOF";
-                    ${prev}struct Context** tasks = (struct Context**)ALLOC_ARRAY(context, Context, ?);
-                    ${prev}int taskCount = 0;
-EOFEOF
-                    print $fd $initTasks;
+                    print $fd "${prev}struct SingleLinkedQueue* queue = &context->tasks->queue->SingleLinkedQueue;\n";
+                    print $fd "${prev}struct Element* element;\n";
+                    print $fd "${prev}struct Context* task;\n";
                 }
-
                 my $initTask = << "EOFEOF";
-                ${prev}struct Context* task = NEW(struct Context);
-                ${prev}initContext(task);
-                ${prev}task->next = C_$codeGearName;
-                ${prev}task->idgCount = $inputCount;
-                ${prev}task->idg = task->dataNum;
-                ${prev}task->maxIdg = task->idg + $inputCount;
-                ${prev}task->odg = task->maxIdg;
-                ${prev}task->maxOdg = task->odg + $outputCount;
+${prev}task = NEW(struct Context);
+${prev}initContext(task);
+${prev}task->next = C_$codeGearName;
+${prev}task->idgCount = $inputCount;
+${prev}task->idg = task->dataNum;
+${prev}task->maxIdg = task->idg + $inputCount;
+${prev}task->odg = task->maxIdg;
+${prev}task->maxOdg = task->odg + $outputCount;
 EOFEOF
                 print $fd $initTask;
                 for my $i (0..$inputCount-1) {
@@ -447,9 +444,20 @@
                 for my $i (0..$outputCount-1) {
                     print $fd "${prev}task->data[task->odg+$i] = (union Data*)@dataGears[$inputCount+$i];\n";
                 }
-
-                print $fd "${prev}tasks[taskCount] = task;\n";
-                print $fd "${prev}taskCount++;\n";
+                my $putTask = << "EOFEOF";
+${prev}element = &ALLOCATE(context, Element)->Element;
+${prev}element->next = NULL;
+${prev}element->data = (union Data*)task;
+${prev}if (queue->last) {
+${prev}    Element* last = queue->last;
+${prev}    last->next  = element;
+${prev}    queue->last = element;
+${prev}} else {
+${prev}    queue->top  = element;
+${prev}    queue->last = element;
+${prev}}
+EOFEOF
+                print $fd $putTask;
                 next;
             } elsif (/^(.*)goto (\w+)\((.*)\);/) {
                 # handling goto statement  
@@ -470,25 +478,28 @@
                         print $fd "\t*O_$arg = $v;\n";
                     }
                     if ($inParGoto) {
-                        print $fd "${prev}taskManager->contexts = tasks;\n";
-                        print $fd "${prev}goto par_meta(context, Gearef(context, TaskManager)->taskManager->TaskManager.spawnTasks, $next);\n";
+                        print $fd "${prev}taskManager->tasks = context->tasks;\n";
+                        print $fd "${prev}taskManager->next1 = C_$next;\n";
+                        print $fd "${prev}goto par_meta(context, Gearef(context, TaskManager)->taskManager->TaskManager.spawnTasks, C_$next);\n";
                     } else {
                         print $fd "${prev}goto meta(context, $next);\n";
                     }
                     next;
                 }
                 if ($inParGoto) {
-                    print $fd "${prev}taskManager->contexts = tasks;\n";
-                    print $fd "${prev}goto par_meta(context, Gearef(context, TaskManager)->taskManager->TaskManager.spawnTasks, $next);\n";
+                    print $fd "${prev}taskManager->tasks = context->tasks;\n";
+                    print $fd "${prev}taskManager->next1 = C_$next;\n";
+                    print $fd "${prev}goto par_meta(context, Gearef(context, TaskManager)->taskManager->TaskManager.spawnTasks, C_$next);\n";
                     next;
                 }
+            } elsif(/^}/) {
+                $inParGoto = 0;
             }
             else {
                 s/new\s+(\w+)\(\)/\&ALLOCATE(context, \1)->\1/g;   # replacing new
             }
             # gather type name and type
         } elsif (/^}/) {
-            $inParGoto = 0;
             $inStub = 0;
             $inTypedef = 0;
         }