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); } } }