1 package Analysis.OoOJava;
3 import java.util.HashMap;
4 import java.util.HashSet;
5 import java.util.Iterator;
8 public class SESELock {
10 private HashSet<ConflictNode> conflictNodeSet;
11 private HashSet<ConflictEdge> conflictEdgeSet;
12 private HashMap<ConflictNode, Integer> nodeTypeMap;
16 conflictNodeSet = new HashSet<ConflictNode>();
17 conflictEdgeSet = new HashSet<ConflictEdge>();
18 nodeTypeMap = new HashMap<ConflictNode, Integer>();
21 public void addConflictNode(ConflictNode node, int type) {
22 conflictNodeSet.add(node);
23 setNodeType(node, type);
26 public void setNodeType(ConflictNode node, int type) {
27 nodeTypeMap.put(node, new Integer(type));
30 public int getNodeType(ConflictNode node) {
31 return nodeTypeMap.get(node).intValue();
34 public void addConflictEdge(ConflictEdge e) {
35 conflictEdgeSet.add(e);
38 public boolean containsConflictEdge(ConflictEdge e) {
39 return conflictEdgeSet.contains(e);
42 public HashSet<ConflictNode> getConflictNodeSet() {
43 return conflictNodeSet;
46 public boolean isWriteNode(ConflictNode node) {
47 if (node.getWriteEffectSet().isEmpty()) {
54 public boolean hasSelfCoarseEdge(ConflictNode node) {
56 Set<ConflictEdge> set = node.getEdgeSet();
57 for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
58 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
60 if (conflictEdge.isCoarseEdge() && conflictEdge.getVertexU() == conflictEdge.getVertexV()) {
67 public boolean hasSelfEdge(ConflictNode node) {
69 Set<ConflictEdge> set = node.getEdgeSet();
70 for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
71 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
73 if ((!conflictEdge.isCoarseEdge()) && conflictEdge.getVertexU() == conflictEdge.getVertexV()) {
80 public boolean hasCoarseEdgeWithParentCoarse(ConflictNode node) {
82 Set<ConflictEdge> set = node.getEdgeSet();
83 for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
84 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
87 if (conflictEdge.getVertexU() == node) {
88 cNode = conflictEdge.getVertexV();
90 cNode = conflictEdge.getVertexU();
92 Integer cNodeTypeIn = nodeTypeMap.get(cNode);
93 if (cNodeTypeIn != null && cNodeTypeIn.intValue() == ConflictNode.PARENT_COARSE) {
100 public ConflictNode getNewNodeConnectedWithGroup(ConflictEdge newEdge) {
102 // check whether or not the new node has a fine-grained edges to all
105 ConflictNode newNode;
106 if (conflictNodeSet.contains(newEdge.getVertexU())) {
107 newNode = newEdge.getVertexV();
108 } else if (conflictNodeSet.contains(newEdge.getVertexV())) {
109 newNode = newEdge.getVertexU();
116 Set<ConflictEdge> edgeSet = newNode.getEdgeSet();
117 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext(); ) {
118 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
119 if (!conflictEdge.getVertexU().equals(newNode)
120 && conflictNodeSet.contains(conflictEdge.getVertexU())) {
122 } else if (!conflictEdge.getVertexV().equals(newNode)
123 && conflictNodeSet.contains(conflictEdge.getVertexV())) {
128 if(conflictNodeSet.contains(newNode)) {
132 if(isWriteNode(newNode)) {
133 if (count == conflictNodeSet.size()) {
134 // connected to all current nodes in group
139 int writeNodeCount=0;
140 for (Iterator iterator = conflictNodeSet.iterator(); iterator.hasNext(); ) {
141 ConflictNode node = (ConflictNode) iterator.next();
142 if(isWriteNode(node)) {
146 if (count == writeNodeCount) {
147 // connected to all current write nodes in group
156 public void addEdge(ConflictEdge edge) {
157 conflictNodeSet.add(edge.getVertexU());
158 conflictNodeSet.add(edge.getVertexV());
165 public void setID(int id) {
169 public boolean containsConflictNode(ConflictNode node) {
171 return conflictNodeSet.contains(node);
175 public boolean testEdge(ConflictEdge newEdge) {
177 if (!conflictNodeSet.contains(newEdge.getVertexU())
178 && !conflictNodeSet.contains(newEdge.getVertexV())) {
182 ConflictNode nodeToAdd = conflictNodeSet.contains(newEdge.getVertexU())?newEdge.getVertexV()
183 :newEdge.getVertexU();
185 HashSet<ConflictNode> nodeSet = new HashSet<ConflictNode>(conflictNodeSet);
187 for (Iterator edgeIter = nodeToAdd.getEdgeSet().iterator(); edgeIter.hasNext(); ) {
188 ConflictEdge edge = (ConflictEdge) edgeIter.next();
189 if (nodeSet.contains(edge.getVertexU())) {
190 nodeSet.remove(edge.getVertexU());
191 } else if (nodeSet.contains(edge.getVertexV())) {
192 nodeSet.remove(edge.getVertexV());
196 return nodeSet.isEmpty();
200 public String toString() {
203 for (Iterator<ConflictNode> iterator = conflictNodeSet.iterator(); iterator.hasNext(); ) {
204 ConflictNode node = (ConflictNode) iterator.next();
205 rtr += " " + node + "::" + getNodeType(node);