Skip to content

Commit

Permalink
Fix bug: result is not deep cloned while add it to tunnel
Browse files Browse the repository at this point in the history
  • Loading branch information
quancs committed Sep 7, 2018
1 parent cf376e8 commit 248e616
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 20 deletions.
4 changes: 2 additions & 2 deletions src/upsimulator/core/PMembrane.java
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ private PriorityCondition getPriorityCondition(Rule rule) {
if (trueTimes > 0) {
fetchedRules.put(rule, trueTimes);
for (Result result : rule.getResults()) {
result.selectTunnel(this).holdResult(result, trueTimes);
result.selectTunnel(this).holdResult(result.deepClone(), trueTimes);
}
}
}
Expand All @@ -339,7 +339,7 @@ private PriorityCondition getPriorityCondition(Rule rule) {
if (fetched > 0) {
addFetched(first, fetched);
for (Result result : first.getResults())
result.selectTunnel(this).holdResult(result, fetched);
result.selectTunnel(this).holdResult(result.deepClone(), fetched);

if (fetched == readyToFetch && readyToFetch < times) {// can fetch more
rules.add(first);
Expand Down
30 changes: 14 additions & 16 deletions src/upsimulator/core/PTunnel.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

Expand All @@ -28,22 +29,19 @@ public class PTunnel implements Tunnel {
private boolean isOpen;
private TunnelType type;
private HashMap<Result, Integer> heldResults;
private ArrayList<DelayedResult> delayedResults;
private ArrayList<Integer> delayedResultTimes;
private HashMap<DelayedResult, Integer> delayedResults;

public PTunnel(TunnelType type) {
heldResults = new HashMap<>();
delayedResults = new ArrayList<>();
delayedResultTimes = new ArrayList<>();
delayedResults = new HashMap<>();
targets = new ArrayList<Membrane>();
this.type = type;
open();
}

public PTunnel() {
heldResults = new HashMap<>();
delayedResults = new ArrayList<>();
delayedResultTimes = new ArrayList<>();
delayedResults = new HashMap<>();
targets = new ArrayList<Membrane>();
this.type = TunnelType.Here;
open();
Expand Down Expand Up @@ -96,8 +94,10 @@ public int compare(Membrane o1, Membrane o2) {
@Override
public void holdResult(Result result, int times) {
if (result instanceof DelayedResult && ((DelayedResult) result).getDelay() > 0) {
delayedResults.add((DelayedResult) result);
delayedResultTimes.add(times);
if (delayedResults.containsKey(result)) {
delayedResults.put((DelayedResult) result, delayedResults.get(result) + times);
} else
delayedResults.put((DelayedResult) result, times);
} else if (heldResults.containsKey(result)) {
heldResults.put(result, heldResults.get(result) + times);
} else
Expand Down Expand Up @@ -172,14 +172,12 @@ public void pushResult() {
}

heldResults.clear();
for (int i = delayedResults.size() - 1; i >= 0; i--) {
DelayedResult result = delayedResults.get(i);
if (result.getDelay() == 0) {
holdResult(result, delayedResultTimes.get(i));
delayedResults.remove(i);
delayedResultTimes.remove(i);
} else {
result.reduceDelay();
for (Iterator<Map.Entry<DelayedResult, Integer>> it = delayedResults.entrySet().iterator(); it.hasNext();) {
Map.Entry<DelayedResult, Integer> item = it.next();
item.getKey().reduceDelay();
if (item.getKey().getDelay() == 0) {
heldResults.put(item.getKey(), item.getValue());
it.remove();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/upsimulator/rules/results/MembraneStatusResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public MembraneStatusResult(String value) {

@Override
public MembraneStatusResult deepClone() {
return (MembraneStatusResult) super.deepClone();
return this;
}

@Override
Expand Down
5 changes: 4 additions & 1 deletion src/upsimulator/rules/results/ObjectResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,10 @@ public String toString() {

@Override
public ObjectResult deepClone() {
return new ObjectResult(this);
if (isFixed())
return this;
else
return new ObjectResult(this);
}

@Override
Expand Down

0 comments on commit 248e616

Please sign in to comment.