From 985704c0b0e49855096a8c28fc7d8ec823448da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Wed, 8 May 2019 08:58:19 +0200 Subject: [PATCH 01/10] =?UTF-8?q?=09modified:=20=20=20src/main/java/de/dhb?= =?UTF-8?q?wstuttgart/typeinference/typeAlgo/TYPEStmt.java=20Wen=20kein=20?= =?UTF-8?q?Import=20f=C3=BCr=20die=20Addition=20vorhanden=20ist,=20wird=20?= =?UTF-8?q?Fehler=20ausgegeben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index f1332cd4..30d76167 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -229,7 +229,7 @@ public class TYPEStmt implements StatementVisitor{ binary.operation.equals(BinaryExpr.Operator.MUL)|| binary.operation.equals(BinaryExpr.Operator.MOD)|| binary.operation.equals(BinaryExpr.Operator.ADD)|| - binary.operation.equals(BinaryExpr.Operator.SUB)){ + binary.operation.equals(BinaryExpr.Operator.SUB)) { Set> numericAdditionOrStringConcatenation = new HashSet<>(); // TODO PL 2018-11-06 @@ -312,6 +312,9 @@ public class TYPEStmt implements StatementVisitor{ numericAdditionOrStringConcatenation.add(stringConcat); } } + if(numericAdditionOrStringConcatenation.size()<1){ + throw new TypeinferenceException("Kein Typ für " + binary.operation.toString() + " vorhanden", binary.getOffset()); + } constraintsSet.addOderConstraint(numericAdditionOrStringConcatenation); }else if(binary.operation.equals(BinaryExpr.Operator.LESSEQUAL) || binary.operation.equals(BinaryExpr.Operator.BIGGEREQUAL) || @@ -355,6 +358,7 @@ public class TYPEStmt implements StatementVisitor{ //***ACHTUNG: Moeglicherweise oder und und-Contraint falsch */ //Testeise eingefuegt PL 2018-05-24 + //Hier sollte evtl. noch importe angefragt werden PL 2019-05-07 constraintsSet.addUndConstraint(new Pair(binary.lexpr.getType(), number, PairOperator.SMALLERNEQDOT)); constraintsSet.addUndConstraint(new Pair(binary.rexpr.getType(), number, PairOperator.SMALLERNEQDOT)); //Rückgabetyp ist Boolean From bfbce8140943d7b1419b8ae6e5f8b91ececc6fe7 Mon Sep 17 00:00:00 2001 From: "pl@gohorb.ba-horb.de" Date: Fri, 10 May 2019 16:30:55 +0200 Subject: [PATCH 02/10] Abbruch aller Threads eingebaut modified: src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java new file: src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java --- .../de/dhbwstuttgart/core/JavaTXCompiler.java | 10 +-- .../typeinference/unify/TypeUnify.java | 18 ++--- .../typeinference/unify/TypeUnify2Task.java | 8 ++- .../typeinference/unify/TypeUnifyTask.java | 69 +++++++++++++++---- .../typeinference/unify/UnifyTaskModel.java | 18 +++++ 5 files changed, 96 insertions(+), 27 deletions(-) create mode 100644 src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index 9f1d17eb..e24b43d2 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -39,6 +39,7 @@ import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask; import de.dhbwstuttgart.typeinference.unify.UnifyResultListener; import de.dhbwstuttgart.typeinference.unify.UnifyResultListenerImpl; import de.dhbwstuttgart.typeinference.unify.UnifyResultModel; +import de.dhbwstuttgart.typeinference.unify.UnifyTaskModel; import java.io.File; import java.io.FileOutputStream; @@ -58,9 +59,10 @@ import org.apache.commons.io.output.NullOutputStream; public class JavaTXCompiler { final CompilationEnvironment environment; - Boolean resultmodel = false; + Boolean resultmodel = true; public final Map sourceFiles = new HashMap<>(); Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"src/test/java/logFiles" geschrieben werden soll? + volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); /** * Äußerste Liste der Source-Files. @@ -417,7 +419,7 @@ public class JavaTXCompiler { } return ret; }).collect(Collectors.toCollection(ArrayList::new)); - unify.unifyAsync(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm); + unify.unifyAsync(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm, usedTasks); } catch (IOException e) { System.err.println("kein LogFile"); @@ -557,7 +559,7 @@ public class JavaTXCompiler { UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure); UnifyResultListenerImpl li = new UnifyResultListenerImpl(); urm.addUnifyResultListener(li); - unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm); + unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm, usedTasks); System.out.println("RESULT Final: " + li.getResults()); logFile.write("RES_FINAL: " + li.getResults().toString()+"\n"); logFile.flush(); @@ -566,7 +568,7 @@ public class JavaTXCompiler { /* UnifyResultModel End */ else { //Set> result = unify.unify(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure)); - Set> result = unify.unifyOderConstraints(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure)); + Set> result = unify.unifyOderConstraints(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure), usedTasks); System.out.println("RESULT: " + result); logFile.write("RES: " + result.toString()+"\n"); logFile.flush(); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java index ecef0e14..62404b30 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java @@ -3,10 +3,12 @@ package de.dhbwstuttgart.typeinference.unify; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.ForkJoinPool; +import de.dhbwstuttgart.core.JavaTXCompiler; import de.dhbwstuttgart.typeinference.constraints.Constraint; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; import de.dhbwstuttgart.typeinference.constraints.Pair; @@ -26,8 +28,8 @@ public class TypeUnify { * @param cons * @return */ - public Set> unify(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); + public Set> unify(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); Set> res = unifyTask.join(); @@ -52,8 +54,8 @@ public class TypeUnify { * @param ret * @return */ - public UnifyResultModel unifyAsync(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); + public UnifyResultModel unifyAsync(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); return ret; @@ -70,8 +72,8 @@ public class TypeUnify { * @param ret * @return */ - public UnifyResultModel unifyParallel(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); + public UnifyResultModel unifyParallel(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); Set> res = unifyTask.join(); @@ -103,8 +105,8 @@ public class TypeUnify { * @param cons * @return */ - public Set> unifyOderConstraints(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret); + public Set> unifyOderConstraints(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks); Set> res = unifyTask.compute(); try { logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n"); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java index 315c01e7..46af7349 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java @@ -3,6 +3,7 @@ package de.dhbwstuttgart.typeinference.unify; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -17,8 +18,8 @@ public class TypeUnify2Task extends TypeUnifyTask { Set> setToFlatten; - public TypeUnify2Task(Set> setToFlatten, Set eq, List>> oderConstraints, Set nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm) { - super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm); + public TypeUnify2Task(Set> setToFlatten, Set eq, List>> oderConstraints, Set nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) { + super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); this.setToFlatten = setToFlatten; this.nextSetElement = nextSetElement; } @@ -38,6 +39,9 @@ public class TypeUnify2Task extends TypeUnifyTask { return new HashSet<>(); } else */ + if (this.isCancelled()) { + return new HashSet<>(); + } noOfThread--; return res; } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index e11c81bc..36a2bc43 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -122,6 +122,8 @@ public class TypeUnifyTask extends RecursiveTask>> { static Integer noShortendElements = 0; + volatile UnifyTaskModel usedTasks; + public TypeUnifyTask() { rules = new RuleSet(); } @@ -141,7 +143,7 @@ public class TypeUnifyTask extends RecursiveTask>> { */ - public TypeUnifyTask(Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm) { + public TypeUnifyTask(Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) { synchronized (this) { this.eq = eq; //this.oderConstraints = oderConstraints.stream().map(x -> x.stream().map(y -> new HashSet<>(y)).collect(Collectors.toSet(HashSet::new))).collect(Collectors.toList(ArrayList::new)); @@ -178,6 +180,8 @@ public class TypeUnifyTask extends RecursiveTask>> { rules = new RuleSet(logFile); this.rekTiefeField = rekTiefe; this.urm = urm; + this.usedTasks = usedTasks; + this.usedTasks.add(this); } } @@ -228,6 +232,9 @@ public class TypeUnifyTask extends RecursiveTask>> { .filter(x -> x.size()>1) .collect(Collectors.toCollection(ArrayList::new)); Set> res = unify(neweq, remainingOderconstraints, fc, parallel, rekTiefeField, true); + if (this.isCancelled()) { + return new HashSet<>(); + } noOfThread--; try { logFile.close(); @@ -272,6 +279,9 @@ public class TypeUnifyTask extends RecursiveTask>> { /* * Step 1: Repeated application of reduce, adapt, erase, swap */ + if (totalnoOfThread > 10) { + usedTasks.cancel(); + } rekTiefe++; nOfUnify++; writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString()); @@ -430,7 +440,9 @@ public class TypeUnifyTask extends RecursiveTask>> { // .stream().map(x -> new HashSet<>(x)) // .collect(Collectors.toCollection(HashSet::new)); //Muss auskommentiert werden, wenn computeCartesianRecursive ENDE + + Set> eqPrimePrimeSet = new HashSet<>(); Set forks = new HashSet<>(); @@ -540,6 +552,7 @@ public class TypeUnifyTask extends RecursiveTask>> { Set> computeCartesianRecursive(Set> fstElems, ArrayList>> topLevelSets, Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, int rekTiefe, Boolean finalresult) { //ArrayList>> remainingSets = new ArrayList<>(topLevelSets); + fstElems.addAll(topLevelSets.stream() .filter(x -> x.size()==1) .map(y -> y.stream().findFirst().get()) @@ -804,9 +817,14 @@ public class TypeUnifyTask extends RecursiveTask>> { newElemsOrig.add(a); /* FORK ANFANG */ - TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); - forkOrig.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + forkOrig.fork(); + } /* FORK ENDE */ synchronized (this) { @@ -851,9 +869,14 @@ public class TypeUnifyTask extends RecursiveTask>> { Set> newElems = new HashSet<>(elems); List>> newOderConstraints = new ArrayList<>(oderConstraints); newElems.add(nSaL); - TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); - fork.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + fork.fork(); + } } //res = unify2(newElemsOrig, newEqOrig, newOderConstraintsOrig, fc, parallel, rekTiefe); @@ -897,9 +920,14 @@ public class TypeUnifyTask extends RecursiveTask>> { newElemsOrig.add(a); /* FORK ANFANG */ - TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); - forkOrig.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + forkOrig.fork(); + } /* FORK ENDE */ synchronized (this) { @@ -944,9 +972,14 @@ public class TypeUnifyTask extends RecursiveTask>> { Set> newElems = new HashSet<>(elems); List>> newOderConstraints = new ArrayList<>(oderConstraints); newElems.add(nSaL); - TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); - fork.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + fork.fork(); + } } //res = unify2(newElemsOrig, newEqOrig, newOderConstraintsOrig, fc, parallel, rekTiefe); @@ -991,9 +1024,14 @@ public class TypeUnifyTask extends RecursiveTask>> { newElemsOrig.add(a); /* FORK ANFANG */ - TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); - forkOrig.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + forkOrig.fork(); + } /* FORK ENDE */ synchronized (this) { @@ -1007,9 +1045,14 @@ public class TypeUnifyTask extends RecursiveTask>> { Set> newElems = new HashSet<>(elems); List>> newOderConstraints = new ArrayList<>(oderConstraints); newElems.add(nSaL); - TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm); + TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); - fork.fork(); + synchronized(usedTasks) { + if (this.isCancelled()) { + return new HashSet<>(); + } + fork.fork(); + } } //res = unify2(newElemsOrig, newEqOrig, newOderConstraintsOrig, fc, parallel, rekTiefe); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java new file mode 100644 index 00000000..2cc0d7d4 --- /dev/null +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java @@ -0,0 +1,18 @@ +package de.dhbwstuttgart.typeinference.unify; + +import java.util.ArrayList; + +public class UnifyTaskModel { + + ArrayList usedTasks = new ArrayList<>(); + + public void add(TypeUnifyTask t) { + usedTasks.add(t); + } + + public void cancel() { + for(TypeUnifyTask t : usedTasks) { + t.cancel(true); + } + } +} From a149b0c391b5b6f6a4b0135492f3db07b5045343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Fri, 10 May 2019 21:02:24 +0200 Subject: [PATCH 03/10] modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java Eigenen Cancel-Mechanismus implementiert --- .../typeinference/unify/TypeUnify2Task.java | 15 ++++-- .../typeinference/unify/TypeUnifyTask.java | 49 +++++++++++++------ .../typeinference/unify/UnifyTaskModel.java | 2 +- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java index 46af7349..b3884e07 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java @@ -39,12 +39,17 @@ public class TypeUnify2Task extends TypeUnifyTask { return new HashSet<>(); } else */ - if (this.isCancelled()) { - return new HashSet<>(); - } + noOfThread--; - return res; - } + synchronized (usedTasks) { + if (this.myIsCancelled()) { + return new HashSet<>(); + } + else { + return res; + } + } + } public void closeLogFile() { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 36a2bc43..f6bf6a4e 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -122,6 +122,8 @@ public class TypeUnifyTask extends RecursiveTask>> { static Integer noShortendElements = 0; + Boolean myIsCanceled = false; + volatile UnifyTaskModel usedTasks; public TypeUnifyTask() { @@ -170,13 +172,19 @@ public class TypeUnifyTask extends RecursiveTask>> { thNo = totalnoOfThread; writeLog("thNo2 " + thNo); try { - this.logFile = new OutputStreamWriter(new NullOutputStream()); - //new FileWriter(new File(System.getProperty("user.dir")+"/src/test/java/logFiles/"+"Thread_"+thNo)); + this.logFile = //new OutputStreamWriter(new NullOutputStream()); + new FileWriter(new File(System.getProperty("user.dir")+"/src/test/java/logFiles/"+"Thread_"+thNo)); logFile.write(""); } catch (IOException e) { System.err.println("log-File nicht vorhanden"); } + if (thNo > 10) { + System.out.println("cancel"); + usedTasks.cancel(); + writeLog(nOfUnify.toString() + "cancel"); + System.out.println("cancel"); + } rules = new RuleSet(logFile); this.rekTiefeField = rekTiefe; this.urm = urm; @@ -217,6 +225,13 @@ public class TypeUnifyTask extends RecursiveTask>> { } } */ + void myCancel(Boolean b) { + myIsCanceled = true; + } + + public boolean myIsCancelled() { + return myIsCanceled; + } protected Set> compute() { if (one) { @@ -232,9 +247,6 @@ public class TypeUnifyTask extends RecursiveTask>> { .filter(x -> x.size()>1) .collect(Collectors.toCollection(ArrayList::new)); Set> res = unify(neweq, remainingOderconstraints, fc, parallel, rekTiefeField, true); - if (this.isCancelled()) { - return new HashSet<>(); - } noOfThread--; try { logFile.close(); @@ -245,7 +257,16 @@ public class TypeUnifyTask extends RecursiveTask>> { if (isUndefinedPairSetSet(res)) { throw new TypeinferenceException("Unresolved constraints: " + res.toString(), new NullToken()); //return new HashSet<>(); } - else return res; + else { + synchronized (usedTasks) { + if (this.myIsCancelled()) { + return new HashSet<>(); + } + else { + return res; + } + } + } } /* @Override @@ -279,9 +300,7 @@ public class TypeUnifyTask extends RecursiveTask>> { /* * Step 1: Repeated application of reduce, adapt, erase, swap */ - if (totalnoOfThread > 10) { - usedTasks.cancel(); - } + rekTiefe++; nOfUnify++; writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString()); @@ -820,7 +839,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } forkOrig.fork(); @@ -872,7 +891,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } fork.fork(); @@ -923,7 +942,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } forkOrig.fork(); @@ -975,7 +994,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } fork.fork(); @@ -1027,7 +1046,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } forkOrig.fork(); @@ -1048,7 +1067,7 @@ public class TypeUnifyTask extends RecursiveTask>> { TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); forks.add(fork); synchronized(usedTasks) { - if (this.isCancelled()) { + if (this.myIsCancelled()) { return new HashSet<>(); } fork.fork(); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java index 2cc0d7d4..5b70eff8 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java @@ -12,7 +12,7 @@ public class UnifyTaskModel { public void cancel() { for(TypeUnifyTask t : usedTasks) { - t.cancel(true); + t.myCancel(true); } } } From d14406e47442e6201a27e2db20e09268856bf493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Fri, 10 May 2019 21:23:28 +0200 Subject: [PATCH 04/10] modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: ../../resources/bytecode/javFiles/MatrixOP.jav --- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 2 ++ src/test/resources/bytecode/javFiles/MatrixOP.jav | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index f6bf6a4e..be9471c0 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -179,12 +179,14 @@ public class TypeUnifyTask extends RecursiveTask>> { catch (IOException e) { System.err.println("log-File nicht vorhanden"); } + /* Abbruchtest if (thNo > 10) { System.out.println("cancel"); usedTasks.cancel(); writeLog(nOfUnify.toString() + "cancel"); System.out.println("cancel"); } + */ rules = new RuleSet(logFile); this.rekTiefeField = rekTiefe; this.urm = urm; diff --git a/src/test/resources/bytecode/javFiles/MatrixOP.jav b/src/test/resources/bytecode/javFiles/MatrixOP.jav index 52c3fe96..21d37347 100644 --- a/src/test/resources/bytecode/javFiles/MatrixOP.jav +++ b/src/test/resources/bytecode/javFiles/MatrixOP.jav @@ -1,6 +1,6 @@ import java.util.Vector; import java.lang.Integer; -import java.lang.Byte; +//import java.lang.Byte; import java.lang.Boolean; public class MatrixOP extends Vector> { From c3c0a11572b7d9798adc6d153f882bc53d3e6649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Sun, 12 May 2019 19:15:26 +0200 Subject: [PATCH 05/10] Debugabfrage entfernt, die Exception ausgeloest hat modified: src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java Methoden synchronized gemacht --- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 5 +---- .../de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index be9471c0..975ff37c 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -179,7 +179,7 @@ public class TypeUnifyTask extends RecursiveTask>> { catch (IOException e) { System.err.println("log-File nicht vorhanden"); } - /* Abbruchtest + /*Abbruchtest if (thNo > 10) { System.out.println("cancel"); usedTasks.cancel(); @@ -1110,9 +1110,6 @@ public class TypeUnifyTask extends RecursiveTask>> { if (!isUndefinedPairSetSet(res) && isUndefinedPairSetSet(result)) { //wenn korrektes Ergebnis gefunden alle Fehlerfaelle loeschen result = res; - if (res.iterator().next() instanceof WildcardType) { - System.out.println(""); - } } else { if ((isUndefinedPairSetSet(res) && isUndefinedPairSetSet(result)) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java index 5b70eff8..e60054f0 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java @@ -6,11 +6,11 @@ public class UnifyTaskModel { ArrayList usedTasks = new ArrayList<>(); - public void add(TypeUnifyTask t) { + public synchronized void add(TypeUnifyTask t) { usedTasks.add(t); } - public void cancel() { + public synchronized void cancel() { for(TypeUnifyTask t : usedTasks) { t.myCancel(true); } From 1ef228a0454477e2cdc682cfda45d43d009179e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Sun, 12 May 2019 19:54:30 +0200 Subject: [PATCH 06/10] modified: ../../../main/java/de/dhbwstuttgart/core/JavaTXCompiler.java public volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); auf publich gesetzt --- src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index e24b43d2..890da346 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -62,7 +62,7 @@ public class JavaTXCompiler { Boolean resultmodel = true; public final Map sourceFiles = new HashMap<>(); Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"src/test/java/logFiles" geschrieben werden soll? - volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); + public volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); /** * Äußerste Liste der Source-Files. From 4602e95f094a4619644d5f493e0bb1a2bc694609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Sun, 12 May 2019 20:00:03 +0200 Subject: [PATCH 07/10] modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java --- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 975ff37c..b5932247 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -1137,8 +1137,8 @@ public class TypeUnifyTask extends RecursiveTask>> { //Alle Variablen bestimmen die nicht hinzugefügt wurden in a_last //System.out.println(a_last); + try {//PL eingefuegt 2019-05-12 da bei map mmer wieder Nullpointer kamen a_last.forEach(x -> {writeLog("a_last_elem:" + x + " basepair: " + x.getBasePair());}); - try {//PL eingefuegt 2019-03-06 da bei map mmer wieder Nullpointer kamen List varsLast_a = a_last.stream().filter(x -> ((x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName()) && (x.getLhsType() instanceof PlaceholderType) && (x.getBasePair().getLhsType() instanceof PlaceholderType)) From f210dd3c252da0ceaafaa4d7b9fecde1e284b2b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Mon, 13 May 2019 11:11:47 +0200 Subject: [PATCH 08/10] modified: ../../../main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java try der Nullpointer-Exception erweitert. --- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index b5932247..f13a2501 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -1137,8 +1137,9 @@ public class TypeUnifyTask extends RecursiveTask>> { //Alle Variablen bestimmen die nicht hinzugefügt wurden in a_last //System.out.println(a_last); - try {//PL eingefuegt 2019-05-12 da bei map mmer wieder Nullpointer kamen - a_last.forEach(x -> {writeLog("a_last_elem:" + x + " basepair: " + x.getBasePair());}); + + try {//PL eingefuegt 2019-03-06 da bei map mmer wieder Nullpointer kamen + a_last.forEach(x -> {writeLog("a_last_elem:" + x + " basepair: " + x.getBasePair());});//PL 2019-05-13 ins try hinzugefuegt Nullpointer-Exception ist in der Zeile aufgetaucht. List varsLast_a = a_last.stream().filter(x -> ((x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName()) && (x.getLhsType() instanceof PlaceholderType) && (x.getBasePair().getLhsType() instanceof PlaceholderType)) From bd0517ae29c88cfbe3cf7d859989d73da5d3e865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Tue, 14 May 2019 19:54:51 +0200 Subject: [PATCH 09/10] modified: src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java modified: src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java log-File in anderen Pfad modified: src/main/java/de/dhbwstuttgart/typeinference/unify/model/UnifyPair.java substitutions gekapselt --- src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java | 2 +- .../de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java | 2 +- .../dhbwstuttgart/typeinference/unify/model/UnifyPair.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index 890da346..ddf7d642 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -440,7 +440,7 @@ public class JavaTXCompiler { Set> results = new HashSet<>(); try { Writer logFile = //new OutputStreamWriter(new NullOutputStream()); - new FileWriter(new File(System.getProperty("user.dir")+"/src/test/java/logFiles/"+"log_"+sourceFiles.keySet().iterator().next().getName())); + new FileWriter(new File(System.getProperty("user.dir")+"/src/test/resources/logFiles/"+"log_"+sourceFiles.keySet().iterator().next().getName())); IFiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses,logFile); System.out.println(finiteClosure); ConstraintSet unifyCons = UnifyTypeFactory.convert(cons); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index f13a2501..21b91e5a 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -173,7 +173,7 @@ public class TypeUnifyTask extends RecursiveTask>> { writeLog("thNo2 " + thNo); try { this.logFile = //new OutputStreamWriter(new NullOutputStream()); - new FileWriter(new File(System.getProperty("user.dir")+"/src/test/java/logFiles/"+"Thread_"+thNo)); + new FileWriter(new File(System.getProperty("user.dir")+"/src/test/resources/logFiles/"+"Thread_"+thNo)); logFile.write(""); } catch (IOException e) { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/UnifyPair.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/UnifyPair.java index 7cb1347a..222e7308 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/model/UnifyPair.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/model/UnifyPair.java @@ -137,7 +137,7 @@ public class UnifyPair { undefinedPair = true; } public Set getSubstitution() { - return substitution; + return new HashSet<>(substitution); } public UnifyPair getBasePair() { @@ -149,9 +149,9 @@ public class UnifyPair { public Set getAllSubstitutions () { Set ret = new HashSet<>(); - ret.addAll(getSubstitution()); + ret.addAll(new ArrayList<>(getSubstitution())); if (basePair != null) { - ret.addAll(basePair.getAllSubstitutions()); + ret.addAll(new ArrayList<>(basePair.getAllSubstitutions())); } return ret; } From 212144db86de6bbb0b4e0d6e740ad79f6538230f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Tue, 14 May 2019 20:30:32 +0200 Subject: [PATCH 10/10] renamed: test/java/bytecode/FunOLTest.java -> test/java/bytecode/OLFunTest.java new file: test/resources/bytecode/javFiles/OLFun.jav --- .../bytecode/{FunOLTest.java => OLFunTest.java} | 6 +++--- src/test/resources/bytecode/javFiles/OLFun.jav | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) rename src/test/java/bytecode/{FunOLTest.java => OLFunTest.java} (94%) create mode 100644 src/test/resources/bytecode/javFiles/OLFun.jav diff --git a/src/test/java/bytecode/FunOLTest.java b/src/test/java/bytecode/OLFunTest.java similarity index 94% rename from src/test/java/bytecode/FunOLTest.java rename to src/test/java/bytecode/OLFunTest.java index e46f074a..1277cdde 100644 --- a/src/test/java/bytecode/FunOLTest.java +++ b/src/test/java/bytecode/OLFunTest.java @@ -12,7 +12,7 @@ import org.junit.Test; import de.dhbwstuttgart.core.JavaTXCompiler; -public class FunOLTest { +public class OLFunTest { private static String path; private static File fileToTest; private static JavaTXCompiler compiler; @@ -23,13 +23,13 @@ public class FunOLTest { @Test public void generateBC() throws Exception { - path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/FunOL.jav"; + path = System.getProperty("user.dir")+"/src/test/resources/bytecode/javFiles/OLFun.jav"; fileToTest = new File(path); compiler = new JavaTXCompiler(fileToTest); compiler.generateBytecode(System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/"); pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/"; loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)}); - classToTest = loader.loadClass("FunOL"); + classToTest = loader.loadClass("OLFun"); /* instanceOfClass = classToTest.getDeclaredConstructor().newInstance(); diff --git a/src/test/resources/bytecode/javFiles/OLFun.jav b/src/test/resources/bytecode/javFiles/OLFun.jav new file mode 100644 index 00000000..e780a06f --- /dev/null +++ b/src/test/resources/bytecode/javFiles/OLFun.jav @@ -0,0 +1,17 @@ +import java.lang.String; +import java.lang.Integer; +import java.lang.Double; +import java.util.Vector; +import java.lang.Boolean; + + + + +public class OLFun { + + //f = x -> {return x + x;}; + + m(f, x) { + x = f.apply(x+x); + } +} \ No newline at end of file