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 instanceof StallSiteNode) {
48 StallSiteNode stallSiteNode = (StallSiteNode) node;
49 HashSet<Effect> effectSet = stallSiteNode.getStallSite()
51 for (Iterator iterator = effectSet.iterator(); iterator.hasNext();) {
52 Effect effect = (Effect) iterator.next();
53 if (effect.getEffectType().equals(StallSite.WRITE_EFFECT)) {
58 LiveInNode liveInNode = (LiveInNode) node;
59 Set<SESEEffectsKey> writeEffectSet = liveInNode
60 .getWriteEffectsSet();
61 if (writeEffectSet != null && writeEffectSet.size() > 0) {
71 public boolean hasSelfCoarseEdge(ConflictNode node){
73 HashSet<ConflictEdge> set=node.getEdgeSet();
74 for (Iterator iterator = set.iterator(); iterator.hasNext();) {
75 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
76 if(conflictEdge.getType()!=ConflictEdge.FINE_GRAIN_EDGE&&conflictEdge.getVertexU()==conflictEdge.getVertexV()){
83 private boolean isFineNode(ConflictNode node){
93 public ConflictNode getNewNodeCoarseConnectedWithGroup(ConflictEdge newEdge) {
95 // check whether or not the new node has a fine-grained edges to all
99 if (conflictNodeSet.contains(newEdge.getVertexU())) {
100 newNode = newEdge.getVertexV();
101 } else if(conflictNodeSet.contains(newEdge.getVertexV())) {
102 newNode = newEdge.getVertexU();
108 HashSet<ConflictEdge> edgeSet = newNode.getEdgeSet();
109 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
110 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
111 if (!conflictEdge.getVertexU().equals(newNode)
112 && conflictNodeSet.contains(conflictEdge.getVertexU()) && isFineNode(conflictEdge.getVertexU()) ) {
114 } else if (!conflictEdge.getVertexV().equals(newNode)
115 && conflictNodeSet.contains(conflictEdge.getVertexV()) && isFineNode(conflictEdge.getVertexU()) ) {
120 if (count == conflictNodeSet.size()) {
121 // connected to all current nodes in group
130 public ConflictNode getNewNodeConnectedWithGroup(ConflictEdge newEdge) {
132 // check whether or not the new node has a fine-grained edges to all
135 ConflictNode newNode;
136 if (conflictNodeSet.contains(newEdge.getVertexU())) {
137 newNode = newEdge.getVertexV();
138 } else if(conflictNodeSet.contains(newEdge.getVertexV())){
139 newNode = newEdge.getVertexU();
145 HashSet<ConflictEdge> edgeSet = newNode.getEdgeSet();
146 for (Iterator iterator = edgeSet.iterator(); iterator.hasNext();) {
147 ConflictEdge conflictEdge = (ConflictEdge) iterator.next();
148 if (!conflictEdge.getVertexU().equals(newNode)
149 && conflictNodeSet.contains(conflictEdge.getVertexU())) {
151 } else if (!conflictEdge.getVertexV().equals(newNode)
152 && conflictNodeSet.contains(conflictEdge.getVertexV())) {
157 if (count == conflictNodeSet.size()) {
158 // connected to all current nodes in group
166 public void addEdge(ConflictEdge edge){
167 conflictNodeSet.add(edge.getVertexU());
168 conflictNodeSet.add(edge.getVertexV());
175 public void setID(int id){
179 public boolean containsConflictNode(ConflictNode node){
181 return conflictNodeSet.contains(node);
186 public boolean testEdge(ConflictEdge newEdge){
189 if( !conflictNodeSet.contains(newEdge.getVertexU()) && !conflictNodeSet.contains(newEdge.getVertexV()) ){
193 ConflictNode nodeToAdd=conflictNodeSet.contains(newEdge.getVertexU())?newEdge.getVertexV():newEdge.getVertexU();
195 HashSet<ConflictNode> nodeSet=new HashSet<ConflictNode>(conflictNodeSet);
197 for(Iterator edgeIter=nodeToAdd.getEdgeSet().iterator();edgeIter.hasNext();){
198 ConflictEdge edge=(ConflictEdge)edgeIter.next();
199 if(nodeSet.contains(edge.getVertexU())){
200 nodeSet.remove(edge.getVertexU());
201 }else if(nodeSet.contains(edge.getVertexV())){
202 nodeSet.remove(edge.getVertexV());
206 return nodeSet.isEmpty();
210 public String toString(){
213 for (Iterator<ConflictNode> iterator = conflictNodeSet.iterator(); iterator.hasNext();) {
214 ConflictNode node = (ConflictNode) iterator.next();
215 rtr+=" "+node+"::"+getNodeType(node);