adding a test case
[IRC.git] / Robust / TransSim / FlexScheduler.java
index 589413e5074e9aa046299686f58e40b74df24eda..1ce1d2d081a0c81d53dab6f8a96a8dfa97906fb4 100644 (file)
@@ -51,6 +51,9 @@ public class FlexScheduler extends Thread {
     }
   }
 
+  int lowid=0;
+  int countlow=0;
+
   Plot p;
   Series serCommit;
   Series serStart;
@@ -91,7 +94,7 @@ public class FlexScheduler extends Thread {
     case ATTACK:
       return new String("ATTACK");
     case SUICIDE:
-      return new String("SUICIDE");
+      return new String("TIMID");
     case TIMESTAMP:
       return new String("TIMESTAMP");
     case LOCK:
@@ -120,6 +123,7 @@ public class FlexScheduler extends Thread {
   int policy;
   boolean[] aborted;
   long shorttesttime;
+  long earliesttime=-1;
   long starttime=-1;
   Hashtable rdobjmap;
   Hashtable wrobjmap;
@@ -158,6 +162,10 @@ public class FlexScheduler extends Thread {
     return commitcount;
   }
 
+  public long getEarliestTime() {
+    return earliesttime-starttime;
+  }
+
   public long getTime() {
     return shorttesttime-starttime;
   }
@@ -311,6 +319,16 @@ public class FlexScheduler extends Thread {
     //ready to commit this one
     long currtime=ev.getTime();
     releaseObjects(trans, ev.getThread(), currtime);
+
+    if (ev.getThread()==lowid) {
+      countlow++;
+      if (countlow==4) {
+       countlow=0;
+       lowid++;
+       if (lowid==e.numThreads())
+         lowid=0;
+      }
+    }
     
     //See if we have been flagged as aborted for the lazy case
     boolean abort=aborted[ev.getThread()];
@@ -400,6 +418,9 @@ public class FlexScheduler extends Thread {
       Event nev=new Event(currtime+nexttrans.getTime(0), nexttrans, 0, ev.getThread(), nexttransnum);
       currentevents[ev.getThread()]=nev;
       eq.add(nev);
+    } else {
+      if (earliesttime==-1)
+       earliesttime=currtime;
     }
   }
 
@@ -418,6 +439,14 @@ public class FlexScheduler extends Thread {
       return conflictset;
   }
 
+
+  int normalize(int tid) {
+    int newtid=tid-lowid;
+    if (newtid<0)
+      newtid+=e.numThreads();
+    return newtid;
+  }
+
   public Set wrConflictSet(int thread, ObjIndex obj) {
     HashSet conflictset=new HashSet();
     if (rdobjmap.containsKey(obj)) {
@@ -602,11 +631,11 @@ public class FlexScheduler extends Thread {
        Integer thread=(Integer)thit.next();
        Event other=currentevents[thread.intValue()];
        int eventnum=other.getEvent();
-       long otid=thread.intValue();
+       long otid=normalize(thread.intValue());
        if (tid>otid)
          tid=otid;
       }
-      if (ev.getThread()>tid) {
+      if (normalize(ev.getThread())>tid) {
        //kill ourself
        timewasted(ev.getThread(), time);
        reschedule(ev.getThread(), time, 0);