1 package Analysis.Disjoint;
9 //////////////////////////////////////////////
11 // SMFEState is part of a
12 // (S)tate (M)achine (F)or (E)ffects.
14 // StateMachineForEffects describes an intial
15 // state and the effect transtions a DFJ
16 // traverser should make from the current state
17 // when searching for possible runtime conflicts.
19 //////////////////////////////////////////////
21 public class SMFEState {
23 // #####################
24 // ## NOTE NOTE NOTE!!!!
25 // #####################
26 // When every state corresponds to exactly one
27 // FlatNode (whereDefined attribute) then we can
28 // use the FlatNode's id as an ID. BUT BUT BUT, if
29 // we merge nodes together in the future for
30 // optimizations and whatnot, we need an alternate
31 // system of unique IDs
33 // uniquely identifies this state
35 protected int iHashCode;
37 // all possible effects in this state
38 protected Set<Effect> effects;
40 //TODO Jim! get me the list of conflicts!
41 protected Set<Effect> conflicts;
43 // the given effect allows a transition to a
45 protected Hashtable< Effect, Set<SMFEState> > e2states;
47 // useful for knowing when a state can be inlined during
49 protected int refCount;
53 public SMFEState( FlatNode fnWhereDefined ) {
55 this.id = fnWhereDefined.nodeid;
56 this.iHashCode = fnWhereDefined.hashCode();
58 effects = new HashSet<Effect>();
59 conflicts = new HashSet<Effect>();
60 e2states = new Hashtable< Effect, Set<SMFEState> >();
64 public void addEffect( Effect e ) {
68 // the given effect allows the transition to the new state
69 public void addTransition( Effect effect,
73 Set<SMFEState> states = e2states.get( effect );
74 if( states == null ) {
75 states = new HashSet<SMFEState>();
76 e2states.put( effect, states );
78 states.add( stateTo );
88 // once you get your hands on an SMFEState in the
89 // RuntimeConflictResolver side of things, this is how you
90 // find out what effects are possible in this state
91 public Set<Effect> getEffectsAllowed() {
95 public Set<Effect> getConflicts() {
96 //TODO JIM! Fix this when have a chance!
97 conflicts.addAll(effects);
98 return this.conflicts;
101 public Set<Effect> getTransistionEffects() {
102 return this.e2states.keySet();
105 // some subset of the above effects may transition to
107 public Set<SMFEState> transitionsTo( Effect e ) {
108 Set<SMFEState> statesOut = e2states.get( e );
109 if( statesOut == null ) {
110 statesOut = new HashSet<SMFEState>();
115 public int getRefCount() {
120 public boolean equals( Object o ) {
125 if( !(o instanceof SMFEState) ) {
129 SMFEState state = (SMFEState) o;
131 return id == state.id;
134 public int hashCode() {
139 public String toStringDOT() {
141 // first create the state as a node in DOT graph
142 String s = " "+id+"[shape=box,label=\"";
144 if( effects.size() == 1 ) {
145 s += effects.iterator().next().toString();
147 } else if( effects.size() > 1 ) {
149 Iterator<Effect> eItr = effects.iterator();
150 while( eItr.hasNext() ) {
151 Effect e = eItr.next();
154 if( eItr.hasNext() ) {
162 // then each transition is an edge
163 Iterator<Effect> eItr = e2states.keySet().iterator();
164 while( eItr.hasNext() ) {
165 Effect e = eItr.next();
166 Set<SMFEState> states = e2states.get( e );
168 Iterator<SMFEState> sItr = states.iterator();
169 while( sItr.hasNext() ) {
170 SMFEState state = sItr.next();
174 "[label=\""+e+"\"];";