changeset 891:76a8f578091d

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 26 Jan 2021 14:03:45 +0900
parents 1caa59b7f228
children 3fa258d0891a
files src/parallel_execution/CMakeLists.txt src/parallel_execution/generate_stub.pl
diffstat 2 files changed, 49 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/CMakeLists.txt	Mon Jan 25 21:23:32 2021 +0900
+++ b/src/parallel_execution/CMakeLists.txt	Tue Jan 26 14:03:45 2021 +0900
@@ -160,7 +160,7 @@
   TARGET
   DPP2
   SOURCES
-  TaskManagerImpl.cbc CPUWorker.cbc SynchronizedQueue.cbc examples/DPP2/AtomicTImpl.cbc SingleLinkedStack.cbc examples/DPP2/PhilsImpl.cbc examples/DPP2/main.cbc examples/DPP2/ForkImpl.cbc ModelChecking/crc32.c ModelChecking/memory.c ModelChecking/state_db.c AtomicReference.cbc ModelChecking/MCWorker.cbc
+  TaskManagerImpl.cbc CPUWorker.cbc SynchronizedQueue.cbc examples/DPP2/AtomicTImpl.cbc SingleLinkedStack.cbc examples/DPP2/PhilsImpl.cbc examples/DPP2/main.cbc examples/DPP2/ForkImpl.cbc ModelChecking/crc32.c ModelChecking/memory.c ModelChecking/state_db.c AtomicReference.cbc
 )
 
 GearsCommand(
--- a/src/parallel_execution/generate_stub.pl	Mon Jan 25 21:23:32 2021 +0900
+++ b/src/parallel_execution/generate_stub.pl	Tue Jan 26 14:03:45 2021 +0900
@@ -630,7 +630,7 @@
     my $hasParGoto = 0;
     my $inMain     = 0 ;
     my $inCode     = 0 ;
-    my $codeGearName;
+    my $currentCodeGearName;
     my %localVarType;
 
     for (@$inputCbCFile){
@@ -692,20 +692,20 @@
                 debug_print("generateDataGear",__LINE__, $_) if $opt_debug;
                 $inCode = 1;
                 %localVarType = ();
-                $codeGearName = $1;
+                $currentCodeGearName = $1;
                 my $args = $2;
                 my $tail = $3;
 
                 #replace Code Gear Name to Implemenatation
-                if (exists $replaceCodeGearNames->{$codeGearName}) {
-                    $codeGearName = $replaceCodeGearNames->{$codeGearName};
+                if (exists $replaceCodeGearNames->{$currentCodeGearName}) {
+                    $currentCodeGearName = $replaceCodeGearNames->{$currentCodeGearName};
                 }
 
-                if ($codeGearName =~ /_stub$/) {
+                if ($currentCodeGearName =~ /_stub$/) {
                     # don't touch already existing stub
                     $inStub = 1;
-                    $stub{$codeGearName}->{static} = 1;
-                    $stub{$codeGearName}->{wrote} = 1;
+                    $stub{$currentCodeGearName}->{static} = 1;
+                    $stub{$currentCodeGearName}->{wrote} = 1;
                     print $fd $_;
                     next;
                 }
@@ -723,10 +723,10 @@
                 #      and passed to the CodeGear
                 #      struct Implementation needs special handling
                 #      __code next(...)   --->   enum Code next
-                $prevCodeGearName = $codeGearName;
-                $dataGearVar{$codeGearName} = [];
-                $outputVar{$codeGearName} = "";
-                $outputArgs{$codeGearName} = {};
+                $prevCodeGearName = $currentCodeGearName;
+                $dataGearVar{$currentCodeGearName} = [];
+                $outputVar{$currentCodeGearName} = "";
+                $outputArgs{$currentCodeGearName} = {};
                 my $newArgs = "struct Context *${context_name},";
                 if ($args=~/^struct Context\s*\*\s*${context_name}/) {
                     $newArgs = "";
@@ -742,7 +742,7 @@
                     if ($args =~ s/^(\s)*\_\_code\s+(\w+)\(([^)]*)\)//) {
                         my $next = $2;
                         my @args = split(/,/,$3);
-                        if (generateStubArgs($codeGearName, $next, "Code", "", $next, $implInterfaceInfo,0) ) {
+                        if (generateStubArgs($currentCodeGearName, $next, "Code", "", $next, $implInterfaceInfo,0) ) {
                             $newArgs .= "enum Code $next";
                         }
                         # analyze continuation arguments
@@ -760,8 +760,8 @@
                                 $typeName = "$structType $typeName";
                             }
                             my $typeField = lcfirst($typeName);
-                            push(@{$outputArgs{$codeGearName}->{$next}}, $varName);
-                            if (generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,1)) {
+                            push(@{$outputArgs{$currentCodeGearName}->{$next}}, $varName);
+                            if (generateStubArgs($currentCodeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,1)) {
                                 $newArgs .= ",$structType $typeName **O_$varName";
                             }
                         }
@@ -775,7 +775,7 @@
                             $typeName = "$structType $typeName";
                         }
                         my $typeField = lcfirst($typeName);
-                        generateStubArgs($codeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,0);
+                        generateStubArgs($currentCodeGearName, $varName, $typeName, $ptrType, $typeField, $implInterfaceInfo,0);
                     } elsif ($args =~ s/(.*,)//) {
                         $newArgs .= $1;
                     } else {
@@ -784,17 +784,17 @@
                     }
                 }
                 # generate goto statement from stub to the CodeGear in the buffer
-                $dataGearName{$codeGearName} .= "\tgoto $codeGearName(${context_name}";
-                for my $arg ( @{$dataGearVar{$codeGearName}}) {
-                    $dataGearName{$codeGearName} .= ", $arg";
+                $dataGearName{$currentCodeGearName} .= "\tgoto $currentCodeGearName(${context_name}";
+                for my $arg ( @{$dataGearVar{$currentCodeGearName}}) {
+                    $dataGearName{$currentCodeGearName} .= ", $arg";
                 }
-                $dataGearName{$codeGearName} .= ");";
+                $dataGearName{$currentCodeGearName} .= ");";
                 # generate CodeGear header with new arguments
-                print $fd "__code $codeGearName($newArgs)$tail\n";
-                if ($outputVar{$codeGearName} ne "") {
+                print $fd "__code $currentCodeGearName($newArgs)$tail\n";
+                if ($outputVar{$currentCodeGearName} ne "") {
                     # output data var can be use before write
                     # it should be initialze by gearef
-                    print $fd $outputVar{$codeGearName};
+                    print $fd $outputVar{$currentCodeGearName};
                 }
                 next;
             } elsif (! $inCode) {
@@ -812,7 +812,7 @@
                 my $method       = $3;
                 my $args         = $4;
 
-                my $currentCodeGearInfo = $filename2EachCodeGearArgs{$filename}->{$codeGearName};
+                my $currentCodeGearInfo = $filename2EachCodeGearArgs{$filename}->{$currentCodeGearName};
                 my $instanceType        = $currentCodeGearInfo->{localVar}->{$instance};
                 my $currentInfo         = $headerNameToInfo->{$instanceType};
                 my $parsedInstanceType  = Gears::Interface->detailed_parse($currentInfo->{path});
@@ -882,8 +882,7 @@
                    method  => $method,
                    tmpArgs => $args,
                 };
-                my ($gen_line, ) = generateInterfaceMeta($_, $codeGearName, $filename, $parsed, \%filename2EachCodeGearArgs, \%localVarType, "${context_name}->task");
-                print $fd $gen_line;
+                print $fd generateInterfaceGearef($_, $currentCodeGearName, $filename, $parsed, \%filename2EachCodeGearArgs, \%localVarType, "${context_name}->task");
 
                 my $putTask = << "EOFEOF";
                 ${prev}element = &ALLOCATE(${context_name}, Element)->Element;
@@ -904,19 +903,20 @@
                    method  => $3,
                    tmpArgs => $4,
                 };
-                my @gen_lines  = generateInterfaceMeta($_, $codeGearName, $filename, $parsed, \%filename2EachCodeGearArgs, \%localVarType, $context_name);
-                print $fd join "\n", @gen_lines;
+                print $fd generateInterfaceGearef($_, $currentCodeGearName, $filename, $parsed, \%filename2EachCodeGearArgs, \%localVarType, $context_name);
+                my $next = "$parsed->{next}->$parsed->{method}";
+                print $fd $parsed->{prev},generateMeta($context_name, $next);
                 next;
             } elsif(/^(.*)par goto (\w+)\((.*)\);/) {
                 debug_print("generateDataGear",__LINE__, $_) if $opt_debug;
                 # handling par goto statement
                 # convert it to the parallel
                 my $prev         = $1;
-                my $codeGearName = $2;
+                my $nextCodeGearName = $2;
                 my $args         = $3;
 
-                my $inputCount = $codeGear{$codeGearName}->{'input'};
-                my $outputCount = $codeGear{$codeGearName}->{'output'};
+                my $inputCount = $codeGear{$nextCodeGearName}->{'input'};
+                my $outputCount = $codeGear{$nextCodeGearName}->{'output'};
                 my @iterateCounts;
                 # parse examples 'par goto(.., iterate(10), exit);'
                 if ($args =~ /iterate\((.*)?\),/) {
@@ -934,7 +934,7 @@
                 my $initTask = << "EOFEOF";
                 ${prev}${context_name}\->task = NEW(struct Context);
                 ${prev}initContext(${context_name}\->task);
-                ${prev}${context_name}\->task->next = C_$codeGearName;
+                ${prev}${context_name}\->task->next = C_$nextCodeGearName;
                 ${prev}${context_name}\->task->idgCount = $inputCount;
                 ${prev}${context_name}\->task->idg = ${context_name}\->task->dataNum;
                 ${prev}${context_name}\->task->maxIdg = ${context_name}\->task->idg + $inputCount;
@@ -984,7 +984,7 @@
                   $arg_context = "kernel";
                 }
 
-                for my $n ( @{$dataGearVar{$codeGearName}} ) {
+                for my $n ( @{$dataGearVar{$currentCodeGearName}} ) {
                     # continuation arguments
                     $v = 1  if ( $n eq $next);
                 }
@@ -998,14 +998,14 @@
                 if ($v || ($implInterfaceInfo->{isImpl} && defined $code{$implInterfaceInfo->{interface}}->{$next})) {
                     # write continuation's arguments into the interface arguments
                     # we may need a commit for a shared DataGear
-                    for my $arg ( @{$outputArgs{$codeGearName}->{$next}} ) {
+                    for my $arg ( @{$outputArgs{$currentCodeGearName}->{$next}} ) {
                         my $v = shift(@args);
                         print $fd "\t*O_$arg = $v;\n";
                     }
                     if ($hasParGoto) {
                         print $fd "${prev}Gearef(${arg_context}, TaskManager)->taskList = ${arg_context}->taskList;\n";
                         print $fd "${prev}Gearef(${arg_context}, TaskManager)->next1 = C_$next;\n";
-                        print $fd "${prev}goto meta(${arg_context}, C_$next);\n";
+                        print $fd ${prev},generateMeta(${arg_context}, "C_$next");
                     } else {
                         print $fd "${prev}goto meta(${arg_context}, $next);\n";
                     }
@@ -1068,7 +1068,7 @@
     }
     if (defined $prevCodeGearName) {
         if (!defined $stub{$prevCodeGearName."_stub"}->{wrote}) {
-            $stub{$prevCodeGearName."_stub"}->{wrote} = &generateStub($fd,$prevCodeGearName,$dataGearName{$codeGearName});
+            $stub{$prevCodeGearName."_stub"}->{wrote} = &generateStub($fd,$prevCodeGearName,$dataGearName{$currentCodeGearName});
         }
     }
 
@@ -1211,7 +1211,7 @@
   print "[$functionName] match $lineNumber : $line";
 }
 
-sub generateInterfaceMeta {
+sub generateInterfaceGearef {
   my ($line, $currentCodeGearName, $filename, $parsed, $filename2args, $localVarType, $context_name) = @_;
 
   my $return_line;
@@ -1328,6 +1328,16 @@
       }
       $i++;
   }
-  my $goto_meta = "${prev}goto meta(${context_name}, $next->$method);\n";
-  return ($return_line, $goto_meta);
+
+  return $return_line;
 }
+#my $goto_meta = "${prev}goto meta(${context_name}, $next->$method);\n";
+
+sub generateMeta {
+  my ($context, $next) = @_;
+  return "goto meta($context, $next);\n";
+}
+
+sub findMetaPM {
+
+}